@polardbx/pxbaas 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.
- 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 +1267 -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 +14 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +355 -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 +185 -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 +109 -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 +11 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +11 -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 +57 -0
- package/dist/db/apply-schema.d.ts.map +1 -0
- package/dist/db/apply-schema.js +192 -0
- package/dist/db/apply-schema.js.map +1 -0
- package/dist/db/sql-file.d.ts +49 -0
- package/dist/db/sql-file.d.ts.map +1 -0
- package/dist/db/sql-file.js +167 -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 +308 -0
- package/skills/pxbaas-cli/SKILL.md +168 -0
- package/skills/pxbaas-cli/references/api-reference.md +68 -0
- package/skills/pxbaas-cli/references/app-deploy.md +143 -0
- package/skills/pxbaas-cli/references/auth-and-credentials.md +88 -0
- package/skills/pxbaas-cli/references/data-postgrest.md +85 -0
- package/skills/pxbaas-cli/references/db-and-meta.md +85 -0
- package/skills/pxbaas-cli/references/edge-functions.md +71 -0
- package/skills/pxbaas-cli/references/multi-tenant-apps.md +107 -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/schema.sql +69 -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 +296 -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/schema.sql +71 -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/schema.sql +120 -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
- package/README.md +0 -3
|
@@ -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;AA2CpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB3D"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { CredentialStore, ProfileManager, introspectJwt, validateTenantConsistency, assertTty, assertNoKeyArgs, formatSuccess, formatError, computeFingerprint, } 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
|
+
// 解析 JWT
|
|
127
|
+
const anonJwt = await introspectJwt(anonKey);
|
|
128
|
+
const serviceJwt = await introspectJwt(serviceRoleKey);
|
|
129
|
+
// 检查 JWT 是否过期:过期凭据不可用,拒绝登录而非保存坏凭据
|
|
130
|
+
// (否则 login “成功”但后续每条命令都 401,报错还很难排查)。
|
|
131
|
+
if (anonJwt.isExpired) {
|
|
132
|
+
throw new Error('Anon key is expired. Please provide a valid (non-expired) key.');
|
|
133
|
+
}
|
|
134
|
+
if (serviceJwt.isExpired) {
|
|
135
|
+
throw new Error('Service role key is expired. Please provide a valid (non-expired) key.');
|
|
136
|
+
}
|
|
137
|
+
// 创建 profile
|
|
138
|
+
const mode = tenantId ? 'multi-tenant' : 'single-tenant';
|
|
139
|
+
// 使用全局 --profile 选项,如果未提供则使用 'default'
|
|
140
|
+
const profileName = program.opts().profile || 'default';
|
|
141
|
+
const profile = {
|
|
142
|
+
name: profileName,
|
|
143
|
+
endpoint,
|
|
144
|
+
tenantId,
|
|
145
|
+
mode,
|
|
146
|
+
createdAt: new Date().toISOString(),
|
|
147
|
+
updatedAt: new Date().toISOString(),
|
|
148
|
+
};
|
|
149
|
+
// 验证租户一致性
|
|
150
|
+
validateTenantConsistency(profile, anonJwt, serviceJwt);
|
|
151
|
+
// 保存 profile
|
|
152
|
+
const profileManager = new ProfileManager();
|
|
153
|
+
await profileManager.setProfile(profile);
|
|
154
|
+
await profileManager.useProfile(profileName);
|
|
155
|
+
// 保存凭据
|
|
156
|
+
const credentialStore = new CredentialStore();
|
|
157
|
+
await credentialStore.setCredentials(profileName, {
|
|
158
|
+
anonKey,
|
|
159
|
+
serviceRoleKey,
|
|
160
|
+
storedAt: new Date().toISOString(),
|
|
161
|
+
});
|
|
162
|
+
// 输出成功消息
|
|
163
|
+
if (options.json || program.opts().json) {
|
|
164
|
+
const output = {
|
|
165
|
+
status: 'success',
|
|
166
|
+
message: `Login successful for profile: ${profileName}`,
|
|
167
|
+
profile: profileName,
|
|
168
|
+
endpoint,
|
|
169
|
+
tenantId: tenantId || '(single-tenant)',
|
|
170
|
+
mode,
|
|
171
|
+
anonKeyFingerprint: computeFingerprint(anonKey),
|
|
172
|
+
serviceKeyFingerprint: computeFingerprint(serviceRoleKey),
|
|
173
|
+
};
|
|
174
|
+
console.log(JSON.stringify(output, null, 2));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log(formatSuccess(`Login successful for profile: ${profileName}`));
|
|
178
|
+
console.log(` Endpoint: ${endpoint}`);
|
|
179
|
+
console.log(` Tenant ID: ${tenantId || '(single-tenant)'}`);
|
|
180
|
+
console.log(` Mode: ${mode}`);
|
|
181
|
+
console.log(` Anon Key: ${computeFingerprint(anonKey)}`);
|
|
182
|
+
console.log(` Service Key: ${computeFingerprint(serviceRoleKey)}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# 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"}
|