@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.
Files changed (267) hide show
  1. package/README.md +107 -2
  2. package/bin/pxbaas.js +13 -0
  3. package/dist/app/preflight.d.ts +38 -0
  4. package/dist/app/preflight.d.ts.map +1 -0
  5. package/dist/app/preflight.js +79 -0
  6. package/dist/app/preflight.js.map +1 -0
  7. package/dist/app/spec-lint.d.ts +45 -0
  8. package/dist/app/spec-lint.d.ts.map +1 -0
  9. package/dist/app/spec-lint.js +407 -0
  10. package/dist/app/spec-lint.js.map +1 -0
  11. package/dist/app/templates.d.ts +143 -0
  12. package/dist/app/templates.d.ts.map +1 -0
  13. package/dist/app/templates.js +151 -0
  14. package/dist/app/templates.js.map +1 -0
  15. package/dist/cli/root.d.ts +3 -0
  16. package/dist/cli/root.d.ts.map +1 -0
  17. package/dist/cli/root.js +69 -0
  18. package/dist/cli/root.js.map +1 -0
  19. package/dist/commands/app/index.d.ts +8 -0
  20. package/dist/commands/app/index.d.ts.map +1 -0
  21. package/dist/commands/app/index.js +1476 -0
  22. package/dist/commands/app/index.js.map +1 -0
  23. package/dist/commands/auth/index.d.ts +3 -0
  24. package/dist/commands/auth/index.d.ts.map +1 -0
  25. package/dist/commands/auth/index.js +198 -0
  26. package/dist/commands/auth/index.js.map +1 -0
  27. package/dist/commands/completion/index.d.ts +3 -0
  28. package/dist/commands/completion/index.d.ts.map +1 -0
  29. package/dist/commands/completion/index.js +10 -0
  30. package/dist/commands/completion/index.js.map +1 -0
  31. package/dist/commands/data/index.d.ts +3 -0
  32. package/dist/commands/data/index.d.ts.map +1 -0
  33. package/dist/commands/data/index.js +245 -0
  34. package/dist/commands/data/index.js.map +1 -0
  35. package/dist/commands/db/index.d.ts +15 -0
  36. package/dist/commands/db/index.d.ts.map +1 -0
  37. package/dist/commands/db/index.js +389 -0
  38. package/dist/commands/db/index.js.map +1 -0
  39. package/dist/commands/doctor/index.d.ts +3 -0
  40. package/dist/commands/doctor/index.d.ts.map +1 -0
  41. package/dist/commands/doctor/index.js +305 -0
  42. package/dist/commands/doctor/index.js.map +1 -0
  43. package/dist/commands/functions/delete.d.ts +3 -0
  44. package/dist/commands/functions/delete.d.ts.map +1 -0
  45. package/dist/commands/functions/delete.js +55 -0
  46. package/dist/commands/functions/delete.js.map +1 -0
  47. package/dist/commands/functions/deploy.d.ts +3 -0
  48. package/dist/commands/functions/deploy.d.ts.map +1 -0
  49. package/dist/commands/functions/deploy.js +118 -0
  50. package/dist/commands/functions/deploy.js.map +1 -0
  51. package/dist/commands/functions/index.d.ts +3 -0
  52. package/dist/commands/functions/index.d.ts.map +1 -0
  53. package/dist/commands/functions/index.js +15 -0
  54. package/dist/commands/functions/index.js.map +1 -0
  55. package/dist/commands/functions/list.d.ts +6 -0
  56. package/dist/commands/functions/list.d.ts.map +1 -0
  57. package/dist/commands/functions/list.js +63 -0
  58. package/dist/commands/functions/list.js.map +1 -0
  59. package/dist/commands/functions/new.d.ts +3 -0
  60. package/dist/commands/functions/new.d.ts.map +1 -0
  61. package/dist/commands/functions/new.js +57 -0
  62. package/dist/commands/functions/new.js.map +1 -0
  63. package/dist/commands/gen/index.d.ts +3 -0
  64. package/dist/commands/gen/index.d.ts.map +1 -0
  65. package/dist/commands/gen/index.js +320 -0
  66. package/dist/commands/gen/index.js.map +1 -0
  67. package/dist/commands/instance/index.d.ts +8 -0
  68. package/dist/commands/instance/index.d.ts.map +1 -0
  69. package/dist/commands/instance/index.js +361 -0
  70. package/dist/commands/instance/index.js.map +1 -0
  71. package/dist/commands/login/index.d.ts +3 -0
  72. package/dist/commands/login/index.d.ts.map +1 -0
  73. package/dist/commands/login/index.js +160 -0
  74. package/dist/commands/login/index.js.map +1 -0
  75. package/dist/commands/login/login.d.ts +3 -0
  76. package/dist/commands/login/login.d.ts.map +1 -0
  77. package/dist/commands/login/login.js +185 -0
  78. package/dist/commands/login/login.js.map +1 -0
  79. package/dist/commands/logout/index.d.ts +3 -0
  80. package/dist/commands/logout/index.d.ts.map +1 -0
  81. package/dist/commands/logout/index.js +41 -0
  82. package/dist/commands/logout/index.js.map +1 -0
  83. package/dist/commands/profile/import-env.d.ts +13 -0
  84. package/dist/commands/profile/import-env.d.ts.map +1 -0
  85. package/dist/commands/profile/import-env.js +81 -0
  86. package/dist/commands/profile/import-env.js.map +1 -0
  87. package/dist/commands/profile/index.d.ts +3 -0
  88. package/dist/commands/profile/index.d.ts.map +1 -0
  89. package/dist/commands/profile/index.js +112 -0
  90. package/dist/commands/profile/index.js.map +1 -0
  91. package/dist/commands/rest/index.d.ts +3 -0
  92. package/dist/commands/rest/index.d.ts.map +1 -0
  93. package/dist/commands/rest/index.js +102 -0
  94. package/dist/commands/rest/index.js.map +1 -0
  95. package/dist/commands/skill/index.d.ts +11 -0
  96. package/dist/commands/skill/index.d.ts.map +1 -0
  97. package/dist/commands/skill/index.js +153 -0
  98. package/dist/commands/skill/index.js.map +1 -0
  99. package/dist/commands/status/index.d.ts +3 -0
  100. package/dist/commands/status/index.d.ts.map +1 -0
  101. package/dist/commands/status/index.js +59 -0
  102. package/dist/commands/status/index.js.map +1 -0
  103. package/dist/commands/storage/index.d.ts +3 -0
  104. package/dist/commands/storage/index.d.ts.map +1 -0
  105. package/dist/commands/storage/index.js +198 -0
  106. package/dist/commands/storage/index.js.map +1 -0
  107. package/dist/commands/whoami/index.d.ts +3 -0
  108. package/dist/commands/whoami/index.d.ts.map +1 -0
  109. package/dist/commands/whoami/index.js +82 -0
  110. package/dist/commands/whoami/index.js.map +1 -0
  111. package/dist/credentials/commit.d.ts +38 -0
  112. package/dist/credentials/commit.d.ts.map +1 -0
  113. package/dist/credentials/commit.js +57 -0
  114. package/dist/credentials/commit.js.map +1 -0
  115. package/dist/credentials/credential-store.d.ts +57 -0
  116. package/dist/credentials/credential-store.d.ts.map +1 -0
  117. package/dist/credentials/credential-store.js +180 -0
  118. package/dist/credentials/credential-store.js.map +1 -0
  119. package/dist/credentials/env-file.d.ts +44 -0
  120. package/dist/credentials/env-file.d.ts.map +1 -0
  121. package/dist/credentials/env-file.js +118 -0
  122. package/dist/credentials/env-file.js.map +1 -0
  123. package/dist/credentials/formatter.d.ts +39 -0
  124. package/dist/credentials/formatter.d.ts.map +1 -0
  125. package/dist/credentials/formatter.js +79 -0
  126. package/dist/credentials/formatter.js.map +1 -0
  127. package/dist/credentials/index.d.ts +13 -0
  128. package/dist/credentials/index.d.ts.map +1 -0
  129. package/dist/credentials/index.js +13 -0
  130. package/dist/credentials/index.js.map +1 -0
  131. package/dist/credentials/jwt-introspect.d.ts +32 -0
  132. package/dist/credentials/jwt-introspect.d.ts.map +1 -0
  133. package/dist/credentials/jwt-introspect.js +64 -0
  134. package/dist/credentials/jwt-introspect.js.map +1 -0
  135. package/dist/credentials/masker.d.ts +20 -0
  136. package/dist/credentials/masker.d.ts.map +1 -0
  137. package/dist/credentials/masker.js +37 -0
  138. package/dist/credentials/masker.js.map +1 -0
  139. package/dist/credentials/profile.d.ts +83 -0
  140. package/dist/credentials/profile.d.ts.map +1 -0
  141. package/dist/credentials/profile.js +184 -0
  142. package/dist/credentials/profile.js.map +1 -0
  143. package/dist/credentials/tenant-guard.d.ts +16 -0
  144. package/dist/credentials/tenant-guard.d.ts.map +1 -0
  145. package/dist/credentials/tenant-guard.js +53 -0
  146. package/dist/credentials/tenant-guard.js.map +1 -0
  147. package/dist/credentials/tty-guard.d.ts +19 -0
  148. package/dist/credentials/tty-guard.d.ts.map +1 -0
  149. package/dist/credentials/tty-guard.js +47 -0
  150. package/dist/credentials/tty-guard.js.map +1 -0
  151. package/dist/db/apply-schema.d.ts +144 -0
  152. package/dist/db/apply-schema.d.ts.map +1 -0
  153. package/dist/db/apply-schema.js +359 -0
  154. package/dist/db/apply-schema.js.map +1 -0
  155. package/dist/db/sql-file.d.ts +104 -0
  156. package/dist/db/sql-file.d.ts.map +1 -0
  157. package/dist/db/sql-file.js +584 -0
  158. package/dist/db/sql-file.js.map +1 -0
  159. package/dist/instance/provision.d.ts +89 -0
  160. package/dist/instance/provision.d.ts.map +1 -0
  161. package/dist/instance/provision.js +139 -0
  162. package/dist/instance/provision.js.map +1 -0
  163. package/dist/instance/zero-store.d.ts +47 -0
  164. package/dist/instance/zero-store.d.ts.map +1 -0
  165. package/dist/instance/zero-store.js +91 -0
  166. package/dist/instance/zero-store.js.map +1 -0
  167. package/dist/main.d.ts +3 -0
  168. package/dist/main.d.ts.map +1 -0
  169. package/dist/main.js +46 -0
  170. package/dist/main.js.map +1 -0
  171. package/dist/skill/assets.d.ts +38 -0
  172. package/dist/skill/assets.d.ts.map +1 -0
  173. package/dist/skill/assets.js +111 -0
  174. package/dist/skill/assets.js.map +1 -0
  175. package/dist/skill/hint.d.ts +39 -0
  176. package/dist/skill/hint.d.ts.map +1 -0
  177. package/dist/skill/hint.js +109 -0
  178. package/dist/skill/hint.js.map +1 -0
  179. package/dist/skill/hosts.d.ts +21 -0
  180. package/dist/skill/hosts.d.ts.map +1 -0
  181. package/dist/skill/hosts.js +38 -0
  182. package/dist/skill/hosts.js.map +1 -0
  183. package/dist/skill/installer.d.ts +88 -0
  184. package/dist/skill/installer.d.ts.map +1 -0
  185. package/dist/skill/installer.js +203 -0
  186. package/dist/skill/installer.js.map +1 -0
  187. package/dist/skill/ownership.d.ts +35 -0
  188. package/dist/skill/ownership.d.ts.map +1 -0
  189. package/dist/skill/ownership.js +52 -0
  190. package/dist/skill/ownership.js.map +1 -0
  191. package/package.json +63 -3
  192. package/skills/pxbaas-app-spec/SKILL.md +163 -0
  193. package/skills/pxbaas-app-spec/references/deploy-options.md +157 -0
  194. package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
  195. package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
  196. package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
  197. package/skills/pxbaas-app-spec/references/templates-examples.md +311 -0
  198. package/skills/pxbaas-cli/SKILL.md +171 -0
  199. package/skills/pxbaas-cli/references/api-reference.md +68 -0
  200. package/skills/pxbaas-cli/references/app-deploy.md +170 -0
  201. package/skills/pxbaas-cli/references/auth-and-credentials.md +100 -0
  202. package/skills/pxbaas-cli/references/data-postgrest.md +85 -0
  203. package/skills/pxbaas-cli/references/db-and-meta.md +97 -0
  204. package/skills/pxbaas-cli/references/edge-functions.md +71 -0
  205. package/skills/pxbaas-cli/references/multi-tenant-apps.md +138 -0
  206. package/skills/pxbaas-cli/references/provision.md +86 -0
  207. package/skills/pxbaas-cli/references/safety-and-two-phase.md +49 -0
  208. package/skills/pxbaas-cli/references/storage.md +61 -0
  209. package/skills/pxbaas-cli/references/troubleshooting.md +73 -0
  210. package/templates/webapp/api/index.ts +55 -0
  211. package/templates/webapp/csr-bff/README.md +81 -0
  212. package/templates/webapp/csr-bff/backend/index.ts +168 -0
  213. package/templates/webapp/csr-bff/db/rls.json +13 -0
  214. package/templates/webapp/csr-bff/db/schema.sql +49 -0
  215. package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
  216. package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
  217. package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
  218. package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
  219. package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
  220. package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
  221. package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
  222. package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
  223. package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
  224. package/templates/webapp/manifest.json +299 -0
  225. package/templates/webapp/mpa/about.html +29 -0
  226. package/templates/webapp/mpa/app.js +42 -0
  227. package/templates/webapp/mpa/index.html +42 -0
  228. package/templates/webapp/mpa/index.ts +60 -0
  229. package/templates/webapp/mpa/style.css +42 -0
  230. package/templates/webapp/react-vite/frontend/index.html +12 -0
  231. package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
  232. package/templates/webapp/react-vite/frontend/package.json +23 -0
  233. package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
  234. package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
  235. package/templates/webapp/react-vite/frontend/src/style.css +46 -0
  236. package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
  237. package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
  238. package/templates/webapp/react-vite-hono/backend/index.ts +21 -0
  239. package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
  240. package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
  241. package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
  242. package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
  243. package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
  244. package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
  245. package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
  246. package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
  247. package/templates/webapp/spa/index.ts +119 -0
  248. package/templates/webapp/ssr-auth/backend/index.ts +133 -0
  249. package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
  250. package/templates/webapp/ssr-blog/README.md +111 -0
  251. package/templates/webapp/ssr-blog/backend/index.ts +764 -0
  252. package/templates/webapp/ssr-blog/db/rls.json +13 -0
  253. package/templates/webapp/ssr-blog/db/schema.sql +51 -0
  254. package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
  255. package/templates/webapp/ssr-frameworks/README.md +64 -0
  256. package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
  257. package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
  258. package/templates/webapp/ssr-hono/backend/index.ts +92 -0
  259. package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
  260. package/templates/webapp/ssr-shop/README.md +80 -0
  261. package/templates/webapp/ssr-shop/backend/index.ts +491 -0
  262. package/templates/webapp/ssr-shop/db/rls.json +16 -0
  263. package/templates/webapp/ssr-shop/db/schema.sql +90 -0
  264. package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
  265. package/templates/webapp/vanilla-static/frontend/app.js +6 -0
  266. package/templates/webapp/vanilla-static/frontend/index.html +19 -0
  267. package/templates/webapp/vanilla-static/frontend/style.css +43 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 凭据落库共享逻辑 - login(交互/stdin)与 profile import(env 文件)复用。
3
+ *
4
+ * 统一执行:JWT 解析 → 过期校验 → 租户一致性校验 → 写 profile → 切为当前 → 写凭据。
5
+ * 只返回指纹,绝不回传明文密钥。
6
+ */
7
+ import { ProfileManager } from './profile.js';
8
+ import { CredentialStore } from './credential-store.js';
9
+ import { introspectJwt } from './jwt-introspect.js';
10
+ import { validateTenantConsistency } from './tenant-guard.js';
11
+ import { computeFingerprint } from './masker.js';
12
+ /**
13
+ * 校验并持久化一份 profile + 凭据。
14
+ *
15
+ * @throws Error 密钥过期、或 profile 与 JWT 的 tenant_id 不一致时抛出。
16
+ */
17
+ export async function commitProfileCredentials(input, deps = {}) {
18
+ const anonJwt = await introspectJwt(input.anonKey);
19
+ const serviceJwt = await introspectJwt(input.serviceRoleKey);
20
+ // 过期凭据不可用:拒绝登录而非保存坏凭据(否则后续每条命令都 401,且难排查)。
21
+ if (anonJwt.isExpired) {
22
+ throw new Error('Anon key is expired. Please provide a valid (non-expired) key.');
23
+ }
24
+ if (serviceJwt.isExpired) {
25
+ throw new Error('Service role key is expired. Please provide a valid (non-expired) key.');
26
+ }
27
+ const mode = input.tenantId ? 'multi-tenant' : 'single-tenant';
28
+ const now = new Date().toISOString();
29
+ const profile = {
30
+ name: input.profileName,
31
+ endpoint: input.endpoint,
32
+ tenantId: input.tenantId,
33
+ mode,
34
+ createdAt: now,
35
+ updatedAt: now,
36
+ };
37
+ // 校验 profile 与两把 key 的 tenant_id 一致
38
+ validateTenantConsistency(profile, anonJwt, serviceJwt);
39
+ const profileManager = deps.profileManager ?? new ProfileManager();
40
+ await profileManager.setProfile(profile);
41
+ await profileManager.useProfile(input.profileName);
42
+ const credentialStore = deps.credentialStore ?? new CredentialStore();
43
+ await credentialStore.setCredentials(input.profileName, {
44
+ anonKey: input.anonKey,
45
+ serviceRoleKey: input.serviceRoleKey,
46
+ storedAt: now,
47
+ });
48
+ return {
49
+ profileName: input.profileName,
50
+ endpoint: input.endpoint,
51
+ tenantId: input.tenantId,
52
+ mode,
53
+ anonKeyFingerprint: computeFingerprint(input.anonKey),
54
+ serviceKeyFingerprint: computeFingerprint(input.serviceRoleKey),
55
+ };
56
+ }
57
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/credentials/commit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAsC,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA4BjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAkB,EAClB,OAAmB,EAAE;IAErB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE7D,2CAA2C;IAC3C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAgB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;IAC5E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,OAAO,GAAgB;QAC3B,IAAI,EAAE,KAAK,CAAC,WAAW;QACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI;QACJ,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,oCAAoC;IACpC,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,cAAc,EAAE,CAAC;IACnE,MAAM,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,eAAe,EAAE,CAAC;IACtE,MAAM,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE;QACtD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI;QACJ,kBAAkB,EAAE,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;QACrD,qBAAqB,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC;KAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 凭据存储系统 - keytar (OS keychain) + 0600 文件双轨
3
+ */
4
+ export interface StoredCredentials {
5
+ anonKey: string;
6
+ serviceRoleKey: string;
7
+ storedAt: string;
8
+ }
9
+ /**
10
+ * 凭据存储管理器
11
+ *
12
+ * 存储策略:
13
+ * 1. 优先使用 keytar (OS keychain: macOS Keychain, Windows Credential Manager, Linux Secret Service)
14
+ * 2. keytar 不可用时回退到 ~/.baas/credentials.json (权限 0600)
15
+ */
16
+ export declare class CredentialStore {
17
+ private homeDir;
18
+ private keytarAvailable;
19
+ constructor(homeDir?: string);
20
+ /**
21
+ * 检测 keytar 是否可用
22
+ */
23
+ private checkKeytar;
24
+ /**
25
+ * 确保 ~/.baas 目录存在且权限正确
26
+ */
27
+ private ensureHomeDir;
28
+ /**
29
+ * 获取凭据文件路径
30
+ */
31
+ private getCredentialsFilePath;
32
+ /**
33
+ * 读取凭据文件
34
+ */
35
+ private readCredentialsFile;
36
+ /**
37
+ * 写入凭据文件(权限 0600)
38
+ */
39
+ private writeCredentialsFile;
40
+ /**
41
+ * 获取指定 profile 的凭据
42
+ */
43
+ getCredentials(profileName: string): Promise<StoredCredentials | null>;
44
+ /**
45
+ * 设置指定 profile 的凭据
46
+ */
47
+ setCredentials(profileName: string, credentials: StoredCredentials): Promise<void>;
48
+ /**
49
+ * 删除指定 profile 的凭据
50
+ */
51
+ deleteCredentials(profileName: string): Promise<boolean>;
52
+ /**
53
+ * 列出所有有凭据的 profile
54
+ */
55
+ listStoredProfiles(): Promise<string[]>;
56
+ }
57
+ //# sourceMappingURL=credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/credentials/credential-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAwB;gBAEnC,OAAO,CAAC,EAAE,MAAM;IAI5B;;OAEG;YACW,WAAW;IAkBzB;;OAEG;YACW,aAAa;IAM3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;YACW,mBAAmB;IAqBjC;;OAEG;YACW,oBAAoB;IAUlC;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAsB5E;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxF;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB9D;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CA4B9C"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * 凭据存储系统 - keytar (OS keychain) + 0600 文件双轨
3
+ */
4
+ import { mkdir, readFile, writeFile, chmod } from 'node:fs/promises';
5
+ import { existsSync } from 'node:fs';
6
+ import { homedir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ /**
9
+ * 凭据存储管理器
10
+ *
11
+ * 存储策略:
12
+ * 1. 优先使用 keytar (OS keychain: macOS Keychain, Windows Credential Manager, Linux Secret Service)
13
+ * 2. keytar 不可用时回退到 ~/.baas/credentials.json (权限 0600)
14
+ */
15
+ export class CredentialStore {
16
+ homeDir;
17
+ keytarAvailable = null;
18
+ constructor(homeDir) {
19
+ this.homeDir = homeDir ?? join(homedir(), '.baas');
20
+ }
21
+ /**
22
+ * 检测 keytar 是否可用
23
+ */
24
+ async checkKeytar() {
25
+ if (this.keytarAvailable !== null) {
26
+ return this.keytarAvailable;
27
+ }
28
+ try {
29
+ const keytar = await import('keytar');
30
+ // 尝试一个简单的操作来验证 keytar 工作正常
31
+ await keytar.getPassword('pxbaas-cli-test', 'test');
32
+ this.keytarAvailable = true;
33
+ }
34
+ catch {
35
+ this.keytarAvailable = false;
36
+ console.warn('Warning: keytar unavailable, falling back to file storage (~/.baas/credentials.json)');
37
+ }
38
+ return this.keytarAvailable;
39
+ }
40
+ /**
41
+ * 确保 ~/.baas 目录存在且权限正确
42
+ */
43
+ async ensureHomeDir() {
44
+ if (!existsSync(this.homeDir)) {
45
+ await mkdir(this.homeDir, { mode: 0o700, recursive: true });
46
+ }
47
+ }
48
+ /**
49
+ * 获取凭据文件路径
50
+ */
51
+ getCredentialsFilePath() {
52
+ return join(this.homeDir, 'credentials.json');
53
+ }
54
+ /**
55
+ * 读取凭据文件
56
+ */
57
+ async readCredentialsFile() {
58
+ const filePath = this.getCredentialsFilePath();
59
+ if (!existsSync(filePath)) {
60
+ return { version: 1, credentials: {} };
61
+ }
62
+ try {
63
+ const content = await readFile(filePath, 'utf-8');
64
+ const data = JSON.parse(content);
65
+ if (data.version !== 1) {
66
+ throw new Error(`Unsupported credentials file version: ${data.version}`);
67
+ }
68
+ return data;
69
+ }
70
+ catch (err) {
71
+ throw new Error(`Failed to read credentials file: ${err instanceof Error ? err.message : String(err)}`);
72
+ }
73
+ }
74
+ /**
75
+ * 写入凭据文件(权限 0600)
76
+ */
77
+ async writeCredentialsFile(data) {
78
+ await this.ensureHomeDir();
79
+ const filePath = this.getCredentialsFilePath();
80
+ const content = JSON.stringify(data, null, 2);
81
+ await writeFile(filePath, content, { mode: 0o600 });
82
+ await chmod(filePath, 0o600); // 确保权限正确
83
+ }
84
+ /**
85
+ * 获取指定 profile 的凭据
86
+ */
87
+ async getCredentials(profileName) {
88
+ const useKeytar = await this.checkKeytar();
89
+ if (useKeytar) {
90
+ try {
91
+ const keytar = await import('keytar');
92
+ const stored = await keytar.getPassword('pxbaas-cli', `credentials/${profileName}`);
93
+ if (stored) {
94
+ return JSON.parse(stored);
95
+ }
96
+ // keytar 没有存储该 profile 的凭据,回退到文件存储
97
+ }
98
+ catch (err) {
99
+ console.warn(`Warning: keytar read failed, falling back to file: ${err instanceof Error ? err.message : String(err)}`);
100
+ }
101
+ }
102
+ // 回退到文件存储
103
+ const data = await this.readCredentialsFile();
104
+ return data.credentials[profileName] ?? null;
105
+ }
106
+ /**
107
+ * 设置指定 profile 的凭据
108
+ */
109
+ async setCredentials(profileName, credentials) {
110
+ const useKeytar = await this.checkKeytar();
111
+ if (useKeytar) {
112
+ try {
113
+ const keytar = await import('keytar');
114
+ const stored = JSON.stringify(credentials);
115
+ await keytar.setPassword('pxbaas-cli', `credentials/${profileName}`, stored);
116
+ return;
117
+ }
118
+ catch (err) {
119
+ console.warn(`Warning: keytar write failed, falling back to file: ${err instanceof Error ? err.message : String(err)}`);
120
+ }
121
+ }
122
+ // 回退到文件存储
123
+ const data = await this.readCredentialsFile();
124
+ data.credentials[profileName] = credentials;
125
+ await this.writeCredentialsFile(data);
126
+ }
127
+ /**
128
+ * 删除指定 profile 的凭据
129
+ */
130
+ async deleteCredentials(profileName) {
131
+ const useKeytar = await this.checkKeytar();
132
+ let deleted = false;
133
+ if (useKeytar) {
134
+ try {
135
+ const keytar = await import('keytar');
136
+ deleted = await keytar.deletePassword('pxbaas-cli', `credentials/${profileName}`);
137
+ }
138
+ catch (err) {
139
+ console.warn(`Warning: keytar delete failed: ${err instanceof Error ? err.message : String(err)}`);
140
+ }
141
+ }
142
+ // 也从文件存储中删除
143
+ const data = await this.readCredentialsFile();
144
+ if (data.credentials[profileName]) {
145
+ delete data.credentials[profileName];
146
+ await this.writeCredentialsFile(data);
147
+ deleted = true;
148
+ }
149
+ return deleted;
150
+ }
151
+ /**
152
+ * 列出所有有凭据的 profile
153
+ */
154
+ async listStoredProfiles() {
155
+ const useKeytar = await this.checkKeytar();
156
+ const profiles = new Set();
157
+ if (useKeytar) {
158
+ try {
159
+ const keytar = await import('keytar');
160
+ const credentials = await keytar.findCredentials('pxbaas-cli');
161
+ for (const cred of credentials) {
162
+ if (cred.account.startsWith('credentials/')) {
163
+ const profileName = cred.account.slice('credentials/'.length);
164
+ profiles.add(profileName);
165
+ }
166
+ }
167
+ }
168
+ catch (err) {
169
+ console.warn(`Warning: keytar list failed: ${err instanceof Error ? err.message : String(err)}`);
170
+ }
171
+ }
172
+ // 也从文件存储中读取
173
+ const data = await this.readCredentialsFile();
174
+ for (const profileName of Object.keys(data.credentials)) {
175
+ profiles.add(profileName);
176
+ }
177
+ return Array.from(profiles);
178
+ }
179
+ }
180
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/credentials/credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Env-file 解析 - 从 Supabase/BaaS 惯例的 .env 文件里提取登录所需字段
3
+ *
4
+ * 仅覆盖单租户实例(MULTI_TENANT_MODE=false / 缺省)。多租户实例的 env 文件
5
+ * 只带 global keys,无法直接作为租户业务凭证,需走平台 API 铸造 per-tenant key,
6
+ * 该路径暂不支持(见 resolveLoginFromEnv 的显式报错)。
7
+ *
8
+ * 不引入 dotenv 依赖:项目内的 env 文件均为简单 KEY=VALUE 格式。
9
+ */
10
+ export interface ParsedEnv {
11
+ [key: string]: string;
12
+ }
13
+ /**
14
+ * 解析 env 文件文本为键值对。
15
+ *
16
+ * 支持:`#` / `//` 行注释、空行、`export KEY=VALUE` 前缀、
17
+ * 单/双引号包裹的值(双引号内不解析转义,按字面保留)、行内 `#` 注释(仅未加引号时)。
18
+ */
19
+ export declare function parseEnvText(text: string): ParsedEnv;
20
+ export interface EnvLoginFields {
21
+ endpoint: string;
22
+ anonKey: string;
23
+ serviceRoleKey: string;
24
+ /** 单租户恒为 undefined。 */
25
+ tenantId?: string;
26
+ mode: 'single-tenant';
27
+ /** 命中的来源变量名,便于诊断/输出。 */
28
+ sources: {
29
+ endpoint: string;
30
+ anonKey: string;
31
+ serviceRoleKey: string;
32
+ };
33
+ }
34
+ /**
35
+ * 从解析后的 env 中提取单租户登录字段。
36
+ *
37
+ * @param env parseEnvText 的结果
38
+ * @param options.intranet 为 true 时优先使用内网入口 SUPABASE_INTRANET_URL
39
+ * @throws Error 多租户实例、或缺少必需字段时抛出可直接展示的错误
40
+ */
41
+ export declare function resolveLoginFromEnv(env: ParsedEnv, options?: {
42
+ intranet?: boolean;
43
+ }): EnvLoginFields;
44
+ //# sourceMappingURL=env-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.d.ts","sourceRoot":"","sources":["../../src/credentials/env-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAyCpD;AAOD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;IACtB,wBAAwB;IACxB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAwBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,SAAS,EACd,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,cAAc,CA2ChB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Env-file 解析 - 从 Supabase/BaaS 惯例的 .env 文件里提取登录所需字段
3
+ *
4
+ * 仅覆盖单租户实例(MULTI_TENANT_MODE=false / 缺省)。多租户实例的 env 文件
5
+ * 只带 global keys,无法直接作为租户业务凭证,需走平台 API 铸造 per-tenant key,
6
+ * 该路径暂不支持(见 resolveLoginFromEnv 的显式报错)。
7
+ *
8
+ * 不引入 dotenv 依赖:项目内的 env 文件均为简单 KEY=VALUE 格式。
9
+ */
10
+ /**
11
+ * 解析 env 文件文本为键值对。
12
+ *
13
+ * 支持:`#` / `//` 行注释、空行、`export KEY=VALUE` 前缀、
14
+ * 单/双引号包裹的值(双引号内不解析转义,按字面保留)、行内 `#` 注释(仅未加引号时)。
15
+ */
16
+ export function parseEnvText(text) {
17
+ const env = {};
18
+ for (const rawLine of text.split(/\r?\n/)) {
19
+ const line = rawLine.trim();
20
+ if (!line || line.startsWith('#') || line.startsWith('//')) {
21
+ continue;
22
+ }
23
+ // 去掉可选的 `export ` 前缀
24
+ const withoutExport = line.replace(/^export\s+/, '');
25
+ const eq = withoutExport.indexOf('=');
26
+ if (eq === -1) {
27
+ continue; // 不是 KEY=VALUE 行,跳过
28
+ }
29
+ const key = withoutExport.slice(0, eq).trim();
30
+ if (!key) {
31
+ continue;
32
+ }
33
+ let value = withoutExport.slice(eq + 1).trim();
34
+ // 引号包裹:剥掉成对引号,值内内容原样保留(不处理行内注释)
35
+ const quoted = (value.startsWith('"') && value.endsWith('"') && value.length >= 2) ||
36
+ (value.startsWith("'") && value.endsWith("'") && value.length >= 2);
37
+ if (quoted) {
38
+ value = value.slice(1, -1);
39
+ }
40
+ else {
41
+ // 未加引号:截断行内注释(前面有空白的 # 才视为注释起点)
42
+ const commentIdx = value.search(/\s+#/);
43
+ if (commentIdx !== -1) {
44
+ value = value.slice(0, commentIdx).trim();
45
+ }
46
+ }
47
+ env[key] = value;
48
+ }
49
+ return env;
50
+ }
51
+ /** 去掉 URL 尾部斜杠,避免拼接出 //rest/v1 之类的路径。 */
52
+ function stripTrailingSlash(url) {
53
+ return url.replace(/\/+$/, '');
54
+ }
55
+ const ENDPOINT_VARS = ['SUPABASE_URL', 'SUPABASE_PUBLIC_URL', 'SUPABASE_INTRANET_URL'];
56
+ const ENDPOINT_VARS_INTRANET = ['SUPABASE_INTRANET_URL', 'SUPABASE_URL', 'SUPABASE_PUBLIC_URL'];
57
+ const ANON_VARS = ['SUPABASE_ANON_KEY', 'ANON_KEY', 'GLOBAL_ANON_KEY'];
58
+ const SERVICE_VARS = [
59
+ 'SUPABASE_SERVICE_ROLE_KEY',
60
+ 'SERVICE_ROLE_KEY',
61
+ 'GLOBAL_SERVICE_ROLE_KEY',
62
+ ];
63
+ function pickWithSource(env, keys) {
64
+ for (const k of keys) {
65
+ const v = env[k];
66
+ if (v !== undefined && v.trim() !== '') {
67
+ return { value: v.trim(), source: k };
68
+ }
69
+ }
70
+ return undefined;
71
+ }
72
+ /**
73
+ * 从解析后的 env 中提取单租户登录字段。
74
+ *
75
+ * @param env parseEnvText 的结果
76
+ * @param options.intranet 为 true 时优先使用内网入口 SUPABASE_INTRANET_URL
77
+ * @throws Error 多租户实例、或缺少必需字段时抛出可直接展示的错误
78
+ */
79
+ export function resolveLoginFromEnv(env, options = {}) {
80
+ // 多租户:暂不支持(global keys 不能直接访问租户资源)
81
+ const mtRaw = (env.MULTI_TENANT_MODE ?? '').trim().toLowerCase();
82
+ if (mtRaw === 'true' || mtRaw === '1' || mtRaw === 'yes') {
83
+ throw new Error('Multi-tenant instances are not supported by `profile import` yet ' +
84
+ '(MULTI_TENANT_MODE=true). The env file only carries global keys, which cannot ' +
85
+ 'access tenant resources. Use `pxbaas login` with per-tenant anon/service keys instead.');
86
+ }
87
+ const endpointVars = options.intranet ? ENDPOINT_VARS_INTRANET : ENDPOINT_VARS;
88
+ const endpointHit = pickWithSource(env, endpointVars);
89
+ const anonHit = pickWithSource(env, ANON_VARS);
90
+ const serviceHit = pickWithSource(env, SERVICE_VARS);
91
+ const missing = [];
92
+ if (!endpointHit)
93
+ missing.push(`endpoint (${endpointVars.join(' | ')})`);
94
+ if (!anonHit)
95
+ missing.push(`anon key (${ANON_VARS.join(' | ')})`);
96
+ if (!serviceHit)
97
+ missing.push(`service role key (${SERVICE_VARS.join(' | ')})`);
98
+ if (missing.length > 0) {
99
+ throw new Error(`Env file is missing required variable(s): ${missing.join('; ')}`);
100
+ }
101
+ const endpoint = stripTrailingSlash(endpointHit.value);
102
+ if (!/^https?:\/\//.test(endpoint)) {
103
+ throw new Error(`Endpoint from ${endpointHit.source} must start with http:// or https:// (got: ${endpoint})`);
104
+ }
105
+ return {
106
+ endpoint,
107
+ anonKey: anonHit.value,
108
+ serviceRoleKey: serviceHit.value,
109
+ tenantId: undefined,
110
+ mode: 'single-tenant',
111
+ sources: {
112
+ endpoint: endpointHit.source,
113
+ anonKey: anonHit.source,
114
+ serviceRoleKey: serviceHit.source,
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=env-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/credentials/env-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 输出格式化器 - text/json 双模式
3
+ */
4
+ export interface FormatOptions {
5
+ json: boolean;
6
+ }
7
+ /**
8
+ * 格式化输出
9
+ * - JSON 模式:直接 stringify
10
+ * - Text 模式:使用 chalk + cli-table3 渲染
11
+ */
12
+ export declare function formatOutput(data: Record<string, unknown>, options: FormatOptions): string;
13
+ /**
14
+ * 格式化键值对(text 模式)
15
+ */
16
+ export declare function formatKeyValue(pairs: Record<string, string>): string;
17
+ /**
18
+ * 格式化表格
19
+ */
20
+ export declare function formatTable(headers: string[], rows: string[][], options?: {
21
+ head?: string[];
22
+ }): string;
23
+ /**
24
+ * 格式化状态标记
25
+ */
26
+ export declare function formatStatus(status: 'pass' | 'warn' | 'fail' | 'skip'): string;
27
+ /**
28
+ * 格式化成功消息
29
+ */
30
+ export declare function formatSuccess(message: string): string;
31
+ /**
32
+ * 格式化错误消息
33
+ */
34
+ export declare function formatError(message: string): string;
35
+ /**
36
+ * 格式化警告消息
37
+ */
38
+ export declare function formatWarning(message: string): string;
39
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/credentials/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,aAAa,GACrB,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAUpE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5B,MAAM,CAcR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAW9E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * 输出格式化器 - text/json 双模式
3
+ */
4
+ import chalk from 'chalk';
5
+ import Table from 'cli-table3';
6
+ /**
7
+ * 格式化输出
8
+ * - JSON 模式:直接 stringify
9
+ * - Text 模式:使用 chalk + cli-table3 渲染
10
+ */
11
+ export function formatOutput(data, options) {
12
+ if (options.json) {
13
+ return JSON.stringify(data, null, 2);
14
+ }
15
+ // Text 模式:键值对展示
16
+ return formatKeyValue(data);
17
+ }
18
+ /**
19
+ * 格式化键值对(text 模式)
20
+ */
21
+ export function formatKeyValue(pairs) {
22
+ const lines = [];
23
+ const maxKeyLength = Math.max(...Object.keys(pairs).map(k => k.length));
24
+ for (const [key, value] of Object.entries(pairs)) {
25
+ const paddedKey = key.padEnd(maxKeyLength, ' ');
26
+ lines.push(`${chalk.gray(paddedKey)} ${value}`);
27
+ }
28
+ return lines.join('\n');
29
+ }
30
+ /**
31
+ * 格式化表格
32
+ */
33
+ export function formatTable(headers, rows, options) {
34
+ const table = new Table({
35
+ head: options?.head ?? headers.map(h => chalk.cyan(h)),
36
+ style: {
37
+ head: [],
38
+ border: [],
39
+ },
40
+ });
41
+ for (const row of rows) {
42
+ table.push(row);
43
+ }
44
+ return table.toString();
45
+ }
46
+ /**
47
+ * 格式化状态标记
48
+ */
49
+ export function formatStatus(status) {
50
+ switch (status) {
51
+ case 'pass':
52
+ return chalk.green('✓ PASS');
53
+ case 'warn':
54
+ return chalk.yellow('⚠ WARN');
55
+ case 'fail':
56
+ return chalk.red('✗ FAIL');
57
+ case 'skip':
58
+ return chalk.gray('- SKIP');
59
+ }
60
+ }
61
+ /**
62
+ * 格式化成功消息
63
+ */
64
+ export function formatSuccess(message) {
65
+ return chalk.green('✓') + ' ' + message;
66
+ }
67
+ /**
68
+ * 格式化错误消息
69
+ */
70
+ export function formatError(message) {
71
+ return chalk.red('✗') + ' ' + message;
72
+ }
73
+ /**
74
+ * 格式化警告消息
75
+ */
76
+ export function formatWarning(message) {
77
+ return chalk.yellow('⚠') + ' ' + message;
78
+ }
79
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/credentials/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAM/B;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,IAA6B,EAC7B,OAAsB;IAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,gBAAgB;IAChB,OAAO,cAAc,CAAC,IAA8B,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAA6B;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAExE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAiB,EACjB,IAAgB,EAChB,OAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,EAAE;YACL,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACX;KACF,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAyC;IACpE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Credentials 模块 - 凭据管理、JWT 解析、守卫工具
3
+ */
4
+ export * from './credential-store.js';
5
+ export * from './profile.js';
6
+ export * from './jwt-introspect.js';
7
+ export * from './masker.js';
8
+ export * from './tty-guard.js';
9
+ export * from './tenant-guard.js';
10
+ export * from './env-file.js';
11
+ export * from './commit.js';
12
+ export * from './formatter.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Credentials 模块 - 凭据管理、JWT 解析、守卫工具
3
+ */
4
+ export * from './credential-store.js';
5
+ export * from './profile.js';
6
+ export * from './jwt-introspect.js';
7
+ export * from './masker.js';
8
+ export * from './tty-guard.js';
9
+ export * from './tenant-guard.js';
10
+ export * from './env-file.js';
11
+ export * from './commit.js';
12
+ export * from './formatter.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}