get-db9 0.1.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 ADDED
@@ -0,0 +1,151 @@
1
+ # get-db9
2
+
3
+ TypeScript SDK for [pg-tikv](https://github.com/pgtikv/pg-tikv) — instant PostgreSQL-compatible databases on TiKV.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install get-db9
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### One-liner: Get a database instantly
14
+
15
+ ```typescript
16
+ import { instantDatabase } from 'get-db9';
17
+
18
+ const db = await instantDatabase();
19
+ console.log(db.connectionString);
20
+ // postgresql://tenant.admin:password@host:5433/postgres
21
+ ```
22
+
23
+ ### With seeding
24
+
25
+ ```typescript
26
+ const db = await instantDatabase({
27
+ name: 'myapp',
28
+ seed: 'CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)',
29
+ });
30
+ ```
31
+
32
+ ## Customer API
33
+
34
+ Full typed client for the Customer API (register, databases, SQL, migrations).
35
+
36
+ ```typescript
37
+ import { createCustomerClient } from 'get-db9/customer';
38
+
39
+ const client = createCustomerClient({ token: 'your-token' });
40
+
41
+ // Create a database
42
+ const db = await client.databases.create({ name: 'myapp' });
43
+
44
+ // Execute SQL
45
+ const result = await client.databases.sql(db.id, 'SELECT * FROM users');
46
+ console.log(result.columns, result.rows);
47
+
48
+ // Schema inspection
49
+ const schema = await client.databases.schema(db.id);
50
+
51
+ // Migrations
52
+ await client.databases.applyMigration(db.id, {
53
+ name: 'add_users',
54
+ sql: 'CREATE TABLE users (id SERIAL PRIMARY KEY)',
55
+ checksum: 'abc123',
56
+ });
57
+ ```
58
+
59
+ ## Admin API
60
+
61
+ Full typed client for the Admin API (tenant management, batch operations, audit).
62
+
63
+ ```typescript
64
+ import { createAdminClient } from 'get-db9/admin';
65
+
66
+ const admin = createAdminClient({ apiKey: 'your-api-key' });
67
+
68
+ // List tenants
69
+ const { items } = await admin.tenants.list({ state: 'ACTIVE' });
70
+
71
+ // Create tenant
72
+ const tenant = await admin.tenants.create();
73
+ console.log(tenant.connection_string);
74
+
75
+ // Batch operations
76
+ const batch = await admin.tenants.batchCreate({ count: 5 });
77
+ ```
78
+
79
+ ## Configuration
80
+
81
+ ### instantDatabase options
82
+
83
+ | Option | Type | Default | Description |
84
+ |--------|------|---------|-------------|
85
+ | `name` | `string` | `'default'` | Database name |
86
+ | `baseUrl` | `string` | Production URL | API endpoint |
87
+ | `fetch` | `FetchFn` | `globalThis.fetch` | Custom fetch |
88
+ | `credentialStore` | `CredentialStore` | `FileCredentialStore` | Credential storage |
89
+ | `seed` | `string` | — | SQL to run after creation |
90
+ | `seedFile` | `string` | — | SQL file content to run |
91
+
92
+ ### Customer client options
93
+
94
+ | Option | Type | Default | Description |
95
+ |--------|------|---------|-------------|
96
+ | `baseUrl` | `string` | Production URL | API endpoint |
97
+ | `token` | `string` | — | Bearer token |
98
+ | `fetch` | `FetchFn` | `globalThis.fetch` | Custom fetch |
99
+ | `credentialStore` | `CredentialStore` | — | Auto-load token |
100
+
101
+ ### Admin client options
102
+
103
+ | Option | Type | Default | Description |
104
+ |--------|------|---------|-------------|
105
+ | `baseUrl` | `string` | Production URL | API endpoint |
106
+ | `apiKey` | `string` | — | X-API-Key header |
107
+ | `fetch` | `FetchFn` | `globalThis.fetch` | Custom fetch |
108
+
109
+ ## Error Handling
110
+
111
+ ```typescript
112
+ import { Db9Error, Db9AuthError, Db9NotFoundError } from 'get-db9';
113
+
114
+ try {
115
+ await client.databases.get('nonexistent');
116
+ } catch (err) {
117
+ if (err instanceof Db9NotFoundError) {
118
+ console.log('Database not found');
119
+ } else if (err instanceof Db9AuthError) {
120
+ console.log('Authentication failed');
121
+ } else if (err instanceof Db9Error) {
122
+ console.log(`API error ${err.statusCode}: ${err.message}`);
123
+ }
124
+ }
125
+ ```
126
+
127
+ ## Credential Storage
128
+
129
+ Credentials are stored in `~/.db9/credentials` (TOML format), shared with the db9 CLI.
130
+
131
+ ```typescript
132
+ import { FileCredentialStore, MemoryCredentialStore } from 'get-db9';
133
+
134
+ // File-based (default, shared with CLI)
135
+ const fileStore = new FileCredentialStore();
136
+
137
+ // Custom path
138
+ const customStore = new FileCredentialStore('/path/to/credentials');
139
+
140
+ // In-memory (for testing or serverless)
141
+ const memStore = new MemoryCredentialStore();
142
+ ```
143
+
144
+ ## Requirements
145
+
146
+ - Node.js >= 18 (native fetch)
147
+ - TypeScript >= 5.0 (for type exports)
148
+
149
+ ## License
150
+
151
+ Apache-2.0
package/dist/admin.cjs ADDED
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/admin.ts
21
+ var admin_exports = {};
22
+ __export(admin_exports, {
23
+ createAdminClient: () => createAdminClient
24
+ });
25
+ module.exports = __toCommonJS(admin_exports);
26
+
27
+ // src/errors.ts
28
+ var Db9Error = class _Db9Error extends Error {
29
+ statusCode;
30
+ response;
31
+ constructor(message, statusCode, response) {
32
+ super(message);
33
+ this.name = "Db9Error";
34
+ this.statusCode = statusCode;
35
+ this.response = response;
36
+ }
37
+ static async fromResponse(response) {
38
+ let message;
39
+ try {
40
+ const body = await response.json();
41
+ message = body.message || response.statusText;
42
+ } catch {
43
+ message = response.statusText;
44
+ }
45
+ switch (response.status) {
46
+ case 401:
47
+ return new Db9AuthError(message, response);
48
+ case 404:
49
+ return new Db9NotFoundError(message, response);
50
+ case 409:
51
+ return new Db9ConflictError(message, response);
52
+ default:
53
+ return new _Db9Error(message, response.status, response);
54
+ }
55
+ }
56
+ };
57
+ var Db9AuthError = class extends Db9Error {
58
+ constructor(message, response) {
59
+ super(message, 401, response);
60
+ this.name = "Db9AuthError";
61
+ }
62
+ };
63
+ var Db9NotFoundError = class extends Db9Error {
64
+ constructor(message, response) {
65
+ super(message, 404, response);
66
+ this.name = "Db9NotFoundError";
67
+ }
68
+ };
69
+ var Db9ConflictError = class extends Db9Error {
70
+ constructor(message, response) {
71
+ super(message, 409, response);
72
+ this.name = "Db9ConflictError";
73
+ }
74
+ };
75
+
76
+ // src/http.ts
77
+ function createHttpClient(options) {
78
+ const fetchFn = options.fetch ?? globalThis.fetch;
79
+ const baseUrl = options.baseUrl.replace(/\/$/, "");
80
+ async function request(method, path, body, params) {
81
+ let url = `${baseUrl}${path}`;
82
+ if (params) {
83
+ const searchParams = new URLSearchParams();
84
+ for (const [key, value] of Object.entries(params)) {
85
+ if (value !== void 0) {
86
+ searchParams.set(key, value);
87
+ }
88
+ }
89
+ const qs = searchParams.toString();
90
+ if (qs) url += `?${qs}`;
91
+ }
92
+ const headers = {
93
+ "Content-Type": "application/json",
94
+ ...options.headers
95
+ };
96
+ const init = { method, headers };
97
+ if (body !== void 0) {
98
+ init.body = JSON.stringify(body);
99
+ }
100
+ const response = await fetchFn(url, init);
101
+ if (!response.ok) {
102
+ throw await Db9Error.fromResponse(response);
103
+ }
104
+ if (response.status === 204) {
105
+ return void 0;
106
+ }
107
+ return response.json();
108
+ }
109
+ return {
110
+ get: (path, params) => request("GET", path, void 0, params),
111
+ post: (path, body) => request("POST", path, body),
112
+ put: (path, body) => request("PUT", path, body),
113
+ del: (path) => request("DELETE", path)
114
+ };
115
+ }
116
+
117
+ // src/admin.ts
118
+ function createAdminClient(options = {}) {
119
+ const baseUrl = options.baseUrl ?? "https://db9.shared.aws.tidbcloud.com/api";
120
+ const headers = {};
121
+ if (options.apiKey) {
122
+ headers["X-API-Key"] = options.apiKey;
123
+ }
124
+ const client = createHttpClient({
125
+ baseUrl,
126
+ fetch: options.fetch,
127
+ headers
128
+ });
129
+ return {
130
+ tenants: {
131
+ list: (params) => {
132
+ const queryParams = {};
133
+ if (params) {
134
+ if (params.page !== void 0)
135
+ queryParams.page = String(params.page);
136
+ if (params.size !== void 0)
137
+ queryParams.size = String(params.size);
138
+ if (params.state !== void 0) queryParams.state = params.state;
139
+ if (params.q !== void 0) queryParams.q = params.q;
140
+ if (params.cursor !== void 0) queryParams.cursor = params.cursor;
141
+ if (params.tag !== void 0) queryParams.tag = params.tag;
142
+ }
143
+ return client.get("/tenants", queryParams);
144
+ },
145
+ create: (req) => client.post("/tenants", req),
146
+ get: (tenantId) => client.get(`/tenants/${tenantId}`),
147
+ update: (tenantId, req) => client.put(`/tenants/${tenantId}`, req),
148
+ delete: (tenantId) => client.del(`/tenants/${tenantId}`),
149
+ remove: (tenantId) => client.post(`/tenants/${tenantId}/remove`),
150
+ batchCreate: (req) => client.post("/tenants/batch", req),
151
+ batchDelete: (req) => client.post("/tenants/batch/delete", req),
152
+ batchUpdate: (req) => client.put("/tenants/batch", req),
153
+ connect: (tenantId, req) => client.post(
154
+ `/tenants/${tenantId}/connect`,
155
+ req
156
+ ),
157
+ // query() needs X-Tenant-Session header — create a one-off client
158
+ query: async (tenantId, sessionId, req) => {
159
+ const sessionClient = createHttpClient({
160
+ baseUrl,
161
+ fetch: options.fetch,
162
+ headers: {
163
+ ...headers,
164
+ "X-Tenant-Session": sessionId
165
+ }
166
+ });
167
+ return sessionClient.post(
168
+ `/tenants/${tenantId}/query`,
169
+ req
170
+ );
171
+ }
172
+ },
173
+ system: {
174
+ health: () => client.get("/health"),
175
+ info: () => client.get("/info")
176
+ },
177
+ users: {
178
+ list: async (tenantId, sessionId) => {
179
+ const sessionClient = createHttpClient({
180
+ baseUrl,
181
+ fetch: options.fetch,
182
+ headers: {
183
+ ...headers,
184
+ "X-Tenant-Session": sessionId
185
+ }
186
+ });
187
+ return sessionClient.get(
188
+ `/tenants/${tenantId}/users`
189
+ );
190
+ },
191
+ create: async (tenantId, sessionId, req) => {
192
+ const sessionClient = createHttpClient({
193
+ baseUrl,
194
+ fetch: options.fetch,
195
+ headers: {
196
+ ...headers,
197
+ "X-Tenant-Session": sessionId
198
+ }
199
+ });
200
+ return sessionClient.post(
201
+ `/tenants/${tenantId}/users`,
202
+ req
203
+ );
204
+ },
205
+ delete: async (tenantId, sessionId, username) => {
206
+ const sessionClient = createHttpClient({
207
+ baseUrl,
208
+ fetch: options.fetch,
209
+ headers: {
210
+ ...headers,
211
+ "X-Tenant-Session": sessionId
212
+ }
213
+ });
214
+ return sessionClient.del(
215
+ `/tenants/${tenantId}/users/${username}`
216
+ );
217
+ },
218
+ resetPassword: async (tenantId, sessionId, username) => {
219
+ const sessionClient = createHttpClient({
220
+ baseUrl,
221
+ fetch: options.fetch,
222
+ headers: {
223
+ ...headers,
224
+ "X-Tenant-Session": sessionId
225
+ }
226
+ });
227
+ return sessionClient.post(
228
+ `/tenants/${tenantId}/users/${username}/password`
229
+ );
230
+ }
231
+ },
232
+ observability: {
233
+ get: (tenantId) => client.get(
234
+ `/tenants/${tenantId}/observability`
235
+ ),
236
+ bootstrap: (tenantId, req) => client.post(
237
+ `/tenants/${tenantId}/observability/bootstrap`,
238
+ req
239
+ )
240
+ },
241
+ audit: {
242
+ list: (params) => {
243
+ const queryParams = {};
244
+ if (params) {
245
+ if (params.tenant_id !== void 0)
246
+ queryParams.tenant_id = params.tenant_id;
247
+ if (params.operation_type !== void 0)
248
+ queryParams.operation_type = params.operation_type;
249
+ if (params.resource_type !== void 0)
250
+ queryParams.resource_type = params.resource_type;
251
+ if (params.success !== void 0)
252
+ queryParams.success = String(params.success);
253
+ if (params.limit !== void 0)
254
+ queryParams.limit = String(params.limit);
255
+ if (params.offset !== void 0)
256
+ queryParams.offset = String(params.offset);
257
+ }
258
+ return client.get("/audit-logs", queryParams);
259
+ }
260
+ }
261
+ };
262
+ }
263
+ // Annotate the CommonJS export names for ESM import in node:
264
+ 0 && (module.exports = {
265
+ createAdminClient
266
+ });
267
+ //# sourceMappingURL=admin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/admin.ts","../src/errors.ts","../src/http.ts"],"sourcesContent":["import { createHttpClient, type FetchFn } from './http';\nimport type {\n CreateTenantRequest,\n CreateTenantResponse,\n TenantResponse,\n TenantListResponse,\n TenantUpdateRequest,\n TenantConnectRequest,\n TenantConnectResponse,\n SqlQueryRequest,\n SqlQueryResponse,\n ListTenantsParams,\n MessageResponse,\n HealthResponse,\n BatchCreateRequest,\n BatchCreateResponse,\n BatchDeleteRequest,\n BatchDeleteResponse,\n BatchUpdateRequest,\n BatchUpdateResponse,\n UserResponse,\n UserCreateResponse,\n AdminCreateUserRequest,\n PasswordResetResponse,\n TenantObservabilityResponse,\n AuditLogParams,\n AuditLogResponse,\n} from './types';\n\nexport interface AdminClientOptions {\n baseUrl?: string;\n apiKey?: string;\n fetch?: FetchFn;\n}\n\nexport function createAdminClient(options: AdminClientOptions = {}) {\n const baseUrl =\n options.baseUrl ?? 'https://db9.shared.aws.tidbcloud.com/api';\n const headers: Record<string, string> = {};\n if (options.apiKey) {\n headers['X-API-Key'] = options.apiKey;\n }\n\n const client = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers,\n });\n\n return {\n tenants: {\n list: (params?: ListTenantsParams) => {\n const queryParams: Record<string, string | undefined> = {};\n if (params) {\n if (params.page !== undefined)\n queryParams.page = String(params.page);\n if (params.size !== undefined)\n queryParams.size = String(params.size);\n if (params.state !== undefined) queryParams.state = params.state;\n if (params.q !== undefined) queryParams.q = params.q;\n if (params.cursor !== undefined) queryParams.cursor = params.cursor;\n if (params.tag !== undefined) queryParams.tag = params.tag;\n }\n return client.get<TenantListResponse>('/tenants', queryParams);\n },\n create: (req?: CreateTenantRequest) =>\n client.post<CreateTenantResponse>('/tenants', req),\n get: (tenantId: string) =>\n client.get<TenantResponse>(`/tenants/${tenantId}`),\n update: (tenantId: string, req: TenantUpdateRequest) =>\n client.put<TenantResponse>(`/tenants/${tenantId}`, req),\n delete: (tenantId: string) =>\n client.del<MessageResponse>(`/tenants/${tenantId}`),\n remove: (tenantId: string) =>\n client.post<MessageResponse>(`/tenants/${tenantId}/remove`),\n\n batchCreate: (req: BatchCreateRequest) =>\n client.post<BatchCreateResponse>('/tenants/batch', req),\n batchDelete: (req: BatchDeleteRequest) =>\n client.post<BatchDeleteResponse>('/tenants/batch/delete', req),\n batchUpdate: (req: BatchUpdateRequest) =>\n client.put<BatchUpdateResponse>('/tenants/batch', req),\n\n connect: (tenantId: string, req: TenantConnectRequest) =>\n client.post<TenantConnectResponse>(\n `/tenants/${tenantId}/connect`,\n req\n ),\n\n // query() needs X-Tenant-Session header — create a one-off client\n query: async (\n tenantId: string,\n sessionId: string,\n req: SqlQueryRequest\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.post<SqlQueryResponse>(\n `/tenants/${tenantId}/query`,\n req\n );\n },\n },\n\n system: {\n health: () => client.get<HealthResponse>('/health'),\n info: () =>\n client.get<{ name: string; version: string; docs: string }>('/info'),\n },\n\n users: {\n list: async (tenantId: string, sessionId: string) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.get<UserResponse[]>(\n `/tenants/${tenantId}/users`\n );\n },\n\n create: async (\n tenantId: string,\n sessionId: string,\n req: AdminCreateUserRequest\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.post<UserCreateResponse>(\n `/tenants/${tenantId}/users`,\n req\n );\n },\n\n delete: async (\n tenantId: string,\n sessionId: string,\n username: string\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.del<MessageResponse>(\n `/tenants/${tenantId}/users/${username}`\n );\n },\n\n resetPassword: async (\n tenantId: string,\n sessionId: string,\n username: string\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.post<PasswordResetResponse>(\n `/tenants/${tenantId}/users/${username}/password`\n );\n },\n },\n\n observability: {\n get: (tenantId: string) =>\n client.get<TenantObservabilityResponse>(\n `/tenants/${tenantId}/observability`\n ),\n\n bootstrap: (tenantId: string, req: TenantConnectRequest) =>\n client.post<MessageResponse>(\n `/tenants/${tenantId}/observability/bootstrap`,\n req\n ),\n },\n\n audit: {\n list: (params?: AuditLogParams) => {\n const queryParams: Record<string, string | undefined> = {};\n if (params) {\n if (params.tenant_id !== undefined)\n queryParams.tenant_id = params.tenant_id;\n if (params.operation_type !== undefined)\n queryParams.operation_type = params.operation_type;\n if (params.resource_type !== undefined)\n queryParams.resource_type = params.resource_type;\n if (params.success !== undefined)\n queryParams.success = String(params.success);\n if (params.limit !== undefined)\n queryParams.limit = String(params.limit);\n if (params.offset !== undefined)\n queryParams.offset = String(params.offset);\n }\n return client.get<AuditLogResponse[]>('/audit-logs', queryParams);\n },\n },\n };\n}\n\nexport type AdminClient = ReturnType<typeof createAdminClient>;","export class Db9Error extends Error {\n readonly statusCode: number;\n readonly response?: Response;\n\n constructor(message: string, statusCode: number, response?: Response) {\n super(message);\n this.name = 'Db9Error';\n this.statusCode = statusCode;\n this.response = response;\n }\n\n static async fromResponse(response: Response): Promise<Db9Error> {\n // Parse { \"message\": string } body — the ONLY error format from the API\n let message: string;\n try {\n const body = (await response.json()) as { message?: string };\n message = body.message || response.statusText;\n } catch {\n message = response.statusText;\n }\n\n // Return specific subclass based on status code\n switch (response.status) {\n case 401:\n return new Db9AuthError(message, response);\n case 404:\n return new Db9NotFoundError(message, response);\n case 409:\n return new Db9ConflictError(message, response);\n default:\n return new Db9Error(message, response.status, response);\n }\n }\n}\n\nexport class Db9AuthError extends Db9Error {\n constructor(message: string, response?: Response) {\n super(message, 401, response);\n this.name = 'Db9AuthError';\n }\n}\n\nexport class Db9NotFoundError extends Db9Error {\n constructor(message: string, response?: Response) {\n super(message, 404, response);\n this.name = 'Db9NotFoundError';\n }\n}\n\nexport class Db9ConflictError extends Db9Error {\n constructor(message: string, response?: Response) {\n super(message, 409, response);\n this.name = 'Db9ConflictError';\n }\n}\n","import { Db9Error } from './errors';\n\nexport type FetchFn = typeof globalThis.fetch;\n\nexport interface HttpClientOptions {\n baseUrl: string;\n fetch?: FetchFn;\n headers?: Record<string, string>;\n}\n\nexport interface HttpClient {\n get<T>(path: string, params?: Record<string, string | undefined>): Promise<T>;\n post<T>(path: string, body?: unknown): Promise<T>;\n put<T>(path: string, body?: unknown): Promise<T>;\n del<T>(path: string): Promise<T>;\n}\n\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const baseUrl = options.baseUrl.replace(/\\/$/, ''); // strip trailing slash\n\n async function request<T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, string | undefined>\n ): Promise<T> {\n let url = `${baseUrl}${path}`;\n\n // Append query params for GET requests\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n searchParams.set(key, value);\n }\n }\n const qs = searchParams.toString();\n if (qs) url += `?${qs}`;\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetchFn(url, init);\n\n if (!response.ok) {\n throw await Db9Error.fromResponse(response);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n return {\n get: <T>(path: string, params?: Record<string, string | undefined>) =>\n request<T>('GET', path, undefined, params),\n post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),\n put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),\n del: <T>(path: string) => request<T>('DELETE', path),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,46 @@
1
+ import { F as FetchFn, L as ListTenantsParams, _ as TenantListResponse, r as CreateTenantRequest, s as CreateTenantResponse, a0 as TenantResponse, a2 as TenantUpdateRequest, M as MessageResponse, B as BatchCreateRequest, g as BatchCreateResponse, h as BatchDeleteRequest, i as BatchDeleteResponse, k as BatchUpdateRequest, l as BatchUpdateResponse, Y as TenantConnectRequest, Z as TenantConnectResponse, U as SqlQueryRequest, V as SqlQueryResponse, H as HealthResponse, a5 as UserResponse, A as AdminCreateUserRequest, a4 as UserCreateResponse, P as PasswordResetResponse, $ as TenantObservabilityResponse, e as AuditLogParams, f as AuditLogResponse } from './types-ktbIiH5T.cjs';
2
+
3
+ interface AdminClientOptions {
4
+ baseUrl?: string;
5
+ apiKey?: string;
6
+ fetch?: FetchFn;
7
+ }
8
+ declare function createAdminClient(options?: AdminClientOptions): {
9
+ tenants: {
10
+ list: (params?: ListTenantsParams) => Promise<TenantListResponse>;
11
+ create: (req?: CreateTenantRequest) => Promise<CreateTenantResponse>;
12
+ get: (tenantId: string) => Promise<TenantResponse>;
13
+ update: (tenantId: string, req: TenantUpdateRequest) => Promise<TenantResponse>;
14
+ delete: (tenantId: string) => Promise<MessageResponse>;
15
+ remove: (tenantId: string) => Promise<MessageResponse>;
16
+ batchCreate: (req: BatchCreateRequest) => Promise<BatchCreateResponse>;
17
+ batchDelete: (req: BatchDeleteRequest) => Promise<BatchDeleteResponse>;
18
+ batchUpdate: (req: BatchUpdateRequest) => Promise<BatchUpdateResponse>;
19
+ connect: (tenantId: string, req: TenantConnectRequest) => Promise<TenantConnectResponse>;
20
+ query: (tenantId: string, sessionId: string, req: SqlQueryRequest) => Promise<SqlQueryResponse>;
21
+ };
22
+ system: {
23
+ health: () => Promise<HealthResponse>;
24
+ info: () => Promise<{
25
+ name: string;
26
+ version: string;
27
+ docs: string;
28
+ }>;
29
+ };
30
+ users: {
31
+ list: (tenantId: string, sessionId: string) => Promise<UserResponse[]>;
32
+ create: (tenantId: string, sessionId: string, req: AdminCreateUserRequest) => Promise<UserCreateResponse>;
33
+ delete: (tenantId: string, sessionId: string, username: string) => Promise<MessageResponse>;
34
+ resetPassword: (tenantId: string, sessionId: string, username: string) => Promise<PasswordResetResponse>;
35
+ };
36
+ observability: {
37
+ get: (tenantId: string) => Promise<TenantObservabilityResponse>;
38
+ bootstrap: (tenantId: string, req: TenantConnectRequest) => Promise<MessageResponse>;
39
+ };
40
+ audit: {
41
+ list: (params?: AuditLogParams) => Promise<AuditLogResponse[]>;
42
+ };
43
+ };
44
+ type AdminClient = ReturnType<typeof createAdminClient>;
45
+
46
+ export { type AdminClient, type AdminClientOptions, createAdminClient };
@@ -0,0 +1,46 @@
1
+ import { F as FetchFn, L as ListTenantsParams, _ as TenantListResponse, r as CreateTenantRequest, s as CreateTenantResponse, a0 as TenantResponse, a2 as TenantUpdateRequest, M as MessageResponse, B as BatchCreateRequest, g as BatchCreateResponse, h as BatchDeleteRequest, i as BatchDeleteResponse, k as BatchUpdateRequest, l as BatchUpdateResponse, Y as TenantConnectRequest, Z as TenantConnectResponse, U as SqlQueryRequest, V as SqlQueryResponse, H as HealthResponse, a5 as UserResponse, A as AdminCreateUserRequest, a4 as UserCreateResponse, P as PasswordResetResponse, $ as TenantObservabilityResponse, e as AuditLogParams, f as AuditLogResponse } from './types-ktbIiH5T.js';
2
+
3
+ interface AdminClientOptions {
4
+ baseUrl?: string;
5
+ apiKey?: string;
6
+ fetch?: FetchFn;
7
+ }
8
+ declare function createAdminClient(options?: AdminClientOptions): {
9
+ tenants: {
10
+ list: (params?: ListTenantsParams) => Promise<TenantListResponse>;
11
+ create: (req?: CreateTenantRequest) => Promise<CreateTenantResponse>;
12
+ get: (tenantId: string) => Promise<TenantResponse>;
13
+ update: (tenantId: string, req: TenantUpdateRequest) => Promise<TenantResponse>;
14
+ delete: (tenantId: string) => Promise<MessageResponse>;
15
+ remove: (tenantId: string) => Promise<MessageResponse>;
16
+ batchCreate: (req: BatchCreateRequest) => Promise<BatchCreateResponse>;
17
+ batchDelete: (req: BatchDeleteRequest) => Promise<BatchDeleteResponse>;
18
+ batchUpdate: (req: BatchUpdateRequest) => Promise<BatchUpdateResponse>;
19
+ connect: (tenantId: string, req: TenantConnectRequest) => Promise<TenantConnectResponse>;
20
+ query: (tenantId: string, sessionId: string, req: SqlQueryRequest) => Promise<SqlQueryResponse>;
21
+ };
22
+ system: {
23
+ health: () => Promise<HealthResponse>;
24
+ info: () => Promise<{
25
+ name: string;
26
+ version: string;
27
+ docs: string;
28
+ }>;
29
+ };
30
+ users: {
31
+ list: (tenantId: string, sessionId: string) => Promise<UserResponse[]>;
32
+ create: (tenantId: string, sessionId: string, req: AdminCreateUserRequest) => Promise<UserCreateResponse>;
33
+ delete: (tenantId: string, sessionId: string, username: string) => Promise<MessageResponse>;
34
+ resetPassword: (tenantId: string, sessionId: string, username: string) => Promise<PasswordResetResponse>;
35
+ };
36
+ observability: {
37
+ get: (tenantId: string) => Promise<TenantObservabilityResponse>;
38
+ bootstrap: (tenantId: string, req: TenantConnectRequest) => Promise<MessageResponse>;
39
+ };
40
+ audit: {
41
+ list: (params?: AuditLogParams) => Promise<AuditLogResponse[]>;
42
+ };
43
+ };
44
+ type AdminClient = ReturnType<typeof createAdminClient>;
45
+
46
+ export { type AdminClient, type AdminClientOptions, createAdminClient };