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

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 (38) hide show
  1. package/dist/drivers/apps.driver.d.ts +95 -0
  2. package/dist/drivers/apps.driver.d.ts.map +1 -0
  3. package/dist/drivers/apps.driver.js +82 -0
  4. package/dist/drivers/apps.driver.js.map +1 -0
  5. package/dist/drivers/auth-admin.driver.d.ts +78 -0
  6. package/dist/drivers/auth-admin.driver.d.ts.map +1 -0
  7. package/dist/drivers/auth-admin.driver.js +145 -0
  8. package/dist/drivers/auth-admin.driver.js.map +1 -0
  9. package/dist/drivers/functions.driver.d.ts +75 -0
  10. package/dist/drivers/functions.driver.d.ts.map +1 -0
  11. package/dist/drivers/functions.driver.js +173 -0
  12. package/dist/drivers/functions.driver.js.map +1 -0
  13. package/dist/drivers/meta.driver.d.ts +77 -0
  14. package/dist/drivers/meta.driver.d.ts.map +1 -0
  15. package/dist/drivers/meta.driver.js +191 -0
  16. package/dist/drivers/meta.driver.js.map +1 -0
  17. package/dist/drivers/share-links.driver.d.ts +42 -0
  18. package/dist/drivers/share-links.driver.d.ts.map +1 -0
  19. package/dist/drivers/share-links.driver.js +53 -0
  20. package/dist/drivers/share-links.driver.js.map +1 -0
  21. package/dist/drivers/storage.driver.d.ts +72 -0
  22. package/dist/drivers/storage.driver.d.ts.map +1 -0
  23. package/dist/drivers/storage.driver.js +171 -0
  24. package/dist/drivers/storage.driver.js.map +1 -0
  25. package/dist/drivers/zero.driver.d.ts +78 -0
  26. package/dist/drivers/zero.driver.d.ts.map +1 -0
  27. package/dist/drivers/zero.driver.js +117 -0
  28. package/dist/drivers/zero.driver.js.map +1 -0
  29. package/dist/index.d.ts +24 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +32 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/types.d.ts +26 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +5 -0
  36. package/dist/types.js.map +1 -0
  37. package/package.json +57 -3
  38. package/README.md +0 -3
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Storage Driver - Supabase Storage API client
3
+ *
4
+ * Endpoints:
5
+ * - GET /storage/v1/bucket - List buckets
6
+ * - GET /storage/v1/object/list/{bucket} - List objects
7
+ * - POST /storage/v1/object/{bucket}/{path} - Upload object
8
+ * - GET /storage/v1/object/{bucket}/{path} - Download object
9
+ * - DELETE /storage/v1/object/{bucket}/{path} - Delete object
10
+ * - POST /storage/v1/object/move - Move object
11
+ * - POST /storage/v1/object/copy - Copy object
12
+ */
13
+ import axios from 'axios';
14
+ import { writeFile, stat } from 'node:fs/promises';
15
+ import { basename } from 'node:path';
16
+ import { createReadStream } from 'node:fs';
17
+ export class StorageDriver {
18
+ client;
19
+ serviceRoleKey;
20
+ tenantId;
21
+ constructor(options) {
22
+ this.serviceRoleKey = options.serviceRoleKey;
23
+ this.tenantId = options.tenantId;
24
+ this.client = axios.create({
25
+ baseURL: `${options.endpoint}/storage/v1`,
26
+ timeout: options.timeout ?? 60000,
27
+ headers: {
28
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
29
+ 'apikey': this.serviceRoleKey,
30
+ },
31
+ });
32
+ }
33
+ getHeaders() {
34
+ const headers = {
35
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
36
+ 'apikey': this.serviceRoleKey,
37
+ };
38
+ if (this.tenantId) {
39
+ headers['X-Tenant-Id'] = this.tenantId;
40
+ }
41
+ return headers;
42
+ }
43
+ handleError(error) {
44
+ if (axios.isAxiosError(error)) {
45
+ const axiosError = error;
46
+ const status = axiosError.response?.status;
47
+ const data = axiosError.response?.data;
48
+ let message = axiosError.message;
49
+ if (status === 401) {
50
+ message = 'Authentication failed. Please check your service_role key and run "pxbaas login" again.';
51
+ }
52
+ else if (status === 403) {
53
+ message = 'Permission denied. Storage operations require service_role key.';
54
+ }
55
+ else if (status === 404) {
56
+ message = 'Object or bucket not found. Please check the path and try again.';
57
+ }
58
+ else if (data?.error) {
59
+ message = String(data.error);
60
+ }
61
+ else if (data?.message) {
62
+ message = String(data.message);
63
+ }
64
+ throw new Error(`Storage API error (${status ?? 'unknown'}): ${message}`);
65
+ }
66
+ throw error;
67
+ }
68
+ /**
69
+ * List all buckets
70
+ */
71
+ async listBuckets() {
72
+ try {
73
+ const response = await this.client.get('/bucket', { headers: this.getHeaders() });
74
+ return response.data ?? [];
75
+ }
76
+ catch (error) {
77
+ this.handleError(error);
78
+ }
79
+ }
80
+ /**
81
+ * List objects in a bucket
82
+ */
83
+ async listObjects(bucket, prefix) {
84
+ try {
85
+ const response = await this.client.post(`/object/list/${bucket}`, { prefix, limit: 1000 }, { headers: this.getHeaders() });
86
+ return response.data ?? [];
87
+ }
88
+ catch (error) {
89
+ this.handleError(error);
90
+ }
91
+ }
92
+ /**
93
+ * Upload a file to storage
94
+ */
95
+ async upload(bucket, remotePath, localPath) {
96
+ try {
97
+ const fileStream = createReadStream(localPath);
98
+ const stats = await stat(localPath);
99
+ const filename = basename(localPath);
100
+ await this.client.post(`/object/${bucket}/${remotePath}`, fileStream, {
101
+ headers: {
102
+ ...this.getHeaders(),
103
+ 'Content-Type': 'application/octet-stream',
104
+ 'Content-Length': stats.size,
105
+ },
106
+ });
107
+ }
108
+ catch (error) {
109
+ this.handleError(error);
110
+ }
111
+ }
112
+ /**
113
+ * Download a file from storage
114
+ */
115
+ async download(bucket, remotePath, localPath) {
116
+ try {
117
+ const response = await this.client.get(`/object/${bucket}/${remotePath}`, {
118
+ headers: this.getHeaders(),
119
+ responseType: 'arraybuffer',
120
+ });
121
+ await writeFile(localPath, response.data);
122
+ }
123
+ catch (error) {
124
+ this.handleError(error);
125
+ }
126
+ }
127
+ /**
128
+ * Delete an object from storage
129
+ */
130
+ async delete(bucket, remotePath) {
131
+ try {
132
+ await this.client.delete(`/object/${bucket}/${remotePath}`, { headers: this.getHeaders() });
133
+ }
134
+ catch (error) {
135
+ this.handleError(error);
136
+ }
137
+ }
138
+ /**
139
+ * Move/rename an object
140
+ */
141
+ async move(sourceBucket, sourcePath, destBucket, destPath) {
142
+ try {
143
+ await this.client.post('/object/move', {
144
+ bucketId: sourceBucket,
145
+ sourceKey: sourcePath,
146
+ destinationBucket: destBucket,
147
+ destinationKey: destPath,
148
+ }, { headers: this.getHeaders() });
149
+ }
150
+ catch (error) {
151
+ this.handleError(error);
152
+ }
153
+ }
154
+ /**
155
+ * Copy an object
156
+ */
157
+ async copy(sourceBucket, sourcePath, destBucket, destPath) {
158
+ try {
159
+ await this.client.post('/object/copy', {
160
+ bucketId: sourceBucket,
161
+ sourceKey: sourcePath,
162
+ destinationBucket: destBucket,
163
+ destinationKey: destPath,
164
+ }, { headers: this.getHeaders() });
165
+ }
166
+ catch (error) {
167
+ this.handleError(error);
168
+ }
169
+ }
170
+ }
171
+ //# sourceMappingURL=storage.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../../src/drivers/storage.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Zero Driver — PolarDB-X Zero PXBaas provisioning client.
3
+ *
4
+ * Wraps the unauthenticated Zero API that claims a disposable, Supabase-compatible
5
+ * BaaS instance from a pre-warmed pool (15-day TTL, no renewal).
6
+ *
7
+ * Contract source: https://zero.polardbx.com/BAAS-SKILL.md (polardbx-zero-pxbaas v0.1.0)
8
+ *
9
+ * Endpoints:
10
+ * - POST /api/v1/supabase/instances claim (body: { whitelistIp? })
11
+ * - GET /api/v1/supabase/instances list (needs pxz_token cookie)
12
+ * - DELETE /api/v1/supabase/instances/{id} release (needs pxz_token cookie)
13
+ *
14
+ * Ownership: the claim response returns a `token` (also set as the `pxz_token`
15
+ * cookie). list/release must send it back via `Cookie: pxz_token=<token>`.
16
+ */
17
+ import { AxiosError } from 'axios';
18
+ export interface ZeroInstance {
19
+ id: string;
20
+ status: string;
21
+ region?: string;
22
+ zoneId?: string;
23
+ aliyunInstanceId?: string;
24
+ /** host:8000 WITHOUT scheme, e.g. "pxsp-xxxhttp.polardbxaisupabase.rds.aliyuncs.com:8000" */
25
+ publicEndpoint: string;
26
+ dashboardUrl?: string;
27
+ /** Canonical App origin returned by the platform; clients must not derive it. */
28
+ appEndpoint?: string;
29
+ appDomain?: {
30
+ hostname: string;
31
+ status: string;
32
+ tlsStatus: string;
33
+ };
34
+ apiKey: string;
35
+ serviceRoleKey: string;
36
+ dbPassword?: string;
37
+ dashboardPassword?: string;
38
+ whitelistIp?: string;
39
+ assignedAt?: string;
40
+ expiresAt?: string;
41
+ createdAt?: string;
42
+ }
43
+ export interface ZeroClaimResponse {
44
+ instance: ZeroInstance;
45
+ token: string;
46
+ }
47
+ export interface ZeroDriverOptions {
48
+ /** Zero API base URL. Defaults to https://zero.polardbx.com (override via BAAS_ZERO_ENDPOINT). */
49
+ baseUrl?: string;
50
+ timeout?: number;
51
+ }
52
+ /** Error codes returned by Zero (`{ error: { code, message } }`). */
53
+ export type ZeroErrorCode = 'INVALID_WHITELIST_IP' | 'INSTANCE_NOT_FOUND' | 'RATE_LIMIT_EXCEEDED' | 'SUPABASE_LIMIT_REACHED' | 'SUPABASE_POOL_EXHAUSTED' | 'SUPABASE_DISABLED' | 'INTERNAL_ERROR' | 'NETWORK_ERROR' | 'UNKNOWN';
54
+ export declare class ZeroError extends Error {
55
+ code: ZeroErrorCode;
56
+ status?: number;
57
+ constructor(code: ZeroErrorCode, message: string, status?: number);
58
+ }
59
+ export declare class ZeroDriver {
60
+ private client;
61
+ constructor(options?: ZeroDriverOptions);
62
+ /** Claim a new instance. Unauthenticated. Optionally whitelist extra IPs. */
63
+ claim(whitelistIp?: string): Promise<ZeroClaimResponse>;
64
+ /** List the caller's non-released instances. Requires the ownership token. */
65
+ list(token: string): Promise<ZeroInstance[]>;
66
+ /** Release (destroy) an instance. Requires the ownership token. */
67
+ release(id: string, token: string): Promise<void>;
68
+ /**
69
+ * Normalize the publicEndpoint (host:8000, no scheme) into a base URL.
70
+ * Prefers dashboardUrl when it already carries a scheme.
71
+ */
72
+ static toEndpoint(instance: ZeroInstance, scheme?: string): string;
73
+ private toError;
74
+ private codeFromStatus;
75
+ }
76
+ /** Wrap a network-level axios failure into a ZeroError. */
77
+ export declare function isZeroNetworkError(e: unknown): e is AxiosError;
78
+ //# sourceMappingURL=zero.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/zero.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAc,EAAiB,UAAU,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,MAAM,aAAa,GACrB,sBAAsB,GACtB,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,GACxB,yBAAyB,GACzB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,SAAS,CAAC;AAEd,qBAAa,SAAU,SAAQ,KAAK;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;gBACJ,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAMlE;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,GAAE,iBAAsB;IAa3C,6EAA6E;IACvE,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe7D,8EAA8E;IACxE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAalD,mEAAmE;IAC7D,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,GAAG,MAAM;IAQlE,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,cAAc;CAUvB;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAE9D"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Zero Driver — PolarDB-X Zero PXBaas provisioning client.
3
+ *
4
+ * Wraps the unauthenticated Zero API that claims a disposable, Supabase-compatible
5
+ * BaaS instance from a pre-warmed pool (15-day TTL, no renewal).
6
+ *
7
+ * Contract source: https://zero.polardbx.com/BAAS-SKILL.md (polardbx-zero-pxbaas v0.1.0)
8
+ *
9
+ * Endpoints:
10
+ * - POST /api/v1/supabase/instances claim (body: { whitelistIp? })
11
+ * - GET /api/v1/supabase/instances list (needs pxz_token cookie)
12
+ * - DELETE /api/v1/supabase/instances/{id} release (needs pxz_token cookie)
13
+ *
14
+ * Ownership: the claim response returns a `token` (also set as the `pxz_token`
15
+ * cookie). list/release must send it back via `Cookie: pxz_token=<token>`.
16
+ */
17
+ import axios from 'axios';
18
+ export class ZeroError extends Error {
19
+ code;
20
+ status;
21
+ constructor(code, message, status) {
22
+ super(message);
23
+ this.name = 'ZeroError';
24
+ this.code = code;
25
+ this.status = status;
26
+ }
27
+ }
28
+ const DEFAULT_BASE_URL = 'https://zero.polardbx.com';
29
+ export class ZeroDriver {
30
+ client;
31
+ constructor(options = {}) {
32
+ const baseUrl = options.baseUrl ?? process.env.BAAS_ZERO_ENDPOINT ?? DEFAULT_BASE_URL;
33
+ this.client = axios.create({
34
+ baseURL: baseUrl.replace(/\/$/, ''),
35
+ timeout: options.timeout ?? 30000,
36
+ // NOTE: do NOT set a default Content-Type. axios adds application/json
37
+ // automatically for the claim() POST object body, but a DELETE/GET carrying
38
+ // Content-Type: application/json with no body makes Zero return HTTP 400.
39
+ // Do not throw on non-2xx; we map errors ourselves.
40
+ validateStatus: () => true,
41
+ });
42
+ }
43
+ /** Claim a new instance. Unauthenticated. Optionally whitelist extra IPs. */
44
+ async claim(whitelistIp) {
45
+ const body = {};
46
+ if (whitelistIp)
47
+ body.whitelistIp = whitelistIp;
48
+ const res = await this.client.post('/api/v1/supabase/instances', body);
49
+ if (res.status !== 200 && res.status !== 201) {
50
+ throw this.toError(res.status, res.data);
51
+ }
52
+ const data = res.data;
53
+ if (!data?.instance?.id || !data?.token) {
54
+ throw new ZeroError('UNKNOWN', 'Malformed claim response: missing instance.id or token', res.status);
55
+ }
56
+ return data;
57
+ }
58
+ /** List the caller's non-released instances. Requires the ownership token. */
59
+ async list(token) {
60
+ const res = await this.client.get('/api/v1/supabase/instances', {
61
+ headers: { Cookie: `pxz_token=${token}` },
62
+ });
63
+ if (res.status !== 200) {
64
+ throw this.toError(res.status, res.data);
65
+ }
66
+ const data = res.data;
67
+ if (Array.isArray(data))
68
+ return data;
69
+ const obj = data;
70
+ return obj?.instances ?? [];
71
+ }
72
+ /** Release (destroy) an instance. Requires the ownership token. */
73
+ async release(id, token) {
74
+ const res = await this.client.delete(`/api/v1/supabase/instances/${encodeURIComponent(id)}`, {
75
+ headers: { Cookie: `pxz_token=${token}` },
76
+ });
77
+ if (res.status !== 200 && res.status !== 204) {
78
+ throw this.toError(res.status, res.data);
79
+ }
80
+ }
81
+ /**
82
+ * Normalize the publicEndpoint (host:8000, no scheme) into a base URL.
83
+ * Prefers dashboardUrl when it already carries a scheme.
84
+ */
85
+ static toEndpoint(instance, scheme = 'http') {
86
+ if (instance.dashboardUrl && /^https?:\/\//.test(instance.dashboardUrl)) {
87
+ return instance.dashboardUrl.replace(/\/$/, '');
88
+ }
89
+ const host = instance.publicEndpoint.replace(/^https?:\/\//, '').replace(/\/$/, '');
90
+ return `${scheme}://${host}`;
91
+ }
92
+ toError(status, data) {
93
+ const err = data?.error;
94
+ const code = err?.code ?? this.codeFromStatus(status);
95
+ const message = err?.message ?? `Zero API error (HTTP ${status})`;
96
+ return new ZeroError(code, message, status);
97
+ }
98
+ codeFromStatus(status) {
99
+ if (status === 429)
100
+ return 'RATE_LIMIT_EXCEEDED';
101
+ if (status === 503)
102
+ return 'SUPABASE_POOL_EXHAUSTED';
103
+ if (status === 404)
104
+ return 'INSTANCE_NOT_FOUND';
105
+ if (status >= 500)
106
+ return 'INTERNAL_ERROR';
107
+ // 400 is not mapped to a specific code: INVALID_WHITELIST_IP is claim-only and
108
+ // comes from the response body's error.code (preferred in toError). A bare 400
109
+ // on other calls (e.g. release) must not be mislabeled as a whitelist error.
110
+ return 'UNKNOWN';
111
+ }
112
+ }
113
+ /** Wrap a network-level axios failure into a ZeroError. */
114
+ export function isZeroNetworkError(e) {
115
+ return axios.isAxiosError(e);
116
+ }
117
+ //# sourceMappingURL=zero.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero.driver.js","sourceRoot":"","sources":["../../src/drivers/zero.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @polardbx/pxbaas-client
3
+ *
4
+ * Shared HTTP client SDK for PolarDB-X BaaS data plane APIs.
5
+ *
6
+ * This package provides typed clients for:
7
+ * - Kong gateway routing
8
+ * - Meta API (/pg/*)
9
+ * - Functions Management API (/v1/projects/*)
10
+ * - Storage API (/storage/v1/*)
11
+ * - Auth Admin API (/auth/v1/admin/*)
12
+ * - REST API (/rest/v1/*)
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ export * from "./types.js";
17
+ export * from "./drivers/meta.driver.js";
18
+ export * from "./drivers/functions.driver.js";
19
+ export * from "./drivers/apps.driver.js";
20
+ export * from "./drivers/share-links.driver.js";
21
+ export * from "./drivers/storage.driver.js";
22
+ export * from "./drivers/auth-admin.driver.js";
23
+ export * from "./drivers/zero.driver.js";
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAM3B,cAAc,0BAA0B,CAAC;AAGzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @polardbx/pxbaas-client
3
+ *
4
+ * Shared HTTP client SDK for PolarDB-X BaaS data plane APIs.
5
+ *
6
+ * This package provides typed clients for:
7
+ * - Kong gateway routing
8
+ * - Meta API (/pg/*)
9
+ * - Functions Management API (/v1/projects/*)
10
+ * - Storage API (/storage/v1/*)
11
+ * - Auth Admin API (/auth/v1/admin/*)
12
+ * - REST API (/rest/v1/*)
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ export * from "./types.js";
17
+ // TODO: M1 - Add Kong client
18
+ // export * from './kong.js';
19
+ // M3 - Meta API driver
20
+ export * from "./drivers/meta.driver.js";
21
+ // M4 - Functions, Apps, and Storage drivers
22
+ export * from "./drivers/functions.driver.js";
23
+ export * from "./drivers/apps.driver.js";
24
+ export * from "./drivers/share-links.driver.js";
25
+ export * from "./drivers/storage.driver.js";
26
+ // M5 - Auth Admin driver
27
+ export * from "./drivers/auth-admin.driver.js";
28
+ // Zero provisioning driver (PolarDB-X Zero PXBaas)
29
+ export * from "./drivers/zero.driver.js";
30
+ // TODO: M5 - Add REST driver
31
+ // export * from './drivers/rest.driver.js';
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAE3B,6BAA6B;AAC7B,6BAA6B;AAE7B,uBAAuB;AACvB,cAAc,0BAA0B,CAAC;AAEzC,4CAA4C;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,yBAAyB;AACzB,cAAc,gCAAgC,CAAC;AAE/C,mDAAmD;AACnD,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,4CAA4C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Core types for @polardbx/pxbaas-client
3
+ */
4
+ export interface TenantProfile {
5
+ endpoint: string;
6
+ tenantId?: string;
7
+ anonKey: string;
8
+ serviceRoleKey: string;
9
+ }
10
+ export interface JwtPayload {
11
+ role: 'anon' | 'service_role';
12
+ tenant_id?: string;
13
+ iss: string;
14
+ iat: number;
15
+ exp: number;
16
+ }
17
+ export interface ApiResponse<T = unknown> {
18
+ data: T;
19
+ error?: string;
20
+ }
21
+ export interface PaginatedResponse<T> extends ApiResponse<T[]> {
22
+ count: number;
23
+ offset: number;
24
+ limit: number;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core types for @polardbx/pxbaas-client
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@polardbx/pxbaas-client",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0-beta.1",
4
+ "description": "Shared HTTP client SDK for PolarDB-X BaaS data plane APIs",
5
+ "keywords": [
6
+ "polardbx",
7
+ "baas",
8
+ "client",
9
+ "sdk",
10
+ "http"
11
+ ],
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/polardbx/mysql-supabase.git",
16
+ "directory": "cli/packages/baas-client"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public",
20
+ "registry": "https://registry.npmjs.org"
21
+ },
22
+ "type": "module",
23
+ "main": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "import": "./dist/index.js",
28
+ "types": "./dist/index.d.ts"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "dependencies": {
35
+ "axios": "^1.6.0",
36
+ "form-data": "^4.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^20.11.0",
40
+ "@typescript-eslint/eslint-plugin": "^7.0.0",
41
+ "@typescript-eslint/parser": "^7.0.0",
42
+ "eslint": "^8.56.0",
43
+ "msw": "^2.2.0",
44
+ "typescript": "^5.3.0",
45
+ "vitest": "^1.2.0"
46
+ },
47
+ "engines": {
48
+ "node": ">=20.0.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc --build",
52
+ "dev": "tsc --watch",
53
+ "test": "vitest run",
54
+ "test:unit": "vitest run",
55
+ "lint": "eslint src --ext .ts",
56
+ "lint:fix": "eslint src --ext .ts --fix",
57
+ "typecheck": "tsc --noEmit",
58
+ "clean": "rm -rf dist *.tsbuildinfo"
59
+ }
6
60
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.