@polardbx/pxbaas 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.
- package/README.md +223 -2
- package/bin/pxbaas.js +13 -0
- package/dist/app/local-index.d.ts +70 -0
- package/dist/app/local-index.d.ts.map +1 -0
- package/dist/app/local-index.js +140 -0
- package/dist/app/local-index.js.map +1 -0
- package/dist/app/preflight.d.ts +61 -0
- package/dist/app/preflight.d.ts.map +1 -0
- package/dist/app/preflight.js +115 -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 +423 -0
- package/dist/app/spec-lint.js.map +1 -0
- package/dist/app/templates.d.ts +167 -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/help-guides.d.ts +17 -0
- package/dist/cli/help-guides.d.ts.map +1 -0
- package/dist/cli/help-guides.js +132 -0
- package/dist/cli/help-guides.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 +75 -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 +1907 -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 +14 -0
- package/dist/commands/completion/index.js.map +1 -0
- package/dist/commands/data/index.d.ts +55 -0
- package/dist/commands/data/index.d.ts.map +1 -0
- package/dist/commands/data/index.js +407 -0
- package/dist/commands/data/index.js.map +1 -0
- package/dist/commands/db/index.d.ts +29 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +500 -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 +7 -0
- package/dist/commands/functions/new.d.ts.map +1 -0
- package/dist/commands/functions/new.js +72 -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 +323 -0
- package/dist/commands/gen/index.js.map +1 -0
- package/dist/commands/guide/index.d.ts +8 -0
- package/dist/commands/guide/index.d.ts.map +1 -0
- package/dist/commands/guide/index.js +20 -0
- package/dist/commands/guide/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 +481 -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 +145 -0
- package/dist/commands/login/index.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 +18 -0
- package/dist/commands/profile/import-env.d.ts.map +1 -0
- package/dist/commands/profile/import-env.js +206 -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 +124 -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 +228 -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 +400 -0
- package/dist/commands/storage/index.js.map +1 -0
- package/dist/commands/tenant/index.d.ts +19 -0
- package/dist/commands/tenant/index.d.ts.map +1 -0
- package/dist/commands/tenant/index.js +667 -0
- package/dist/commands/tenant/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 +101 -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 +86 -0
- package/dist/credentials/credential-store.d.ts.map +1 -0
- package/dist/credentials/credential-store.js +282 -0
- package/dist/credentials/credential-store.js.map +1 -0
- package/dist/credentials/env-file.d.ts +85 -0
- package/dist/credentials/env-file.d.ts.map +1 -0
- package/dist/credentials/env-file.js +193 -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 +39 -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 +23 -0
- package/dist/credentials/masker.d.ts.map +1 -0
- package/dist/credentials/masker.js +40 -0
- package/dist/credentials/masker.js.map +1 -0
- package/dist/credentials/profile.d.ts +95 -0
- package/dist/credentials/profile.d.ts.map +1 -0
- package/dist/credentials/profile.js +207 -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 +29 -0
- package/dist/credentials/tty-guard.d.ts.map +1 -0
- package/dist/credentials/tty-guard.js +79 -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/introspect.d.ts +54 -0
- package/dist/db/introspect.d.ts.map +1 -0
- package/dist/db/introspect.js +140 -0
- package/dist/db/introspect.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/instance/zero-whitelist.d.ts +39 -0
- package/dist/instance/zero-whitelist.d.ts.map +1 -0
- package/dist/instance/zero-whitelist.js +67 -0
- package/dist/instance/zero-whitelist.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +69 -0
- package/dist/main.js.map +1 -0
- package/dist/skill/agents-md.d.ts +25 -0
- package/dist/skill/agents-md.d.ts.map +1 -0
- package/dist/skill/agents-md.js +62 -0
- package/dist/skill/agents-md.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 +45 -0
- package/dist/skill/hosts.d.ts.map +1 -0
- package/dist/skill/hosts.js +96 -0
- package/dist/skill/hosts.js.map +1 -0
- package/dist/skill/installer.d.ts +100 -0
- package/dist/skill/installer.d.ts.map +1 -0
- package/dist/skill/installer.js +241 -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/dist/tenant/bundle.d.ts +66 -0
- package/dist/tenant/bundle.d.ts.map +1 -0
- package/dist/tenant/bundle.js +132 -0
- package/dist/tenant/bundle.js.map +1 -0
- package/dist/tenant/guide.d.ts +50 -0
- package/dist/tenant/guide.d.ts.map +1 -0
- package/dist/tenant/guide.js +152 -0
- package/dist/tenant/guide.js.map +1 -0
- package/dist/tenant/probe.d.ts +65 -0
- package/dist/tenant/probe.d.ts.map +1 -0
- package/dist/tenant/probe.js +159 -0
- package/dist/tenant/probe.js.map +1 -0
- package/dist/tenant/verify.d.ts +37 -0
- package/dist/tenant/verify.d.ts.map +1 -0
- package/dist/tenant/verify.js +132 -0
- package/dist/tenant/verify.js.map +1 -0
- package/dist/version.d.ts +29 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +65 -0
- package/dist/version.js.map +1 -0
- package/package.json +63 -3
- package/skills/pxbaas-app-spec/SKILL.md +165 -0
- package/skills/pxbaas-app-spec/references/deploy-options.md +158 -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 +186 -0
- package/skills/pxbaas-cli/references/api-reference.md +68 -0
- package/skills/pxbaas-cli/references/app-deploy.md +186 -0
- package/skills/pxbaas-cli/references/auth-and-credentials.md +116 -0
- package/skills/pxbaas-cli/references/data-postgrest.md +101 -0
- package/skills/pxbaas-cli/references/db-and-meta.md +102 -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 +101 -0
- package/skills/pxbaas-cli/references/safety-and-two-phase.md +78 -0
- package/skills/pxbaas-cli/references/storage.md +61 -0
- package/skills/pxbaas-cli/references/tenant-admin.md +122 -0
- package/skills/pxbaas-cli/references/troubleshooting.md +76 -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 +419 -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 +38 -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 +111 -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/dist/app.js +6 -0
- package/templates/webapp/vanilla-static/frontend/dist/index.html +19 -0
- package/templates/webapp/vanilla-static/frontend/dist/style.css +43 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { CredentialStore, ProfileManager, introspectJwt, formatError, formatStatus, } from '../../credentials/index.js';
|
|
3
|
+
export function registerDoctorCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('doctor')
|
|
6
|
+
.description('Run health checks: connectivity, JWT validation, expiry, tenant status')
|
|
7
|
+
.action(async () => {
|
|
8
|
+
try {
|
|
9
|
+
await handleDoctor(program);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
console.error(formatError(message));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async function handleDoctor(program) {
|
|
19
|
+
const profileManager = new ProfileManager();
|
|
20
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
21
|
+
if (!currentProfile) {
|
|
22
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
23
|
+
}
|
|
24
|
+
const credentialStore = new CredentialStore();
|
|
25
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
26
|
+
if (!credentials) {
|
|
27
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
28
|
+
}
|
|
29
|
+
const checks = [];
|
|
30
|
+
// Check 1: Endpoint connectivity
|
|
31
|
+
checks.push(await checkEndpoint(currentProfile.endpoint, credentials.anonKey));
|
|
32
|
+
// Check 2: JWT signature (decode and validate format)
|
|
33
|
+
checks.push(await checkJwtSignature(credentials.anonKey, credentials.serviceRoleKey));
|
|
34
|
+
// Check 3: JWT expiry
|
|
35
|
+
checks.push(await checkJwtExpiry(credentials.anonKey, credentials.serviceRoleKey));
|
|
36
|
+
// Check 4: Tenant consistency (for multi-tenant)
|
|
37
|
+
if (currentProfile.mode === 'multi-tenant') {
|
|
38
|
+
checks.push(await checkTenantConsistency(currentProfile, credentials.anonKey, credentials.serviceRoleKey));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
checks.push({
|
|
42
|
+
name: 'Tenant Consistency',
|
|
43
|
+
status: 'skip',
|
|
44
|
+
detail: 'Single-tenant mode',
|
|
45
|
+
duration: 0,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Check 5: Permissions (verify anon/service role)
|
|
49
|
+
checks.push(await checkPermissions(currentProfile.endpoint, credentials.anonKey, credentials.serviceRoleKey, currentProfile.tenantId));
|
|
50
|
+
// Output results
|
|
51
|
+
const output = {
|
|
52
|
+
profile: currentProfile.name,
|
|
53
|
+
checks,
|
|
54
|
+
summary: {
|
|
55
|
+
pass: checks.filter(c => c.status === 'pass').length,
|
|
56
|
+
warn: checks.filter(c => c.status === 'warn').length,
|
|
57
|
+
fail: checks.filter(c => c.status === 'fail').length,
|
|
58
|
+
skip: checks.filter(c => c.status === 'skip').length,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
if (program.opts().json) {
|
|
62
|
+
console.log(JSON.stringify(output, null, 2));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(`Doctor Report for profile: ${currentProfile.name}\n`);
|
|
66
|
+
for (const check of checks) {
|
|
67
|
+
console.log(`${formatStatus(check.status)} ${check.name}`);
|
|
68
|
+
console.log(` ${check.detail} (${check.duration}ms)`);
|
|
69
|
+
if (check.remediation) {
|
|
70
|
+
console.log(` → ${check.remediation}`);
|
|
71
|
+
}
|
|
72
|
+
console.log();
|
|
73
|
+
}
|
|
74
|
+
console.log(`Summary: ${output.summary.pass} pass, ${output.summary.warn} warn, ${output.summary.fail} fail, ${output.summary.skip} skip`);
|
|
75
|
+
}
|
|
76
|
+
// Exit with error if any check failed
|
|
77
|
+
if (output.summary.fail > 0) {
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function checkEndpoint(endpoint, anonKey) {
|
|
82
|
+
const start = Date.now();
|
|
83
|
+
try {
|
|
84
|
+
const response = await axios.get(`${endpoint}/auth/v1/health`, {
|
|
85
|
+
headers: { apikey: anonKey },
|
|
86
|
+
timeout: 10000,
|
|
87
|
+
validateStatus: () => true, // 不抛出 HTTP 错误
|
|
88
|
+
});
|
|
89
|
+
const duration = Date.now() - start;
|
|
90
|
+
if (response.status === 200) {
|
|
91
|
+
return {
|
|
92
|
+
name: 'Endpoint Connectivity',
|
|
93
|
+
status: 'pass',
|
|
94
|
+
detail: `GET /auth/v1/health returned 200`,
|
|
95
|
+
duration,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return {
|
|
100
|
+
name: 'Endpoint Connectivity',
|
|
101
|
+
status: 'fail',
|
|
102
|
+
detail: `GET /auth/v1/health returned ${response.status}`,
|
|
103
|
+
duration,
|
|
104
|
+
remediation: 'Check endpoint URL and network connectivity',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const duration = Date.now() - start;
|
|
110
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
111
|
+
return {
|
|
112
|
+
name: 'Endpoint Connectivity',
|
|
113
|
+
status: 'fail',
|
|
114
|
+
detail: `Network error: ${message}`,
|
|
115
|
+
duration,
|
|
116
|
+
remediation: 'Check endpoint URL and network connectivity',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function checkJwtSignature(anonKey, serviceKey) {
|
|
121
|
+
const start = Date.now();
|
|
122
|
+
try {
|
|
123
|
+
const anonJwt = await introspectJwt(anonKey);
|
|
124
|
+
const serviceJwt = await introspectJwt(serviceKey);
|
|
125
|
+
const duration = Date.now() - start;
|
|
126
|
+
if (anonJwt.payload.role !== 'anon') {
|
|
127
|
+
return {
|
|
128
|
+
name: 'JWT Signature',
|
|
129
|
+
status: 'fail',
|
|
130
|
+
detail: `Anon key has role: ${anonJwt.payload.role} (expected: anon)`,
|
|
131
|
+
duration,
|
|
132
|
+
remediation: 'Verify you pasted the correct anon key',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (serviceJwt.payload.role !== 'service_role') {
|
|
136
|
+
return {
|
|
137
|
+
name: 'JWT Signature',
|
|
138
|
+
status: 'fail',
|
|
139
|
+
detail: `Service key has role: ${serviceJwt.payload.role} (expected: service_role)`,
|
|
140
|
+
duration,
|
|
141
|
+
remediation: 'Verify you pasted the correct service role key',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
name: 'JWT Signature',
|
|
146
|
+
status: 'pass',
|
|
147
|
+
detail: 'Both keys decoded successfully with correct roles',
|
|
148
|
+
duration,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
const duration = Date.now() - start;
|
|
153
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
154
|
+
return {
|
|
155
|
+
name: 'JWT Signature',
|
|
156
|
+
status: 'fail',
|
|
157
|
+
detail: `JWT decode error: ${message}`,
|
|
158
|
+
duration,
|
|
159
|
+
remediation: 'Verify you pasted complete and valid keys',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async function checkJwtExpiry(anonKey, serviceKey) {
|
|
164
|
+
const start = Date.now();
|
|
165
|
+
try {
|
|
166
|
+
const anonJwt = await introspectJwt(anonKey);
|
|
167
|
+
const serviceJwt = await introspectJwt(serviceKey);
|
|
168
|
+
const duration = Date.now() - start;
|
|
169
|
+
if (anonJwt.isExpired || serviceJwt.isExpired) {
|
|
170
|
+
return {
|
|
171
|
+
name: 'JWT Expiry',
|
|
172
|
+
status: 'fail',
|
|
173
|
+
detail: `Anon: ${anonJwt.isExpired ? 'EXPIRED' : 'valid'}, Service: ${serviceJwt.isExpired ? 'EXPIRED' : 'valid'}`,
|
|
174
|
+
duration,
|
|
175
|
+
remediation: 'Contact administrator to rotate keys',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// Warn if expiring within 7 days
|
|
179
|
+
const sevenDays = 7 * 24 * 60 * 60;
|
|
180
|
+
if (anonJwt.expiresIn < sevenDays || serviceJwt.expiresIn < sevenDays) {
|
|
181
|
+
return {
|
|
182
|
+
name: 'JWT Expiry',
|
|
183
|
+
status: 'warn',
|
|
184
|
+
detail: `Anon: ${Math.floor(anonJwt.expiresIn / 86400)}d, Service: ${Math.floor(serviceJwt.expiresIn / 86400)}d`,
|
|
185
|
+
duration,
|
|
186
|
+
remediation: 'Keys expiring soon, consider rotating',
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
name: 'JWT Expiry',
|
|
191
|
+
status: 'pass',
|
|
192
|
+
detail: `Anon: ${Math.floor(anonJwt.expiresIn / 86400)}d, Service: ${Math.floor(serviceJwt.expiresIn / 86400)}d`,
|
|
193
|
+
duration,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
const duration = Date.now() - start;
|
|
198
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
199
|
+
return {
|
|
200
|
+
name: 'JWT Expiry',
|
|
201
|
+
status: 'fail',
|
|
202
|
+
detail: `Error checking expiry: ${message}`,
|
|
203
|
+
duration,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function checkTenantConsistency(profile, anonKey, serviceKey) {
|
|
208
|
+
const start = Date.now();
|
|
209
|
+
try {
|
|
210
|
+
const anonJwt = await introspectJwt(anonKey);
|
|
211
|
+
const serviceJwt = await introspectJwt(serviceKey);
|
|
212
|
+
const duration = Date.now() - start;
|
|
213
|
+
if (anonJwt.payload.tenant_id !== profile.tenantId) {
|
|
214
|
+
return {
|
|
215
|
+
name: 'Tenant Consistency',
|
|
216
|
+
status: 'fail',
|
|
217
|
+
detail: `Profile tenant: ${profile.tenantId}, Anon JWT tenant: ${anonJwt.payload.tenant_id}`,
|
|
218
|
+
duration,
|
|
219
|
+
remediation: 'Verify you pasted keys for the correct tenant',
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (serviceJwt.payload.tenant_id !== profile.tenantId) {
|
|
223
|
+
return {
|
|
224
|
+
name: 'Tenant Consistency',
|
|
225
|
+
status: 'fail',
|
|
226
|
+
detail: `Profile tenant: ${profile.tenantId}, Service JWT tenant: ${serviceJwt.payload.tenant_id}`,
|
|
227
|
+
duration,
|
|
228
|
+
remediation: 'Verify you pasted keys for the correct tenant',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
name: 'Tenant Consistency',
|
|
233
|
+
status: 'pass',
|
|
234
|
+
detail: `All tenant IDs match: ${profile.tenantId}`,
|
|
235
|
+
duration,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
const duration = Date.now() - start;
|
|
240
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
241
|
+
return {
|
|
242
|
+
name: 'Tenant Consistency',
|
|
243
|
+
status: 'fail',
|
|
244
|
+
detail: `Error checking consistency: ${message}`,
|
|
245
|
+
duration,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function checkPermissions(endpoint, anonKey, serviceKey, tenantId) {
|
|
250
|
+
const start = Date.now();
|
|
251
|
+
try {
|
|
252
|
+
// Test anon key with REST API
|
|
253
|
+
const headers = {
|
|
254
|
+
apikey: anonKey,
|
|
255
|
+
Authorization: `Bearer ${anonKey}`,
|
|
256
|
+
};
|
|
257
|
+
if (tenantId) {
|
|
258
|
+
headers['X-Tenant-Id'] = tenantId;
|
|
259
|
+
}
|
|
260
|
+
const anonResponse = await axios.get(`${endpoint}/rest/v1/`, {
|
|
261
|
+
headers,
|
|
262
|
+
timeout: 10000,
|
|
263
|
+
validateStatus: () => true,
|
|
264
|
+
});
|
|
265
|
+
const duration = Date.now() - start;
|
|
266
|
+
// Anon key should get 200 or 401 (if no tables accessible), but not 403/500
|
|
267
|
+
if (anonResponse.status === 200 || anonResponse.status === 401) {
|
|
268
|
+
return {
|
|
269
|
+
name: 'Permissions',
|
|
270
|
+
status: 'pass',
|
|
271
|
+
detail: `Anon key: ${anonResponse.status}, Service key: not tested`,
|
|
272
|
+
duration,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
else if (anonResponse.status === 403) {
|
|
276
|
+
return {
|
|
277
|
+
name: 'Permissions',
|
|
278
|
+
status: 'warn',
|
|
279
|
+
detail: `Anon key returned 403 (tenant may be suspended)`,
|
|
280
|
+
duration,
|
|
281
|
+
remediation: 'Contact administrator',
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
return {
|
|
286
|
+
name: 'Permissions',
|
|
287
|
+
status: 'fail',
|
|
288
|
+
detail: `Anon key returned ${anonResponse.status}`,
|
|
289
|
+
duration,
|
|
290
|
+
remediation: 'Verify keys and endpoint',
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
const duration = Date.now() - start;
|
|
296
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
297
|
+
return {
|
|
298
|
+
name: 'Permissions',
|
|
299
|
+
status: 'fail',
|
|
300
|
+
detail: `Error testing permissions: ${message}`,
|
|
301
|
+
duration,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAc1E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FunctionsDriver } from '@polardbx/pxbaas-client';
|
|
2
|
+
import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
|
|
3
|
+
export function registerFunctionsDeleteCommand(functionsCmd) {
|
|
4
|
+
functionsCmd
|
|
5
|
+
.command('delete <slug>')
|
|
6
|
+
.description('Delete a deployed Edge Function')
|
|
7
|
+
.option('--json', 'Output in JSON format')
|
|
8
|
+
.action(async (slug, options) => {
|
|
9
|
+
try {
|
|
10
|
+
await handleFunctionsDelete(slug, { ...options, json: options.json || (functionsCmd.parent?.opts().json ?? false) });
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
14
|
+
console.error(formatError(message));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async function handleFunctionsDelete(slug, options) {
|
|
20
|
+
// Get current profile
|
|
21
|
+
const profileManager = new ProfileManager();
|
|
22
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
23
|
+
if (!currentProfile) {
|
|
24
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
25
|
+
}
|
|
26
|
+
// Get credentials
|
|
27
|
+
const credentialStore = new CredentialStore();
|
|
28
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
29
|
+
if (!credentials) {
|
|
30
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
31
|
+
}
|
|
32
|
+
// Validate slug
|
|
33
|
+
if (!/^[a-z0-9-]+$/.test(slug)) {
|
|
34
|
+
throw new Error('Slug must contain only lowercase letters, numbers, and hyphens');
|
|
35
|
+
}
|
|
36
|
+
// Create FunctionsDriver
|
|
37
|
+
const functionsDriver = new FunctionsDriver({
|
|
38
|
+
endpoint: currentProfile.endpoint,
|
|
39
|
+
serviceRoleKey: credentials.serviceRoleKey,
|
|
40
|
+
tenantId: currentProfile.tenantId,
|
|
41
|
+
});
|
|
42
|
+
// Delete function
|
|
43
|
+
await functionsDriver.delete(slug);
|
|
44
|
+
const output = {
|
|
45
|
+
status: 'success',
|
|
46
|
+
message: `Deleted Edge Function: ${slug}`,
|
|
47
|
+
};
|
|
48
|
+
if (options.json) {
|
|
49
|
+
console.log(JSON.stringify(output, null, 2));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(formatSuccess(`Deleted Edge Function: ${slug}`));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/functions/delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,MAAM,UAAU,8BAA8B,CAAC,YAAqB;IAClE,YAAY;SACT,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA2B,EAAE,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,qBAAqB,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,IAAY,EACZ,OAA2B;IAE3B,sBAAsB;IACtB,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;IAEhE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,kBAAkB;IAClB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE9E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,cAAc,CAAC,IAAI,uCAAuC,CAAC,CAAC;IACnH,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,yBAAyB;IACzB,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC;QAC1C,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,0BAA0B,IAAI,EAAE;KAC1C,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAsB1E"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import { FunctionsDriver } from '@polardbx/pxbaas-client';
|
|
4
|
+
import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
|
|
5
|
+
export function registerFunctionsDeployCommand(functionsCmd) {
|
|
6
|
+
functionsCmd
|
|
7
|
+
.command('deploy <slug>')
|
|
8
|
+
.description('Deploy an Edge Function to BaaS')
|
|
9
|
+
.option('--dir <directory>', 'Function directory', './functions')
|
|
10
|
+
.option('--entrypoint <path>', 'Entrypoint file', 'index.ts')
|
|
11
|
+
.option('--no-verify-jwt', 'Disable JWT verification (not recommended)')
|
|
12
|
+
.option('--json', 'Output in JSON format')
|
|
13
|
+
.action(async (slug, options) => {
|
|
14
|
+
try {
|
|
15
|
+
await handleFunctionsDeploy(slug, { ...options, json: options.json || (functionsCmd.parent?.opts().json ?? false) });
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
19
|
+
console.error(formatError(message));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async function handleFunctionsDeploy(slug, options) {
|
|
25
|
+
// Get current profile
|
|
26
|
+
const profileManager = new ProfileManager();
|
|
27
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
28
|
+
if (!currentProfile) {
|
|
29
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
30
|
+
}
|
|
31
|
+
// Get credentials
|
|
32
|
+
const credentialStore = new CredentialStore();
|
|
33
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
34
|
+
if (!credentials) {
|
|
35
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
36
|
+
}
|
|
37
|
+
// Validate slug
|
|
38
|
+
if (!/^[a-z0-9-]+$/.test(slug)) {
|
|
39
|
+
throw new Error('Slug must contain only lowercase letters, numbers, and hyphens');
|
|
40
|
+
}
|
|
41
|
+
const functionDir = join(options.dir, slug);
|
|
42
|
+
const entrypointPath = join(functionDir, options.entrypoint);
|
|
43
|
+
// Check if function directory exists
|
|
44
|
+
try {
|
|
45
|
+
await stat(functionDir);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new Error(`Function directory not found: ${functionDir}`);
|
|
49
|
+
}
|
|
50
|
+
// Check if entrypoint exists
|
|
51
|
+
try {
|
|
52
|
+
await stat(entrypointPath);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error(`Entrypoint file not found: ${entrypointPath}`);
|
|
56
|
+
}
|
|
57
|
+
// Collect all files in the function directory
|
|
58
|
+
const files = await collectFiles(functionDir, functionDir);
|
|
59
|
+
if (files.length === 0) {
|
|
60
|
+
throw new Error(`No files found in function directory: ${functionDir}`);
|
|
61
|
+
}
|
|
62
|
+
// Create FunctionsDriver
|
|
63
|
+
const functionsDriver = new FunctionsDriver({
|
|
64
|
+
endpoint: currentProfile.endpoint,
|
|
65
|
+
serviceRoleKey: credentials.serviceRoleKey,
|
|
66
|
+
tenantId: currentProfile.tenantId,
|
|
67
|
+
});
|
|
68
|
+
// Deploy
|
|
69
|
+
const functionInfo = await functionsDriver.deploy({
|
|
70
|
+
slug,
|
|
71
|
+
entrypointPath: options.entrypoint,
|
|
72
|
+
verifyJwt: options.verifyJwt,
|
|
73
|
+
files,
|
|
74
|
+
});
|
|
75
|
+
const output = {
|
|
76
|
+
status: 'success',
|
|
77
|
+
function: functionInfo,
|
|
78
|
+
};
|
|
79
|
+
if (options.json) {
|
|
80
|
+
console.log(JSON.stringify(output, null, 2));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.log(formatSuccess(`Deployed Edge Function: ${slug}`));
|
|
84
|
+
console.log(` Status: ${functionInfo.status}`);
|
|
85
|
+
console.log(` Version: ${functionInfo.version}`);
|
|
86
|
+
console.log(` Entrypoint: ${functionInfo.entrypoint_path}`);
|
|
87
|
+
console.log(` Verify JWT: ${functionInfo.verify_jwt}`);
|
|
88
|
+
console.log(` Updated: ${functionInfo.updated_at}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Recursively collect all files in a directory
|
|
93
|
+
*/
|
|
94
|
+
async function collectFiles(dir, baseDir) {
|
|
95
|
+
const files = [];
|
|
96
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
const fullPath = join(dir, entry.name);
|
|
99
|
+
if (entry.isDirectory()) {
|
|
100
|
+
// Skip node_modules and hidden directories
|
|
101
|
+
if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const subFiles = await collectFiles(fullPath, baseDir);
|
|
105
|
+
files.push(...subFiles);
|
|
106
|
+
}
|
|
107
|
+
else if (entry.isFile()) {
|
|
108
|
+
// Skip hidden files and lock files
|
|
109
|
+
if (entry.name.startsWith('.') || entry.name.endsWith('.lock')) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const relativePath = relative(baseDir, fullPath);
|
|
113
|
+
files.push({ path: fullPath, relativePath });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return files;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/functions/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUhE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { registerFunctionsNewCommand } from './new.js';
|
|
2
|
+
import { registerFunctionsDeployCommand } from './deploy.js';
|
|
3
|
+
import { registerFunctionsListCommand } from './list.js';
|
|
4
|
+
import { registerFunctionsDeleteCommand } from './delete.js';
|
|
5
|
+
export function registerFunctionsCommands(program) {
|
|
6
|
+
const functionsCmd = program
|
|
7
|
+
.command('functions')
|
|
8
|
+
.description('Edge Functions management');
|
|
9
|
+
// Register subcommands
|
|
10
|
+
registerFunctionsNewCommand(functionsCmd);
|
|
11
|
+
registerFunctionsDeployCommand(functionsCmd);
|
|
12
|
+
registerFunctionsListCommand(functionsCmd);
|
|
13
|
+
registerFunctionsDeleteCommand(functionsCmd);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAE5C,uBAAuB;IACvB,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC1C,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC7C,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAC3C,8BAA8B,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAcxE;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDpF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { FunctionsDriver } from '@polardbx/pxbaas-client';
|
|
2
|
+
import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
|
|
3
|
+
export function registerFunctionsListCommand(functionsCmd) {
|
|
4
|
+
functionsCmd
|
|
5
|
+
.command('list')
|
|
6
|
+
.description('List deployed Edge Functions')
|
|
7
|
+
.option('--json', 'Output in JSON format')
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
try {
|
|
10
|
+
await handleFunctionsList({ ...options, json: options.json || (functionsCmd.parent?.opts().json ?? false) });
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
14
|
+
console.error(formatError(message));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export async function handleFunctionsList(options) {
|
|
20
|
+
// Get current profile
|
|
21
|
+
const profileManager = new ProfileManager();
|
|
22
|
+
const currentProfile = await profileManager.getCurrentProfile();
|
|
23
|
+
if (!currentProfile) {
|
|
24
|
+
throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
|
|
25
|
+
}
|
|
26
|
+
// Get credentials
|
|
27
|
+
const credentialStore = new CredentialStore();
|
|
28
|
+
const credentials = await credentialStore.getCredentials(currentProfile.name);
|
|
29
|
+
if (!credentials) {
|
|
30
|
+
throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
|
|
31
|
+
}
|
|
32
|
+
// Create FunctionsDriver
|
|
33
|
+
const functionsDriver = new FunctionsDriver({
|
|
34
|
+
endpoint: currentProfile.endpoint,
|
|
35
|
+
serviceRoleKey: credentials.serviceRoleKey,
|
|
36
|
+
tenantId: currentProfile.tenantId,
|
|
37
|
+
});
|
|
38
|
+
// List functions
|
|
39
|
+
const functions = await functionsDriver.list();
|
|
40
|
+
const output = {
|
|
41
|
+
count: functions.length,
|
|
42
|
+
functions,
|
|
43
|
+
};
|
|
44
|
+
if (options.json) {
|
|
45
|
+
console.log(JSON.stringify(output, null, 2));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (functions.length === 0) {
|
|
49
|
+
console.log('No Edge Functions deployed.');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(formatSuccess(`Found ${functions.length} Edge Function(s):`));
|
|
53
|
+
console.log('');
|
|
54
|
+
for (const func of functions) {
|
|
55
|
+
console.log(` ${func.slug}`);
|
|
56
|
+
console.log(` Status: ${func.status}`);
|
|
57
|
+
console.log(` Version: ${func.version}`);
|
|
58
|
+
console.log(` Updated: ${func.updated_at}`);
|
|
59
|
+
console.log('');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/functions/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export declare function registerFunctionsNewCommand(functionsCmd: Command): void;
|
|
3
|
+
export declare function handleFunctionsNew(slug: string, options: {
|
|
4
|
+
dir: string;
|
|
5
|
+
entrypoint: string;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=new.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAevE;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAuDf"}
|