@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
package/README.md CHANGED
@@ -1,3 +1,57 @@
1
- # Temporary Holding Version
1
+ # @polardbx/pxbaas-client
2
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.
3
+ Shared HTTP client SDK for [PolarDB-X BaaS](https://github.com/polardbx/mysql-supabase) (MySQL-Supabase) data plane APIs. This is the transport layer used by the [`@polardbx/pxbaas`](https://www.npmjs.com/package/@polardbx/pxbaas) CLI; you can also depend on it directly to script BaaS operations from Node.js.
4
+
5
+ Covered API surfaces:
6
+
7
+ - Meta API (`/pg/*`) — tables, schema, SQL query
8
+ - Functions Management API (`/v1/projects/*`) — Edge Function deploy/list/delete
9
+ - Apps & share-links drivers — webapp mounts and secure sharing
10
+ - Storage API (`/storage/v1/*`) — objects and buckets
11
+ - Auth Admin API (`/auth/v1/admin/*`) — user administration
12
+ - Tenant self-service DDL / RLS driver (multi-tenant, per-tenant `service_role`)
13
+ - Tenant admin driver (`/api/platform/tenants/*`, instance dashboard Basic auth, operator surface)
14
+ - Zero provisioning driver (PolarDB-X Zero PXBaas)
15
+
16
+ ## Requirements
17
+
18
+ - Node.js >= 20
19
+ - ESM (`"type": "module"`); types ship in `dist/index.d.ts`
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ npm install @polardbx/pxbaas-client
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ Drivers are constructed per endpoint with your tenant keys; keys are passed by the caller (the CLI sources them from its keyring-backed profile store).
30
+
31
+ ```ts
32
+ import { MetaDriver } from "@polardbx/pxbaas-client";
33
+
34
+ const meta = new MetaDriver({
35
+ endpoint: "https://your-baas-endpoint",
36
+ anonKey: process.env.BAAS_ANON_KEY!,
37
+ serviceRoleKey: process.env.BAAS_SERVICE_ROLE_KEY, // admin operations
38
+ tenantId: process.env.BAAS_TENANT_ID, // multi-tenant deployments
39
+ });
40
+
41
+ const tables = await meta.listTables();
42
+ const rows = await meta.query("select 1");
43
+ ```
44
+
45
+ Other drivers (`FunctionsDriver`, `AppsDriver`, `ShareLinksDriver`, `StorageDriver`, `AuthAdminDriver`, `TenantDdlDriver`, `TenantAdminDriver`, `ZeroDriver`) follow the same options-object pattern; see `dist/index.d.ts` for the full typed surface.
46
+
47
+ ### Secret handling in `TenantAdminDriver`
48
+
49
+ The upstream tenant endpoints return the tenant's `jwt_secret` (its signing master key) and both API keys in plaintext. The driver strips `jwt_secret` at parse time, so no method can hand it back, and normal reads (`list`, `get`) return redacted rows with key-presence booleans only. Tenant key material is reachable solely through `getKeys()` and `create()`, which return it in a dedicated `TenantKeyBundle` — never log or serialize that object; pass it to a keyring or a `0600` file. Keys issued by the platform are long-lived (~10 years) and currently cannot be revoked.
50
+
51
+ ## Versioning
52
+
53
+ Versioned in lockstep with `@polardbx/pxbaas` (the CLI depends on this package via `workspace:*` in the monorepo, rewritten to the real version at publish time). Always upgrade both together.
54
+
55
+ ## License
56
+
57
+ MIT
@@ -0,0 +1,128 @@
1
+ export type AppOriginMode = "shared" | "isolated";
2
+ export type AppMountStatus = "ACTIVE" | "DISABLED";
3
+ export interface AppCapabilities {
4
+ schemaVersions: number[];
5
+ appEndpoint: string | null;
6
+ /**
7
+ * Effective Edge Function quota for this tenant (platform default → tenant
8
+ * override), or null/absent when the instance did not report it. The CLI
9
+ * preflight treats this as the authoritative limit instead of a hardcoded
10
+ * client default (gomoku retrospective 弯路5).
11
+ */
12
+ maxFunctions?: number | null;
13
+ originMode?: AppOriginMode;
14
+ hostEnforced?: boolean;
15
+ publicExposureAllowed?: boolean;
16
+ publicStatic: boolean;
17
+ nativeDeno: boolean;
18
+ honoVersion: string | null;
19
+ honoOfflineReady?: boolean;
20
+ /** Curated SSR runtime allow-list (name@version) reported by the instance (W9). */
21
+ ssrLibs?: string[];
22
+ binaryAssets: boolean;
23
+ spaFallback: boolean;
24
+ functionSecrets: boolean;
25
+ egressPolicies: string[];
26
+ privateShare: boolean;
27
+ persistentSession: boolean;
28
+ sessionMode?: "none" | "proxy-injected-header";
29
+ sessionHeaders?: string[];
30
+ sessionCookie?: {
31
+ name: string;
32
+ scope: "per-mount";
33
+ httponly: boolean;
34
+ sameSite: string;
35
+ } | null;
36
+ sessionTenantBound?: boolean;
37
+ sessionStateful?: boolean;
38
+ limits: {
39
+ maxFiles: number;
40
+ maxFileBytes: number;
41
+ maxBundleBytes: number;
42
+ };
43
+ }
44
+ export interface AppMount {
45
+ id: string;
46
+ mountId: string;
47
+ tenantId: string;
48
+ appName: string;
49
+ activeFunctionSlug: string | null;
50
+ previousFunctionSlug: string | null;
51
+ generation: number;
52
+ status: AppMountStatus;
53
+ frontendRouting: "FILES";
54
+ backendEnabled: boolean;
55
+ expiresAt: string | null;
56
+ createdBy: string | null;
57
+ createdAt: string;
58
+ updatedAt: string;
59
+ url: string;
60
+ }
61
+ export interface CreateAppOptions {
62
+ appName: string;
63
+ tenantId?: string;
64
+ expiresAt?: string;
65
+ }
66
+ export interface PublishAppOptions {
67
+ candidateFunctionSlug: string;
68
+ expectedGeneration: number;
69
+ tenantId?: string;
70
+ }
71
+ export interface ChangeAppGenerationOptions {
72
+ expectedGeneration: number;
73
+ tenantId?: string;
74
+ }
75
+ export interface DestroyAppOptions {
76
+ /** Reclaim an orphan candidate the caller uploaded but never published. */
77
+ candidateFunctionSlug?: string;
78
+ /** Opt-in CAS guard; omit to destroy unconditionally. */
79
+ expectedGeneration?: number;
80
+ tenantId?: string;
81
+ }
82
+ export interface AppDestroyFunctionResult {
83
+ slug: string;
84
+ deleted: boolean;
85
+ error?: string;
86
+ }
87
+ export interface AppDestroyResult {
88
+ destroyed: boolean;
89
+ mountId: string;
90
+ appName: string;
91
+ tenantId: string;
92
+ alreadyGone?: boolean;
93
+ deletedFunctions: AppDestroyFunctionResult[];
94
+ }
95
+ export interface AppsDriverOptions {
96
+ endpoint: string;
97
+ serviceRoleKey: string;
98
+ projectRef?: string;
99
+ timeout?: number;
100
+ }
101
+ export interface AppApiFailure {
102
+ code: string;
103
+ message: string;
104
+ }
105
+ export declare class AppsApiError extends Error {
106
+ readonly code: string;
107
+ readonly status?: number;
108
+ constructor(code: string, message: string, status?: number);
109
+ }
110
+ export declare class AppsDriver {
111
+ private readonly client;
112
+ constructor(options: AppsDriverOptions);
113
+ capabilities(): Promise<AppCapabilities>;
114
+ create(options: CreateAppOptions): Promise<AppMount>;
115
+ get(mountId: string, tenantId?: string): Promise<AppMount>;
116
+ publish(mountId: string, options: PublishAppOptions): Promise<AppMount>;
117
+ rollback(mountId: string, options: ChangeAppGenerationOptions): Promise<AppMount>;
118
+ unpublish(mountId: string, options: ChangeAppGenerationOptions): Promise<AppMount>;
119
+ /**
120
+ * Permanently tear down a Webapp: reclaim its edge-func candidates and delete
121
+ * the mount-id record. Idempotent (an already-gone mount returns destroyed).
122
+ * DB business tables are NOT touched.
123
+ */
124
+ destroy(mountId: string, options?: DestroyAppOptions): Promise<AppDestroyResult>;
125
+ private request;
126
+ }
127
+ export declare function normalizeAppsError(error: unknown): AppsApiError;
128
+ //# sourceMappingURL=apps.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/apps.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import axios from "axios";
2
+ export class AppsApiError extends Error {
3
+ code;
4
+ status;
5
+ constructor(code, message, status) {
6
+ super(message);
7
+ this.name = "AppsApiError";
8
+ this.code = code;
9
+ this.status = status;
10
+ }
11
+ }
12
+ export class AppsDriver {
13
+ client;
14
+ constructor(options) {
15
+ const endpoint = options.endpoint.replace(/\/$/, "");
16
+ this.client = axios.create({
17
+ baseURL: `${endpoint}/v1/projects/${encodeURIComponent(options.projectRef ?? "default")}/apps`,
18
+ timeout: options.timeout ?? 60_000,
19
+ headers: { Authorization: `Bearer ${options.serviceRoleKey}` },
20
+ });
21
+ }
22
+ async capabilities() {
23
+ return this.request(() => this.client.get("/capabilities"));
24
+ }
25
+ async create(options) {
26
+ return this.request(() => this.client.post("", compact(options)));
27
+ }
28
+ async get(mountId, tenantId) {
29
+ return this.request(() => this.client.get(`/${encodeURIComponent(mountId)}`, {
30
+ params: tenantId ? { tenantId } : undefined,
31
+ }));
32
+ }
33
+ async publish(mountId, options) {
34
+ return this.request(() => this.client.post(`/${encodeURIComponent(mountId)}/publish`, compact(options)));
35
+ }
36
+ async rollback(mountId, options) {
37
+ return this.request(() => this.client.post(`/${encodeURIComponent(mountId)}/rollback`, compact(options)));
38
+ }
39
+ async unpublish(mountId, options) {
40
+ return this.request(() => this.client.post(`/${encodeURIComponent(mountId)}/unpublish`, compact(options)));
41
+ }
42
+ /**
43
+ * Permanently tear down a Webapp: reclaim its edge-func candidates and delete
44
+ * the mount-id record. Idempotent (an already-gone mount returns destroyed).
45
+ * DB business tables are NOT touched.
46
+ */
47
+ async destroy(mountId, options = {}) {
48
+ return this.request(() => this.client.post(`/${encodeURIComponent(mountId)}/destroy`, compact(options)));
49
+ }
50
+ async request(operation) {
51
+ try {
52
+ const response = await operation();
53
+ if (response.data?.status !== "ok" || response.data.data === undefined) {
54
+ throw new AppsApiError("APP_RESPONSE_INVALID", "Apps API returned an invalid response");
55
+ }
56
+ return response.data.data;
57
+ }
58
+ catch (error) {
59
+ if (error instanceof AppsApiError)
60
+ throw error;
61
+ throw normalizeAppsError(error);
62
+ }
63
+ }
64
+ }
65
+ function compact(value) {
66
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
67
+ }
68
+ export function normalizeAppsError(error) {
69
+ if (!axios.isAxiosError(error)) {
70
+ const message = error instanceof Error ? error.message : String(error);
71
+ return new AppsApiError("APP_UNKNOWN_ERROR", message);
72
+ }
73
+ const axiosError = error;
74
+ const status = axiosError.response?.status;
75
+ const body = axiosError.response?.data;
76
+ const rawCode = body?.code ?? body?.error?.code;
77
+ const rawMessage = body?.message ?? body?.error?.message;
78
+ const code = typeof rawCode === "string"
79
+ ? rawCode
80
+ : status
81
+ ? `APP_HTTP_${status}`
82
+ : "APP_NETWORK_ERROR";
83
+ const message = typeof rawMessage === "string"
84
+ ? rawMessage
85
+ : status
86
+ ? `Apps API request failed (HTTP ${status})`
87
+ : axiosError.message || "Apps API network request failed";
88
+ return new AppsApiError(code, message, status);
89
+ }
90
+ //# sourceMappingURL=apps.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.driver.js","sourceRoot":"","sources":["../../src/drivers/apps.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8C,MAAM,OAAO,CAAC;AA2HnE,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAS;IACb,MAAM,CAAU;IAEzB,YAAY,IAAY,EAAE,OAAe,EAAE,MAAe;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,UAAU;IACJ,MAAM,CAAgB;IAEvC,YAAY,OAA0B;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,QAAQ,gBAAgB,kBAAkB,CAAC,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC,OAAO;YAC9F,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;YAClC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,cAAc,EAAE,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAkB,GAAG,EAAE,CACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CACjC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAyB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAW,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,QAAiB;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAW,GAAG,EAAE,CACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;YACjD,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SAC5C,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAe,EACf,OAA0B;QAE1B,OAAO,IAAI,CAAC,OAAO,CAAW,GAAG,EAAE,CACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI,kBAAkB,CAAC,OAAO,CAAC,UAAU,EACzC,OAAO,CAAC,OAAO,CAAC,CACjB,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAAe,EACf,OAAmC;QAEnC,OAAO,IAAI,CAAC,OAAO,CAAW,GAAG,EAAE,CACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAC1C,OAAO,CAAC,OAAO,CAAC,CACjB,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAe,EACf,OAAmC;QAEnC,OAAO,IAAI,CAAC,OAAO,CAAW,GAAG,EAAE,CACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAC3C,OAAO,CAAC,OAAO,CAAC,CACjB,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CACX,OAAe,EACf,UAA6B,EAAE;QAE/B,OAAO,IAAI,CAAC,OAAO,CAAmB,GAAG,EAAE,CACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI,kBAAkB,CAAC,OAAO,CAAC,UAAU,EACzC,OAAO,CAAC,OAAO,CAAC,CACjB,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,SAAoD;QAEpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC;YACnC,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvE,MAAM,IAAI,YAAY,CACpB,sBAAsB,EACtB,uCAAuC,CACxC,CAAC;YACJ,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY;gBAAE,MAAM,KAAK,CAAC;YAC/C,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF;AAED,SAAS,OAAO,CAAmB,KAAQ;IACzC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC5D,CAAC;AACT,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,KAA4B,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,IAMrB,CAAC;IACd,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;IACzD,MAAM,IAAI,GACR,OAAO,OAAO,KAAK,QAAQ;QACzB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,YAAY,MAAM,EAAE;YACtB,CAAC,CAAC,mBAAmB,CAAC;IAC5B,MAAM,OAAO,GACX,OAAO,UAAU,KAAK,QAAQ;QAC5B,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,iCAAiC,MAAM,GAAG;YAC5C,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,iCAAiC,CAAC;IAChE,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Auth Admin Driver - GoTrue Admin API client
3
+ *
4
+ * Endpoints:
5
+ * - GET /auth/v1/admin/users - List users
6
+ * - GET /auth/v1/admin/users/{id} - Get user
7
+ * - POST /auth/v1/admin/users - Create user
8
+ * - DELETE /auth/v1/admin/users/{id} - Delete user
9
+ * - POST /auth/v1/invite - Invite user
10
+ */
11
+ export interface User {
12
+ id: string;
13
+ aud: string;
14
+ role: string;
15
+ email: string;
16
+ email_confirmed_at?: string;
17
+ phone?: string;
18
+ phone_confirmed_at?: string;
19
+ created_at: string;
20
+ updated_at: string;
21
+ last_sign_in_at?: string;
22
+ app_metadata: Record<string, unknown>;
23
+ user_metadata: Record<string, unknown>;
24
+ identities?: Array<{
25
+ id: string;
26
+ user_id: string;
27
+ identity_data: Record<string, unknown>;
28
+ provider: string;
29
+ last_sign_in_at: string;
30
+ created_at: string;
31
+ updated_at: string;
32
+ }>;
33
+ }
34
+ export interface CreateUserOptions {
35
+ email: string;
36
+ password: string;
37
+ email_confirm?: boolean;
38
+ user_metadata?: Record<string, unknown>;
39
+ app_metadata?: Record<string, unknown>;
40
+ }
41
+ export interface AuthAdminDriverOptions {
42
+ endpoint: string;
43
+ serviceRoleKey: string;
44
+ tenantId?: string;
45
+ timeout?: number;
46
+ }
47
+ export declare class AuthAdminDriver {
48
+ private client;
49
+ private serviceRoleKey;
50
+ private tenantId?;
51
+ constructor(options: AuthAdminDriverOptions);
52
+ private getHeaders;
53
+ private handleError;
54
+ /**
55
+ * List all users
56
+ */
57
+ listUsers(page?: number, perPage?: number): Promise<{
58
+ users: User[];
59
+ total: number;
60
+ }>;
61
+ /**
62
+ * Get user by ID
63
+ */
64
+ getUser(userId: string): Promise<User>;
65
+ /**
66
+ * Create a new user
67
+ */
68
+ createUser(options: CreateUserOptions): Promise<User>;
69
+ /**
70
+ * Delete a user
71
+ */
72
+ deleteUser(userId: string): Promise<void>;
73
+ /**
74
+ * Invite a user by email
75
+ */
76
+ inviteUser(email: string): Promise<User>;
77
+ }
78
+ //# sourceMappingURL=auth-admin.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-admin.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/auth-admin.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,OAAO,EAAE,sBAAsB;IAc3C,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IA4BnB;;OAEG;IACG,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA0B3F;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa/C"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Auth Admin Driver - GoTrue Admin API client
3
+ *
4
+ * Endpoints:
5
+ * - GET /auth/v1/admin/users - List users
6
+ * - GET /auth/v1/admin/users/{id} - Get user
7
+ * - POST /auth/v1/admin/users - Create user
8
+ * - DELETE /auth/v1/admin/users/{id} - Delete user
9
+ * - POST /auth/v1/invite - Invite user
10
+ */
11
+ import axios from 'axios';
12
+ export class AuthAdminDriver {
13
+ client;
14
+ serviceRoleKey;
15
+ tenantId;
16
+ constructor(options) {
17
+ this.serviceRoleKey = options.serviceRoleKey;
18
+ this.tenantId = options.tenantId;
19
+ this.client = axios.create({
20
+ baseURL: `${options.endpoint}/auth/v1`,
21
+ timeout: options.timeout ?? 30000,
22
+ headers: {
23
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
24
+ 'apikey': this.serviceRoleKey,
25
+ },
26
+ });
27
+ }
28
+ getHeaders() {
29
+ const headers = {
30
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
31
+ 'apikey': this.serviceRoleKey,
32
+ };
33
+ if (this.tenantId) {
34
+ headers['X-Tenant-Id'] = this.tenantId;
35
+ }
36
+ return headers;
37
+ }
38
+ handleError(error) {
39
+ if (axios.isAxiosError(error)) {
40
+ const axiosError = error;
41
+ const status = axiosError.response?.status;
42
+ const data = axiosError.response?.data;
43
+ let message = axiosError.message;
44
+ if (status === 401) {
45
+ message = 'Authentication failed. Please check your service_role key and run "pxbaas login" again.';
46
+ }
47
+ else if (status === 403) {
48
+ message = 'Permission denied. Admin operations require service_role key.';
49
+ }
50
+ else if (status === 404) {
51
+ message = 'User not found. Please check the user ID and try again.';
52
+ }
53
+ else if (status === 422) {
54
+ message = data?.msg ? String(data.msg) : 'Validation failed';
55
+ }
56
+ else if (data?.error_description) {
57
+ message = String(data.error_description);
58
+ }
59
+ else if (data?.msg) {
60
+ message = String(data.msg);
61
+ }
62
+ throw new Error(`Auth Admin API error (${status ?? 'unknown'}): ${message}`);
63
+ }
64
+ throw error;
65
+ }
66
+ /**
67
+ * List all users
68
+ */
69
+ async listUsers(page, perPage) {
70
+ try {
71
+ const params = {};
72
+ if (page !== undefined)
73
+ params.page = page;
74
+ if (perPage !== undefined)
75
+ params.per_page = perPage;
76
+ const response = await this.client.get('/admin/users', {
77
+ headers: this.getHeaders(),
78
+ params,
79
+ });
80
+ const total = parseInt(response.headers['x-total-count'] ?? '0', 10);
81
+ const users = response.data?.users ?? [];
82
+ return {
83
+ users,
84
+ total,
85
+ };
86
+ }
87
+ catch (error) {
88
+ this.handleError(error);
89
+ }
90
+ }
91
+ /**
92
+ * Get user by ID
93
+ */
94
+ async getUser(userId) {
95
+ try {
96
+ const response = await this.client.get(`/admin/users/${userId}`, { headers: this.getHeaders() });
97
+ return response.data;
98
+ }
99
+ catch (error) {
100
+ this.handleError(error);
101
+ }
102
+ }
103
+ /**
104
+ * Create a new user
105
+ */
106
+ async createUser(options) {
107
+ try {
108
+ const response = await this.client.post('/admin/users', {
109
+ email: options.email,
110
+ password: options.password,
111
+ email_confirm: options.email_confirm ?? true,
112
+ user_metadata: options.user_metadata ?? {},
113
+ app_metadata: options.app_metadata ?? {},
114
+ }, { headers: this.getHeaders() });
115
+ return response.data;
116
+ }
117
+ catch (error) {
118
+ this.handleError(error);
119
+ }
120
+ }
121
+ /**
122
+ * Delete a user
123
+ */
124
+ async deleteUser(userId) {
125
+ try {
126
+ await this.client.delete(`/admin/users/${userId}`, { headers: this.getHeaders() });
127
+ }
128
+ catch (error) {
129
+ this.handleError(error);
130
+ }
131
+ }
132
+ /**
133
+ * Invite a user by email
134
+ */
135
+ async inviteUser(email) {
136
+ try {
137
+ const response = await this.client.post('/invite', { email }, { headers: this.getHeaders() });
138
+ return response.data;
139
+ }
140
+ catch (error) {
141
+ this.handleError(error);
142
+ }
143
+ }
144
+ }
145
+ //# sourceMappingURL=auth-admin.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-admin.driver.js","sourceRoot":"","sources":["../../src/drivers/auth-admin.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
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
+ export interface FunctionInfo {
11
+ slug: string;
12
+ name: string;
13
+ status: 'ACTIVE' | 'INACTIVE' | 'DEPLOYING' | 'ERROR';
14
+ version: number;
15
+ entrypoint_path: string;
16
+ verify_jwt: boolean;
17
+ created_at: string;
18
+ updated_at: string;
19
+ }
20
+ export interface DeployOptions {
21
+ slug: string;
22
+ entrypointPath?: string;
23
+ verifyJwt?: boolean;
24
+ /**
25
+ * Files to upload. `relativePath` (path within the function dir, e.g.
26
+ * `assets/style.css`) is preserved as the multipart filename so nested
27
+ * directory structure survives into `edge_function_files.file_path`;
28
+ * falls back to `basename(path)` when absent (flat single-file deploys).
29
+ */
30
+ files: Array<{
31
+ path: string;
32
+ relativePath?: string;
33
+ content?: string;
34
+ }>;
35
+ }
36
+ export interface FunctionsDriverOptions {
37
+ endpoint: string;
38
+ serviceRoleKey: string;
39
+ tenantId?: string;
40
+ projectRef?: string;
41
+ timeout?: number;
42
+ }
43
+ export declare class FunctionsDriver {
44
+ private client;
45
+ private serviceRoleKey;
46
+ private tenantId?;
47
+ private projectRef;
48
+ constructor(options: FunctionsDriverOptions);
49
+ private getHeaders;
50
+ private handleError;
51
+ /**
52
+ * Deploy a function
53
+ *
54
+ * IMPORTANT: metadata must be passed as a form field WITHOUT filename,
55
+ * not as a file upload. This is a common source of 400 errors.
56
+ */
57
+ deploy(options: DeployOptions): Promise<FunctionInfo>;
58
+ /**
59
+ * List all deployed functions
60
+ */
61
+ list(): Promise<FunctionInfo[]>;
62
+ /**
63
+ * Get function details
64
+ */
65
+ get(slug: string): Promise<FunctionInfo>;
66
+ /**
67
+ * Delete a function
68
+ */
69
+ delete(slug: string): Promise<void>;
70
+ /**
71
+ * Get content type based on file extension
72
+ */
73
+ private getContentType;
74
+ }
75
+ //# sourceMappingURL=functions.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/functions.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,sBAAsB;IAc3C,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,WAAW;IAgCnB;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwD3D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAarC;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAa9C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC;;OAEG;IACH,OAAO,CAAC,cAAc;CAavB"}