@polardbx/pxbaas 0.0.0-stage → 0.1.0-beta.2
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 +107 -2
- package/bin/pxbaas.js +13 -0
- package/dist/app/preflight.d.ts +38 -0
- package/dist/app/preflight.d.ts.map +1 -0
- package/dist/app/preflight.js +79 -0
- package/dist/app/preflight.js.map +1 -0
- package/dist/app/spec-lint.d.ts +45 -0
- package/dist/app/spec-lint.d.ts.map +1 -0
- package/dist/app/spec-lint.js +407 -0
- package/dist/app/spec-lint.js.map +1 -0
- package/dist/app/templates.d.ts +143 -0
- package/dist/app/templates.d.ts.map +1 -0
- package/dist/app/templates.js +151 -0
- package/dist/app/templates.js.map +1 -0
- package/dist/cli/root.d.ts +3 -0
- package/dist/cli/root.d.ts.map +1 -0
- package/dist/cli/root.js +69 -0
- package/dist/cli/root.js.map +1 -0
- package/dist/commands/app/index.d.ts +8 -0
- package/dist/commands/app/index.d.ts.map +1 -0
- package/dist/commands/app/index.js +1476 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +198 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/completion/index.d.ts +3 -0
- package/dist/commands/completion/index.d.ts.map +1 -0
- package/dist/commands/completion/index.js +10 -0
- package/dist/commands/completion/index.js.map +1 -0
- package/dist/commands/data/index.d.ts +3 -0
- package/dist/commands/data/index.d.ts.map +1 -0
- package/dist/commands/data/index.js +245 -0
- package/dist/commands/data/index.js.map +1 -0
- package/dist/commands/db/index.d.ts +15 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +389 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +3 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +305 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/functions/delete.d.ts +3 -0
- package/dist/commands/functions/delete.d.ts.map +1 -0
- package/dist/commands/functions/delete.js +55 -0
- package/dist/commands/functions/delete.js.map +1 -0
- package/dist/commands/functions/deploy.d.ts +3 -0
- package/dist/commands/functions/deploy.d.ts.map +1 -0
- package/dist/commands/functions/deploy.js +118 -0
- package/dist/commands/functions/deploy.js.map +1 -0
- package/dist/commands/functions/index.d.ts +3 -0
- package/dist/commands/functions/index.d.ts.map +1 -0
- package/dist/commands/functions/index.js +15 -0
- package/dist/commands/functions/index.js.map +1 -0
- package/dist/commands/functions/list.d.ts +6 -0
- package/dist/commands/functions/list.d.ts.map +1 -0
- package/dist/commands/functions/list.js +63 -0
- package/dist/commands/functions/list.js.map +1 -0
- package/dist/commands/functions/new.d.ts +3 -0
- package/dist/commands/functions/new.d.ts.map +1 -0
- package/dist/commands/functions/new.js +57 -0
- package/dist/commands/functions/new.js.map +1 -0
- package/dist/commands/gen/index.d.ts +3 -0
- package/dist/commands/gen/index.d.ts.map +1 -0
- package/dist/commands/gen/index.js +320 -0
- package/dist/commands/gen/index.js.map +1 -0
- package/dist/commands/instance/index.d.ts +8 -0
- package/dist/commands/instance/index.d.ts.map +1 -0
- package/dist/commands/instance/index.js +361 -0
- package/dist/commands/instance/index.js.map +1 -0
- package/dist/commands/login/index.d.ts +3 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +160 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/login/login.d.ts +3 -0
- package/dist/commands/login/login.d.ts.map +1 -0
- package/dist/commands/login/login.js +185 -0
- package/dist/commands/login/login.js.map +1 -0
- package/dist/commands/logout/index.d.ts +3 -0
- package/dist/commands/logout/index.d.ts.map +1 -0
- package/dist/commands/logout/index.js +41 -0
- package/dist/commands/logout/index.js.map +1 -0
- package/dist/commands/profile/import-env.d.ts +13 -0
- package/dist/commands/profile/import-env.d.ts.map +1 -0
- package/dist/commands/profile/import-env.js +81 -0
- package/dist/commands/profile/import-env.js.map +1 -0
- package/dist/commands/profile/index.d.ts +3 -0
- package/dist/commands/profile/index.d.ts.map +1 -0
- package/dist/commands/profile/index.js +112 -0
- package/dist/commands/profile/index.js.map +1 -0
- package/dist/commands/rest/index.d.ts +3 -0
- package/dist/commands/rest/index.d.ts.map +1 -0
- package/dist/commands/rest/index.js +102 -0
- package/dist/commands/rest/index.js.map +1 -0
- package/dist/commands/skill/index.d.ts +11 -0
- package/dist/commands/skill/index.d.ts.map +1 -0
- package/dist/commands/skill/index.js +153 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/status/index.d.ts +3 -0
- package/dist/commands/status/index.d.ts.map +1 -0
- package/dist/commands/status/index.js +59 -0
- package/dist/commands/status/index.js.map +1 -0
- package/dist/commands/storage/index.d.ts +3 -0
- package/dist/commands/storage/index.d.ts.map +1 -0
- package/dist/commands/storage/index.js +198 -0
- package/dist/commands/storage/index.js.map +1 -0
- package/dist/commands/whoami/index.d.ts +3 -0
- package/dist/commands/whoami/index.d.ts.map +1 -0
- package/dist/commands/whoami/index.js +82 -0
- package/dist/commands/whoami/index.js.map +1 -0
- package/dist/credentials/commit.d.ts +38 -0
- package/dist/credentials/commit.d.ts.map +1 -0
- package/dist/credentials/commit.js +57 -0
- package/dist/credentials/commit.js.map +1 -0
- package/dist/credentials/credential-store.d.ts +57 -0
- package/dist/credentials/credential-store.d.ts.map +1 -0
- package/dist/credentials/credential-store.js +180 -0
- package/dist/credentials/credential-store.js.map +1 -0
- package/dist/credentials/env-file.d.ts +44 -0
- package/dist/credentials/env-file.d.ts.map +1 -0
- package/dist/credentials/env-file.js +118 -0
- package/dist/credentials/env-file.js.map +1 -0
- package/dist/credentials/formatter.d.ts +39 -0
- package/dist/credentials/formatter.d.ts.map +1 -0
- package/dist/credentials/formatter.js +79 -0
- package/dist/credentials/formatter.js.map +1 -0
- package/dist/credentials/index.d.ts +13 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +13 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/jwt-introspect.d.ts +32 -0
- package/dist/credentials/jwt-introspect.d.ts.map +1 -0
- package/dist/credentials/jwt-introspect.js +64 -0
- package/dist/credentials/jwt-introspect.js.map +1 -0
- package/dist/credentials/masker.d.ts +20 -0
- package/dist/credentials/masker.d.ts.map +1 -0
- package/dist/credentials/masker.js +37 -0
- package/dist/credentials/masker.js.map +1 -0
- package/dist/credentials/profile.d.ts +83 -0
- package/dist/credentials/profile.d.ts.map +1 -0
- package/dist/credentials/profile.js +184 -0
- package/dist/credentials/profile.js.map +1 -0
- package/dist/credentials/tenant-guard.d.ts +16 -0
- package/dist/credentials/tenant-guard.d.ts.map +1 -0
- package/dist/credentials/tenant-guard.js +53 -0
- package/dist/credentials/tenant-guard.js.map +1 -0
- package/dist/credentials/tty-guard.d.ts +19 -0
- package/dist/credentials/tty-guard.d.ts.map +1 -0
- package/dist/credentials/tty-guard.js +47 -0
- package/dist/credentials/tty-guard.js.map +1 -0
- package/dist/db/apply-schema.d.ts +144 -0
- package/dist/db/apply-schema.d.ts.map +1 -0
- package/dist/db/apply-schema.js +359 -0
- package/dist/db/apply-schema.js.map +1 -0
- package/dist/db/sql-file.d.ts +104 -0
- package/dist/db/sql-file.d.ts.map +1 -0
- package/dist/db/sql-file.js +584 -0
- package/dist/db/sql-file.js.map +1 -0
- package/dist/instance/provision.d.ts +89 -0
- package/dist/instance/provision.d.ts.map +1 -0
- package/dist/instance/provision.js +139 -0
- package/dist/instance/provision.js.map +1 -0
- package/dist/instance/zero-store.d.ts +47 -0
- package/dist/instance/zero-store.d.ts.map +1 -0
- package/dist/instance/zero-store.js +91 -0
- package/dist/instance/zero-store.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +46 -0
- package/dist/main.js.map +1 -0
- package/dist/skill/assets.d.ts +38 -0
- package/dist/skill/assets.d.ts.map +1 -0
- package/dist/skill/assets.js +111 -0
- package/dist/skill/assets.js.map +1 -0
- package/dist/skill/hint.d.ts +39 -0
- package/dist/skill/hint.d.ts.map +1 -0
- package/dist/skill/hint.js +109 -0
- package/dist/skill/hint.js.map +1 -0
- package/dist/skill/hosts.d.ts +21 -0
- package/dist/skill/hosts.d.ts.map +1 -0
- package/dist/skill/hosts.js +38 -0
- package/dist/skill/hosts.js.map +1 -0
- package/dist/skill/installer.d.ts +88 -0
- package/dist/skill/installer.d.ts.map +1 -0
- package/dist/skill/installer.js +203 -0
- package/dist/skill/installer.js.map +1 -0
- package/dist/skill/ownership.d.ts +35 -0
- package/dist/skill/ownership.d.ts.map +1 -0
- package/dist/skill/ownership.js +52 -0
- package/dist/skill/ownership.js.map +1 -0
- package/package.json +63 -3
- package/skills/pxbaas-app-spec/SKILL.md +163 -0
- package/skills/pxbaas-app-spec/references/deploy-options.md +157 -0
- package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
- package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
- package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
- package/skills/pxbaas-app-spec/references/templates-examples.md +311 -0
- package/skills/pxbaas-cli/SKILL.md +171 -0
- package/skills/pxbaas-cli/references/api-reference.md +68 -0
- package/skills/pxbaas-cli/references/app-deploy.md +170 -0
- package/skills/pxbaas-cli/references/auth-and-credentials.md +100 -0
- package/skills/pxbaas-cli/references/data-postgrest.md +85 -0
- package/skills/pxbaas-cli/references/db-and-meta.md +97 -0
- package/skills/pxbaas-cli/references/edge-functions.md +71 -0
- package/skills/pxbaas-cli/references/multi-tenant-apps.md +138 -0
- package/skills/pxbaas-cli/references/provision.md +86 -0
- package/skills/pxbaas-cli/references/safety-and-two-phase.md +49 -0
- package/skills/pxbaas-cli/references/storage.md +61 -0
- package/skills/pxbaas-cli/references/troubleshooting.md +73 -0
- package/templates/webapp/api/index.ts +55 -0
- package/templates/webapp/csr-bff/README.md +81 -0
- package/templates/webapp/csr-bff/backend/index.ts +168 -0
- package/templates/webapp/csr-bff/db/rls.json +13 -0
- package/templates/webapp/csr-bff/db/schema.sql +49 -0
- package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
- package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
- package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
- package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
- package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
- package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
- package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
- package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
- package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
- package/templates/webapp/manifest.json +299 -0
- package/templates/webapp/mpa/about.html +29 -0
- package/templates/webapp/mpa/app.js +42 -0
- package/templates/webapp/mpa/index.html +42 -0
- package/templates/webapp/mpa/index.ts +60 -0
- package/templates/webapp/mpa/style.css +42 -0
- package/templates/webapp/react-vite/frontend/index.html +12 -0
- package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite/frontend/package.json +23 -0
- package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
- package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite/frontend/src/style.css +46 -0
- package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
- package/templates/webapp/react-vite-hono/backend/index.ts +21 -0
- package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
- package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
- package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
- package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
- package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
- package/templates/webapp/spa/index.ts +119 -0
- package/templates/webapp/ssr-auth/backend/index.ts +133 -0
- package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
- package/templates/webapp/ssr-blog/README.md +111 -0
- package/templates/webapp/ssr-blog/backend/index.ts +764 -0
- package/templates/webapp/ssr-blog/db/rls.json +13 -0
- package/templates/webapp/ssr-blog/db/schema.sql +51 -0
- package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
- package/templates/webapp/ssr-frameworks/README.md +64 -0
- package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
- package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
- package/templates/webapp/ssr-hono/backend/index.ts +92 -0
- package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
- package/templates/webapp/ssr-shop/README.md +80 -0
- package/templates/webapp/ssr-shop/backend/index.ts +491 -0
- package/templates/webapp/ssr-shop/db/rls.json +16 -0
- package/templates/webapp/ssr-shop/db/schema.sql +90 -0
- package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
- package/templates/webapp/vanilla-static/frontend/app.js +6 -0
- package/templates/webapp/vanilla-static/frontend/index.html +19 -0
- package/templates/webapp/vanilla-static/frontend/style.css +43 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { ZeroDriver, ZeroError } from '@polardbx/pxbaas-client';
|
|
2
|
+
import { ProfileManager } from '../../credentials/profile.js';
|
|
3
|
+
import { CredentialStore } from '../../credentials/credential-store.js';
|
|
4
|
+
import { computeFingerprint, formatError, formatSuccess, formatWarning } from '../../credentials/index.js';
|
|
5
|
+
import { ZeroStore } from '../../instance/zero-store.js';
|
|
6
|
+
import { provisionInstance, releaseInstance, } from '../../instance/provision.js';
|
|
7
|
+
/**
|
|
8
|
+
* `pxbaas provision` / `pxbaas instance` — claim and manage disposable BaaS instances
|
|
9
|
+
* from PolarDB-X Zero. Fully automatic and offline-credential-free: keys come from
|
|
10
|
+
* Zero over TLS, are stored in the keyring, and only fingerprints are shown.
|
|
11
|
+
*/
|
|
12
|
+
export function registerInstanceCommands(program) {
|
|
13
|
+
// Top-level: pxbaas provision
|
|
14
|
+
program
|
|
15
|
+
.command('provision')
|
|
16
|
+
.description('Claim a disposable BaaS instance from PolarDB-X Zero and bind it to a profile')
|
|
17
|
+
.option('--name <profile>', 'Profile name to create (default: zero-<id suffix>)')
|
|
18
|
+
.option('--whitelist-ip <ip,cidr>', 'Extra IP whitelist for the instance (default: your egress IP)')
|
|
19
|
+
.option('--no-switch', 'Create the profile but do not switch the current profile to it')
|
|
20
|
+
.option('--reuse', 'Reuse an existing active Zero instance instead of claiming a new one')
|
|
21
|
+
.option('--force', 'Overwrite an existing profile of the same name')
|
|
22
|
+
.option('--json', 'Output in JSON format')
|
|
23
|
+
.action(async (options) => {
|
|
24
|
+
try {
|
|
25
|
+
await handleProvision(options, program);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
reportError(error, options.json);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const instanceCmd = program
|
|
32
|
+
.command('instance')
|
|
33
|
+
.description('Manage Zero-provisioned BaaS instances (list/release/credentials/current)');
|
|
34
|
+
// pxbaas instance claim — alias of provision
|
|
35
|
+
instanceCmd
|
|
36
|
+
.command('claim')
|
|
37
|
+
.description('Alias of `pxbaas provision`')
|
|
38
|
+
.option('--name <profile>', 'Profile name to create')
|
|
39
|
+
.option('--whitelist-ip <ip,cidr>', 'Extra IP whitelist')
|
|
40
|
+
.option('--no-switch', 'Do not switch current profile')
|
|
41
|
+
.option('--reuse', 'Reuse an existing active instance')
|
|
42
|
+
.option('--force', 'Overwrite an existing profile of the same name')
|
|
43
|
+
.option('--json', 'Output in JSON format')
|
|
44
|
+
.action(async (options) => {
|
|
45
|
+
try {
|
|
46
|
+
await handleProvision(options, program);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
reportError(error, options.json);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
instanceCmd
|
|
53
|
+
.command('list')
|
|
54
|
+
.description('List Zero instances bound on this machine (and reconcile with Zero when a token exists)')
|
|
55
|
+
.option('--json', 'Output in JSON format')
|
|
56
|
+
.action(async (options) => {
|
|
57
|
+
try {
|
|
58
|
+
await handleList(options, program);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
reportError(error, options.json);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
instanceCmd
|
|
65
|
+
.command('release <id>')
|
|
66
|
+
.description('Release a Zero instance (destructive; two-phase, needs --confirm)')
|
|
67
|
+
.option('--keep-profile', 'Release remotely but keep the local profile/credentials')
|
|
68
|
+
.option('--confirm', 'Actually perform the release (required)')
|
|
69
|
+
.option('--json', 'Output in JSON format')
|
|
70
|
+
.action(async (id, options) => {
|
|
71
|
+
try {
|
|
72
|
+
await handleRelease(id, options, program);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
reportError(error, options.json);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
instanceCmd
|
|
79
|
+
.command('credentials <id>')
|
|
80
|
+
.description('Show a Zero instance endpoint/dashboard/fingerprints (--reveal for dashboard password)')
|
|
81
|
+
.option('--reveal', 'Also print the Dashboard password (handle with care)')
|
|
82
|
+
.option('--json', 'Output in JSON format')
|
|
83
|
+
.action(async (id, options) => {
|
|
84
|
+
try {
|
|
85
|
+
await handleCredentials(id, options, program);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
reportError(error, options.json);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
instanceCmd
|
|
92
|
+
.command('current')
|
|
93
|
+
.description('Show the Zero instance bound to the current profile (if any)')
|
|
94
|
+
.option('--json', 'Output in JSON format')
|
|
95
|
+
.action(async (options) => {
|
|
96
|
+
try {
|
|
97
|
+
await handleCurrent(options, program);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
reportError(error, options.json);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function makeDeps() {
|
|
105
|
+
return {
|
|
106
|
+
zero: new ZeroDriver(),
|
|
107
|
+
profiles: new ProfileManager(),
|
|
108
|
+
creds: new CredentialStore(),
|
|
109
|
+
store: new ZeroStore(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function isJson(options, program) {
|
|
113
|
+
return Boolean(options.json || program.opts().json);
|
|
114
|
+
}
|
|
115
|
+
function reportError(error, json) {
|
|
116
|
+
if (error instanceof ZeroError) {
|
|
117
|
+
const hint = zeroErrorHint(error.code);
|
|
118
|
+
if (json) {
|
|
119
|
+
console.log(JSON.stringify({ status: 'error', code: error.code, error: error.message, hint }, null, 2));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.error(formatError(`[${error.code}] ${error.message}`));
|
|
123
|
+
if (hint)
|
|
124
|
+
console.error(formatWarning(hint));
|
|
125
|
+
}
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
129
|
+
if (json)
|
|
130
|
+
console.log(JSON.stringify({ status: 'error', error: message }, null, 2));
|
|
131
|
+
else
|
|
132
|
+
console.error(formatError(message));
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
/** Stop-and-inform guidance for Zero capacity/rate errors (never loop-retry). */
|
|
136
|
+
function zeroErrorHint(code) {
|
|
137
|
+
switch (code) {
|
|
138
|
+
case 'SUPABASE_LIMIT_REACHED':
|
|
139
|
+
return 'You already hold the max concurrent instances. Run `pxbaas instance list`, then `pxbaas instance release <id> --confirm` to free a slot.';
|
|
140
|
+
case 'RATE_LIMIT_EXCEEDED':
|
|
141
|
+
return 'Rate limited by IP. Wait a bit before retrying; do not loop.';
|
|
142
|
+
case 'SUPABASE_POOL_EXHAUSTED':
|
|
143
|
+
return 'No instance in the pool right now. It refills automatically — retry once after 1-2 minutes.';
|
|
144
|
+
case 'SUPABASE_DISABLED':
|
|
145
|
+
return 'The Zero Supabase service is currently disabled. Report to the user; do not retry.';
|
|
146
|
+
case 'INVALID_WHITELIST_IP':
|
|
147
|
+
return 'whitelistIp must be a comma-separated list of IPv4/CIDR.';
|
|
148
|
+
case 'INSTANCE_NOT_FOUND':
|
|
149
|
+
return 'Instance not found, not owned by this token, or already released.';
|
|
150
|
+
default:
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function handleProvision(options, program) {
|
|
155
|
+
const json = isJson(options, program);
|
|
156
|
+
const deps = makeDeps();
|
|
157
|
+
const result = await provisionInstance(deps, {
|
|
158
|
+
name: options.name,
|
|
159
|
+
whitelistIp: options.whitelistIp,
|
|
160
|
+
switchProfile: options.switch, // commander sets switch=false with --no-switch
|
|
161
|
+
reuse: options.reuse,
|
|
162
|
+
force: options.force,
|
|
163
|
+
});
|
|
164
|
+
if (json) {
|
|
165
|
+
console.log(JSON.stringify(toProvisionJson(result), null, 2));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
console.log(formatSuccess(`${result.reused ? 'Reused' : 'Provisioned'} Zero instance ${result.instance.id}`));
|
|
169
|
+
console.log(` Profile: ${result.profileName}`);
|
|
170
|
+
if (result.switchedFrom && result.switchedFrom !== result.profileName) {
|
|
171
|
+
console.log(` Switched: ${result.switchedFrom} -> ${result.profileName} (switch back: pxbaas profile use ${result.switchedFrom})`);
|
|
172
|
+
}
|
|
173
|
+
console.log(` Endpoint: ${result.instance.endpoint}`);
|
|
174
|
+
if (result.instance.dashboardUrl)
|
|
175
|
+
console.log(` Dashboard: ${result.instance.dashboardUrl} (user: supabase)`);
|
|
176
|
+
console.log(` Keys: anon ${result.keys.anon.fingerprint} · service_role ${result.keys.serviceRole.fingerprint}`);
|
|
177
|
+
if (result.instance.expiresAt)
|
|
178
|
+
console.log(` Expires: ${result.instance.expiresAt} (15-day, no renewal)`);
|
|
179
|
+
if (result.instance.whitelistIp)
|
|
180
|
+
console.log(` Whitelist: ${result.instance.whitelistIp} (other IPs are rejected)`);
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log(' Next: pxbaas status --json · pxbaas db tables --json · pxbaas skill install --host <host>');
|
|
183
|
+
console.log(' Dashboard password: pxbaas instance credentials ' + result.instance.id + ' --reveal');
|
|
184
|
+
}
|
|
185
|
+
function toProvisionJson(result) {
|
|
186
|
+
return {
|
|
187
|
+
status: result.reused ? 'reused' : 'provisioned',
|
|
188
|
+
profile: result.profileName,
|
|
189
|
+
switchedFrom: result.switchedFrom,
|
|
190
|
+
instance: result.instance,
|
|
191
|
+
keys: result.keys,
|
|
192
|
+
dashboard: result.dashboard,
|
|
193
|
+
nextSteps: [
|
|
194
|
+
'pxbaas status --json',
|
|
195
|
+
'pxbaas db tables --json',
|
|
196
|
+
'pxbaas skill install --host <qoder|claude|...>',
|
|
197
|
+
`pxbaas instance credentials ${result.instance.id} --reveal`,
|
|
198
|
+
],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
async function handleList(options, program) {
|
|
202
|
+
const json = isJson(options, program);
|
|
203
|
+
const store = new ZeroStore();
|
|
204
|
+
const local = await store.listInstances();
|
|
205
|
+
const token = await store.getToken();
|
|
206
|
+
// Reconcile with Zero when we have a token (best-effort; never fail the command).
|
|
207
|
+
let remoteIds = null;
|
|
208
|
+
let remoteError;
|
|
209
|
+
if (token) {
|
|
210
|
+
try {
|
|
211
|
+
const remote = await new ZeroDriver().list(token);
|
|
212
|
+
remoteIds = remote.map((i) => i.id);
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
remoteError = e instanceof Error ? e.message : String(e);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const rows = local.map((rec) => ({
|
|
219
|
+
id: rec.id,
|
|
220
|
+
profile: rec.profileName,
|
|
221
|
+
endpoint: rec.endpoint,
|
|
222
|
+
expiresAt: rec.expiresAt ?? null,
|
|
223
|
+
expired: rec.expiresAt ? new Date(rec.expiresAt).getTime() <= Date.now() : false,
|
|
224
|
+
remotePresent: remoteIds ? remoteIds.includes(rec.id) : null,
|
|
225
|
+
}));
|
|
226
|
+
if (json) {
|
|
227
|
+
console.log(JSON.stringify({ instances: rows, reconciled: Boolean(remoteIds), remoteError }, null, 2));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (rows.length === 0) {
|
|
231
|
+
console.log(formatWarning('No Zero instances bound on this machine. Run `pxbaas provision` to claim one.'));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
for (const r of rows) {
|
|
235
|
+
const flags = [r.expired ? 'EXPIRED' : '', r.remotePresent === false ? 'released-remotely' : '']
|
|
236
|
+
.filter(Boolean)
|
|
237
|
+
.join(',');
|
|
238
|
+
console.log(`${r.id} profile=${r.profile} expires=${r.expiresAt ?? '?'}${flags ? ` [${flags}]` : ''}`);
|
|
239
|
+
}
|
|
240
|
+
if (remoteError)
|
|
241
|
+
console.log(formatWarning(`(could not reconcile with Zero: ${remoteError})`));
|
|
242
|
+
}
|
|
243
|
+
async function handleRelease(id, options, program) {
|
|
244
|
+
const json = isJson(options, program);
|
|
245
|
+
const deps = makeDeps();
|
|
246
|
+
const rec = await deps.store.getInstance(id);
|
|
247
|
+
if (!options.confirm) {
|
|
248
|
+
const preview = {
|
|
249
|
+
status: 'dry-run',
|
|
250
|
+
id,
|
|
251
|
+
profile: rec?.profileName ?? null,
|
|
252
|
+
willRemoveProfile: !options.keepProfile && Boolean(rec),
|
|
253
|
+
note: 'pass --confirm to release (destroys cloud resources; irreversible)',
|
|
254
|
+
};
|
|
255
|
+
if (json)
|
|
256
|
+
console.log(JSON.stringify(preview, null, 2));
|
|
257
|
+
else {
|
|
258
|
+
console.log(formatWarning(`Preview: release instance ${id}${rec ? ` and remove profile '${rec.profileName}'` : ''}.`));
|
|
259
|
+
console.log(' Re-run with --confirm to proceed (irreversible).');
|
|
260
|
+
}
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const result = await releaseInstance(deps, id, { removeProfile: !options.keepProfile });
|
|
264
|
+
if (json) {
|
|
265
|
+
console.log(JSON.stringify({ status: 'released', ...result }, null, 2));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
console.log(formatSuccess(`Released Zero instance ${id}`));
|
|
269
|
+
if (result.profileRemoved)
|
|
270
|
+
console.log(` Removed profile: ${result.profileRemoved}`);
|
|
271
|
+
if (result.wasCurrent)
|
|
272
|
+
console.log(formatWarning(' This was the current profile; no profile is active now. Use `pxbaas profile use <name>` or `pxbaas provision`.'));
|
|
273
|
+
}
|
|
274
|
+
async function handleCredentials(id, options, program) {
|
|
275
|
+
const json = isJson(options, program);
|
|
276
|
+
const store = new ZeroStore();
|
|
277
|
+
const rec = await store.getInstance(id);
|
|
278
|
+
if (!rec)
|
|
279
|
+
throw new Error(`No Zero instance '${id}' bound on this machine.`);
|
|
280
|
+
const creds = await new CredentialStore().getCredentials(rec.profileName);
|
|
281
|
+
const out = {
|
|
282
|
+
id: rec.id,
|
|
283
|
+
profile: rec.profileName,
|
|
284
|
+
endpoint: rec.endpoint,
|
|
285
|
+
dashboardUrl: rec.dashboardUrl ?? null,
|
|
286
|
+
dashboardUser: 'supabase',
|
|
287
|
+
expiresAt: rec.expiresAt ?? null,
|
|
288
|
+
whitelistIp: rec.whitelistIp ?? null,
|
|
289
|
+
keys: creds
|
|
290
|
+
? {
|
|
291
|
+
anon: { fingerprint: computeFingerprint(creds.anonKey), role: 'anon' },
|
|
292
|
+
serviceRole: { fingerprint: computeFingerprint(creds.serviceRoleKey), role: 'service_role' },
|
|
293
|
+
}
|
|
294
|
+
: null,
|
|
295
|
+
};
|
|
296
|
+
if (options.reveal) {
|
|
297
|
+
out.dashboardPassword = rec.dashboardPassword ?? null;
|
|
298
|
+
}
|
|
299
|
+
if (json) {
|
|
300
|
+
console.log(JSON.stringify(out, null, 2));
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
console.log(`Instance: ${rec.id}`);
|
|
304
|
+
console.log(`Profile: ${rec.profileName}`);
|
|
305
|
+
console.log(`Endpoint: ${rec.endpoint}`);
|
|
306
|
+
console.log(`Dashboard: ${rec.dashboardUrl ?? '-'} (user: supabase)`);
|
|
307
|
+
if (creds)
|
|
308
|
+
console.log(`Keys: anon ${computeFingerprint(creds.anonKey)} · service_role ${computeFingerprint(creds.serviceRoleKey)}`);
|
|
309
|
+
console.log(`Expires: ${rec.expiresAt ?? '-'}`);
|
|
310
|
+
if (options.reveal) {
|
|
311
|
+
console.log(formatWarning(`Dashboard password: ${rec.dashboardPassword ?? '-'} (do not paste into shared logs)`));
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
console.log(' (dashboard password hidden; re-run with --reveal)');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
async function handleCurrent(options, program) {
|
|
318
|
+
const json = isJson(options, program);
|
|
319
|
+
const profiles = new ProfileManager();
|
|
320
|
+
const current = await profiles.getCurrentProfile();
|
|
321
|
+
if (!current) {
|
|
322
|
+
if (json)
|
|
323
|
+
console.log(JSON.stringify({ status: 'no-profile' }, null, 2));
|
|
324
|
+
else
|
|
325
|
+
console.log(formatWarning('No active profile. Run `pxbaas provision` (Zero) or `pxbaas login` (your own instance).'));
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (current.source !== 'zero') {
|
|
329
|
+
if (json)
|
|
330
|
+
console.log(JSON.stringify({ profile: current.name, source: current.source ?? 'login', zeroInstance: null }, null, 2));
|
|
331
|
+
else
|
|
332
|
+
console.log(`Current profile '${current.name}' is your own instance (not a Zero instance).`);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const rec = await new ZeroStore().getInstance(current.zeroInstanceId ?? '');
|
|
336
|
+
if (json) {
|
|
337
|
+
// Never emit secrets (token / dashboardPassword / dbPassword) — redacted view only.
|
|
338
|
+
console.log(JSON.stringify({ profile: current.name, source: 'zero', zeroInstance: publicInstanceView(rec) }, null, 2));
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
console.log(`Current profile '${current.name}' -> Zero instance ${current.zeroInstanceId}`);
|
|
342
|
+
if (rec)
|
|
343
|
+
console.log(` Endpoint: ${rec.endpoint} Expires: ${rec.expiresAt ?? '-'}`);
|
|
344
|
+
}
|
|
345
|
+
/** Redact a stored Zero instance record for safe output (drops token & passwords). */
|
|
346
|
+
function publicInstanceView(rec) {
|
|
347
|
+
if (!rec)
|
|
348
|
+
return null;
|
|
349
|
+
return {
|
|
350
|
+
id: rec.id,
|
|
351
|
+
endpoint: rec.endpoint,
|
|
352
|
+
dashboardUrl: rec.dashboardUrl ?? null,
|
|
353
|
+
profileName: rec.profileName,
|
|
354
|
+
expiresAt: rec.expiresAt ?? null,
|
|
355
|
+
whitelistIp: rec.whitelistIp ?? null,
|
|
356
|
+
claimedAt: rec.claimedAt,
|
|
357
|
+
dashboardUser: 'supabase',
|
|
358
|
+
secretsRedacted: true,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/instance/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB3D"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { assertTty, assertNoKeyArgs, commitProfileCredentials, formatSuccess, formatError, } from '../../credentials/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* 从 stdin 读取一行(用于 --anon-key-stdin / --service-key-stdin)
|
|
5
|
+
*/
|
|
6
|
+
async function readFromStdin() {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
let data = '';
|
|
9
|
+
process.stdin.setEncoding('utf8');
|
|
10
|
+
process.stdin.on('readable', () => {
|
|
11
|
+
let chunk;
|
|
12
|
+
while ((chunk = process.stdin.read()) !== null) {
|
|
13
|
+
data += chunk;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
process.stdin.on('end', () => {
|
|
17
|
+
resolve(data.trim());
|
|
18
|
+
});
|
|
19
|
+
process.stdin.on('error', reject);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function registerLoginCommand(program) {
|
|
23
|
+
program
|
|
24
|
+
.command('login')
|
|
25
|
+
.description('Authenticate with PolarDB-X BaaS (interactive TTY only)')
|
|
26
|
+
.option('--endpoint <url>', 'BaaS endpoint URL')
|
|
27
|
+
.option('--tenant-id <id>', 'Tenant ID (for multi-tenant mode)')
|
|
28
|
+
.option('--anon-key-stdin', 'Read anon key from stdin')
|
|
29
|
+
.option('--service-key-stdin', 'Read service role key from stdin')
|
|
30
|
+
.action(async (options) => {
|
|
31
|
+
try {
|
|
32
|
+
await handleLogin(options, program);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
36
|
+
console.error(formatError(message));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function handleLogin(options, program) {
|
|
42
|
+
// 检查 argv 中是否有密钥参数(安全守卫)
|
|
43
|
+
assertNoKeyArgs(process.argv);
|
|
44
|
+
const isStdinMode = options.anonKeyStdin || options.serviceKeyStdin;
|
|
45
|
+
// 如果不是 stdin 模式,必须是 TTY
|
|
46
|
+
if (!isStdinMode) {
|
|
47
|
+
assertTty();
|
|
48
|
+
}
|
|
49
|
+
let endpoint;
|
|
50
|
+
let tenantId;
|
|
51
|
+
let anonKey;
|
|
52
|
+
let serviceRoleKey;
|
|
53
|
+
if (isStdinMode) {
|
|
54
|
+
// stdin 模式:从命令行参数或 stdin 获取
|
|
55
|
+
endpoint = options.endpoint || '';
|
|
56
|
+
tenantId = options.tenantId;
|
|
57
|
+
if (!endpoint) {
|
|
58
|
+
throw new Error('--endpoint is required when using --anon-key-stdin or --service-key-stdin');
|
|
59
|
+
}
|
|
60
|
+
if (options.anonKeyStdin && options.serviceKeyStdin) {
|
|
61
|
+
// 两个都从 stdin 读取(每行一个)
|
|
62
|
+
const lines = (await readFromStdin()).split('\n');
|
|
63
|
+
if (lines.length < 2) {
|
|
64
|
+
throw new Error('Expected two lines from stdin: anon key on first line, service role key on second line');
|
|
65
|
+
}
|
|
66
|
+
anonKey = lines[0].trim();
|
|
67
|
+
serviceRoleKey = lines[1].trim();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// 只指定了一个 --*-key-stdin:用法错误。直接报错,绝不先阻塞读 stdin
|
|
71
|
+
// (否则在 TTY 下会卡住等输入,而不是立刻提示用法)。
|
|
72
|
+
throw new Error('Both --anon-key-stdin and --service-key-stdin must be specified together');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// TTY 交互模式:使用 inquirer 提示
|
|
77
|
+
const answers = await inquirer.prompt([
|
|
78
|
+
{
|
|
79
|
+
type: 'input',
|
|
80
|
+
name: 'endpoint',
|
|
81
|
+
message: 'BaaS endpoint URL:',
|
|
82
|
+
default: options.endpoint || 'http://localhost:8000',
|
|
83
|
+
validate: (input) => {
|
|
84
|
+
if (!input.trim())
|
|
85
|
+
return 'Endpoint is required';
|
|
86
|
+
if (!input.startsWith('http://') && !input.startsWith('https://')) {
|
|
87
|
+
return 'Endpoint must start with http:// or https://';
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
type: 'input',
|
|
94
|
+
name: 'tenantId',
|
|
95
|
+
message: 'Tenant ID (leave empty for single-tenant mode):',
|
|
96
|
+
default: options.tenantId || '',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
type: 'password',
|
|
100
|
+
name: 'anonKey',
|
|
101
|
+
message: 'Anon Key:',
|
|
102
|
+
mask: '*',
|
|
103
|
+
validate: (input) => {
|
|
104
|
+
if (!input.trim())
|
|
105
|
+
return 'Anon key is required';
|
|
106
|
+
return true;
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'password',
|
|
111
|
+
name: 'serviceRoleKey',
|
|
112
|
+
message: 'Service Role Key:',
|
|
113
|
+
mask: '*',
|
|
114
|
+
validate: (input) => {
|
|
115
|
+
if (!input.trim())
|
|
116
|
+
return 'Service role key is required';
|
|
117
|
+
return true;
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
]);
|
|
121
|
+
endpoint = answers.endpoint;
|
|
122
|
+
tenantId = answers.tenantId || undefined;
|
|
123
|
+
anonKey = answers.anonKey;
|
|
124
|
+
serviceRoleKey = answers.serviceRoleKey;
|
|
125
|
+
}
|
|
126
|
+
// 解析、校验并落库 profile + 凭据(与 profile import 共用同一套逻辑)
|
|
127
|
+
// 使用全局 --profile 选项,如果未提供则使用 'default'
|
|
128
|
+
const profileName = program.opts().profile || 'default';
|
|
129
|
+
const result = await commitProfileCredentials({
|
|
130
|
+
profileName,
|
|
131
|
+
endpoint,
|
|
132
|
+
tenantId,
|
|
133
|
+
anonKey,
|
|
134
|
+
serviceRoleKey,
|
|
135
|
+
});
|
|
136
|
+
const mode = result.mode;
|
|
137
|
+
// 输出成功消息
|
|
138
|
+
if (options.json || program.opts().json) {
|
|
139
|
+
const output = {
|
|
140
|
+
status: 'success',
|
|
141
|
+
message: `Login successful for profile: ${profileName}`,
|
|
142
|
+
profile: profileName,
|
|
143
|
+
endpoint,
|
|
144
|
+
tenantId: tenantId || '(single-tenant)',
|
|
145
|
+
mode,
|
|
146
|
+
anonKeyFingerprint: result.anonKeyFingerprint,
|
|
147
|
+
serviceKeyFingerprint: result.serviceKeyFingerprint,
|
|
148
|
+
};
|
|
149
|
+
console.log(JSON.stringify(output, null, 2));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log(formatSuccess(`Login successful for profile: ${profileName}`));
|
|
153
|
+
console.log(` Endpoint: ${endpoint}`);
|
|
154
|
+
console.log(` Tenant ID: ${tenantId || '(single-tenant)'}`);
|
|
155
|
+
console.log(` Mode: ${mode}`);
|
|
156
|
+
console.log(` Anon Key: ${result.anonKeyFingerprint}`);
|
|
157
|
+
console.log(` Service Key: ${result.serviceKeyFingerprint}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/login/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB3D"}
|