@supatype/cli 0.1.0 → 0.1.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 (331) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +121 -86
  3. package/.turbo/turbo-typecheck.log +2 -2
  4. package/dist/binary-cache.d.ts +2 -0
  5. package/dist/binary-cache.d.ts.map +1 -1
  6. package/dist/binary-cache.js +36 -0
  7. package/dist/binary-cache.js.map +1 -1
  8. package/dist/binary-download-lock.d.ts +12 -0
  9. package/dist/binary-download-lock.d.ts.map +1 -0
  10. package/dist/binary-download-lock.js +106 -0
  11. package/dist/binary-download-lock.js.map +1 -0
  12. package/dist/cli-package-version.d.ts +3 -0
  13. package/dist/cli-package-version.d.ts.map +1 -0
  14. package/dist/cli-package-version.js +15 -0
  15. package/dist/cli-package-version.js.map +1 -0
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +5 -2
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/add.js +25 -19
  20. package/dist/commands/add.js.map +1 -1
  21. package/dist/commands/admin.d.ts +28 -1
  22. package/dist/commands/admin.d.ts.map +1 -1
  23. package/dist/commands/admin.js +290 -112
  24. package/dist/commands/admin.js.map +1 -1
  25. package/dist/commands/cache.d.ts +1 -1
  26. package/dist/commands/cache.d.ts.map +1 -1
  27. package/dist/commands/cache.js +98 -5
  28. package/dist/commands/cache.js.map +1 -1
  29. package/dist/commands/dev.d.ts.map +1 -1
  30. package/dist/commands/dev.js +28 -22
  31. package/dist/commands/dev.js.map +1 -1
  32. package/dist/commands/init.d.ts +8 -4
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +278 -139
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/link-helpers.d.ts.map +1 -1
  37. package/dist/commands/link-helpers.js +26 -25
  38. package/dist/commands/link-helpers.js.map +1 -1
  39. package/dist/commands/push.js +3 -3
  40. package/dist/commands/push.js.map +1 -1
  41. package/dist/compose-local-server-image.d.ts +13 -0
  42. package/dist/compose-local-server-image.d.ts.map +1 -0
  43. package/dist/compose-local-server-image.js +57 -0
  44. package/dist/compose-local-server-image.js.map +1 -0
  45. package/dist/compose-rename.d.ts +10 -0
  46. package/dist/compose-rename.d.ts.map +1 -0
  47. package/dist/compose-rename.js +64 -0
  48. package/dist/compose-rename.js.map +1 -0
  49. package/dist/dev-compose.d.ts.map +1 -1
  50. package/dist/dev-compose.js +138 -97
  51. package/dist/dev-compose.js.map +1 -1
  52. package/dist/dev-log-bus.d.ts +5 -0
  53. package/dist/dev-log-bus.d.ts.map +1 -1
  54. package/dist/dev-log-bus.js +14 -0
  55. package/dist/dev-log-bus.js.map +1 -1
  56. package/dist/dev-log-filter.d.ts +4 -0
  57. package/dist/dev-log-filter.d.ts.map +1 -1
  58. package/dist/dev-log-filter.js +52 -0
  59. package/dist/dev-log-filter.js.map +1 -1
  60. package/dist/dev-ports.d.ts +27 -0
  61. package/dist/dev-ports.d.ts.map +1 -0
  62. package/dist/dev-ports.js +178 -0
  63. package/dist/dev-ports.js.map +1 -0
  64. package/dist/dev-ready-panel.d.ts +19 -0
  65. package/dist/dev-ready-panel.d.ts.map +1 -0
  66. package/dist/dev-ready-panel.js +49 -0
  67. package/dist/dev-ready-panel.js.map +1 -0
  68. package/dist/dev-session-lock.d.ts +25 -0
  69. package/dist/dev-session-lock.d.ts.map +1 -0
  70. package/dist/dev-session-lock.js +78 -0
  71. package/dist/dev-session-lock.js.map +1 -0
  72. package/dist/dev-session.d.ts +18 -5
  73. package/dist/dev-session.d.ts.map +1 -1
  74. package/dist/dev-session.js +91 -18
  75. package/dist/dev-session.js.map +1 -1
  76. package/dist/dev-shutdown.d.ts +20 -2
  77. package/dist/dev-shutdown.d.ts.map +1 -1
  78. package/dist/dev-shutdown.js +88 -10
  79. package/dist/dev-shutdown.js.map +1 -1
  80. package/dist/dev-task-colors.d.ts +3 -1
  81. package/dist/dev-task-colors.d.ts.map +1 -1
  82. package/dist/dev-task-colors.js +23 -3
  83. package/dist/dev-task-colors.js.map +1 -1
  84. package/dist/docker-runtime.js +1 -1
  85. package/dist/docker-runtime.js.map +1 -1
  86. package/dist/engine-push-output.d.ts +1 -0
  87. package/dist/engine-push-output.d.ts.map +1 -1
  88. package/dist/engine-push-output.js +4 -1
  89. package/dist/engine-push-output.js.map +1 -1
  90. package/dist/ensure-binary.d.ts.map +1 -1
  91. package/dist/ensure-binary.js +14 -2
  92. package/dist/ensure-binary.js.map +1 -1
  93. package/dist/ensure-component-binaries.d.ts +17 -0
  94. package/dist/ensure-component-binaries.d.ts.map +1 -0
  95. package/dist/ensure-component-binaries.js +45 -0
  96. package/dist/ensure-component-binaries.js.map +1 -0
  97. package/dist/ensure-dev-api-config.d.ts +3 -0
  98. package/dist/ensure-dev-api-config.d.ts.map +1 -0
  99. package/dist/ensure-dev-api-config.js +17 -0
  100. package/dist/ensure-dev-api-config.js.map +1 -0
  101. package/dist/env-file.d.ts +5 -0
  102. package/dist/env-file.d.ts.map +1 -0
  103. package/dist/env-file.js +33 -0
  104. package/dist/env-file.js.map +1 -0
  105. package/dist/init-dependency-versions.d.ts +13 -0
  106. package/dist/init-dependency-versions.d.ts.map +1 -0
  107. package/dist/init-dependency-versions.js +53 -0
  108. package/dist/init-dependency-versions.js.map +1 -0
  109. package/dist/init-package-json.d.ts +21 -0
  110. package/dist/init-package-json.d.ts.map +1 -0
  111. package/dist/init-package-json.js +46 -0
  112. package/dist/init-package-json.js.map +1 -0
  113. package/dist/postgres-ctl.d.ts.map +1 -1
  114. package/dist/postgres-ctl.js +2 -1
  115. package/dist/postgres-ctl.js.map +1 -1
  116. package/dist/required-host-components.d.ts +11 -0
  117. package/dist/required-host-components.d.ts.map +1 -0
  118. package/dist/required-host-components.js +25 -0
  119. package/dist/required-host-components.js.map +1 -0
  120. package/dist/resolve-api-url.d.ts +6 -0
  121. package/dist/resolve-api-url.d.ts.map +1 -0
  122. package/dist/resolve-api-url.js +39 -0
  123. package/dist/resolve-api-url.js.map +1 -0
  124. package/dist/rest-cache-admin.d.ts +33 -0
  125. package/dist/rest-cache-admin.d.ts.map +1 -0
  126. package/dist/rest-cache-admin.js +96 -0
  127. package/dist/rest-cache-admin.js.map +1 -0
  128. package/dist/scripts/postinstall.d.ts +4 -6
  129. package/dist/scripts/postinstall.d.ts.map +1 -1
  130. package/dist/scripts/postinstall.js +8 -41
  131. package/dist/scripts/postinstall.js.map +1 -1
  132. package/dist/self-host-compose.d.ts.map +1 -1
  133. package/dist/self-host-compose.js +24 -13
  134. package/dist/self-host-compose.js.map +1 -1
  135. package/dist/studio-dev-server.d.ts +4 -2
  136. package/dist/studio-dev-server.d.ts.map +1 -1
  137. package/dist/studio-dev-server.js +3 -2
  138. package/dist/studio-dev-server.js.map +1 -1
  139. package/dist/ui/brand.d.ts +2 -5
  140. package/dist/ui/brand.d.ts.map +1 -1
  141. package/dist/ui/brand.js +2 -7
  142. package/dist/ui/brand.js.map +1 -1
  143. package/dist/ui/clack-api.d.ts +44 -0
  144. package/dist/ui/clack-api.d.ts.map +1 -0
  145. package/dist/ui/clack-api.js +76 -0
  146. package/dist/ui/clack-api.js.map +1 -0
  147. package/dist/ui/clack.d.ts +14 -0
  148. package/dist/ui/clack.d.ts.map +1 -0
  149. package/dist/ui/clack.js +147 -0
  150. package/dist/ui/clack.js.map +1 -0
  151. package/dist/ui/components/FlowSpinner.d.ts +5 -0
  152. package/dist/ui/components/FlowSpinner.d.ts.map +1 -0
  153. package/dist/ui/components/FlowSpinner.js +8 -0
  154. package/dist/ui/components/FlowSpinner.js.map +1 -0
  155. package/dist/ui/components/LogoWordmark.d.ts +9 -0
  156. package/dist/ui/components/LogoWordmark.d.ts.map +1 -0
  157. package/dist/ui/components/LogoWordmark.js +17 -0
  158. package/dist/ui/components/LogoWordmark.js.map +1 -0
  159. package/dist/ui/components/PromptPanel.d.ts +5 -0
  160. package/dist/ui/components/PromptPanel.d.ts.map +1 -0
  161. package/dist/ui/components/PromptPanel.js +7 -0
  162. package/dist/ui/components/PromptPanel.js.map +1 -0
  163. package/dist/ui/components/SelectField.d.ts +11 -0
  164. package/dist/ui/components/SelectField.d.ts.map +1 -0
  165. package/dist/ui/components/SelectField.js +19 -0
  166. package/dist/ui/components/SelectField.js.map +1 -0
  167. package/dist/ui/confirm.d.ts +2 -1
  168. package/dist/ui/confirm.d.ts.map +1 -1
  169. package/dist/ui/confirm.js +4 -4
  170. package/dist/ui/confirm.js.map +1 -1
  171. package/dist/ui/dev/DevDashboard.d.ts +8 -0
  172. package/dist/ui/dev/DevDashboard.d.ts.map +1 -0
  173. package/dist/ui/dev/DevDashboard.js +151 -0
  174. package/dist/ui/dev/DevDashboard.js.map +1 -0
  175. package/dist/ui/dev/DevReadyPanelView.d.ts +7 -0
  176. package/dist/ui/dev/DevReadyPanelView.d.ts.map +1 -0
  177. package/dist/ui/dev/DevReadyPanelView.js +29 -0
  178. package/dist/ui/dev/DevReadyPanelView.js.map +1 -0
  179. package/dist/ui/fatal.d.ts.map +1 -1
  180. package/dist/ui/fatal.js +5 -11
  181. package/dist/ui/fatal.js.map +1 -1
  182. package/dist/ui/flows/FlowApp.d.ts +8 -0
  183. package/dist/ui/flows/FlowApp.d.ts.map +1 -0
  184. package/dist/ui/flows/FlowApp.js +42 -0
  185. package/dist/ui/flows/FlowApp.js.map +1 -0
  186. package/dist/ui/flows/prompt-fields.d.ts +48 -0
  187. package/dist/ui/flows/prompt-fields.d.ts.map +1 -0
  188. package/dist/ui/flows/prompt-fields.js +88 -0
  189. package/dist/ui/flows/prompt-fields.js.map +1 -0
  190. package/dist/ui/flows/types.d.ts +41 -0
  191. package/dist/ui/flows/types.d.ts.map +1 -0
  192. package/dist/ui/flows/types.js +2 -0
  193. package/dist/ui/flows/types.js.map +1 -0
  194. package/dist/ui/index.d.ts +1 -1
  195. package/dist/ui/index.js +1 -1
  196. package/dist/ui/messages.d.ts +1 -0
  197. package/dist/ui/messages.d.ts.map +1 -1
  198. package/dist/ui/messages.js +48 -8
  199. package/dist/ui/messages.js.map +1 -1
  200. package/dist/ui/progress.d.ts +5 -1
  201. package/dist/ui/progress.d.ts.map +1 -1
  202. package/dist/ui/progress.js +12 -3
  203. package/dist/ui/progress.js.map +1 -1
  204. package/dist/ui/prompts.d.ts +7 -5
  205. package/dist/ui/prompts.d.ts.map +1 -1
  206. package/dist/ui/prompts.js +15 -8
  207. package/dist/ui/prompts.js.map +1 -1
  208. package/dist/ui/runtime/cancel.d.ts +4 -0
  209. package/dist/ui/runtime/cancel.d.ts.map +1 -0
  210. package/dist/ui/runtime/cancel.js +6 -0
  211. package/dist/ui/runtime/cancel.js.map +1 -0
  212. package/dist/ui/runtime/command-chrome.d.ts +17 -0
  213. package/dist/ui/runtime/command-chrome.d.ts.map +1 -0
  214. package/dist/ui/runtime/command-chrome.js +123 -0
  215. package/dist/ui/runtime/command-chrome.js.map +1 -0
  216. package/dist/ui/runtime/dev-prompt-queue.d.ts +30 -0
  217. package/dist/ui/runtime/dev-prompt-queue.d.ts.map +1 -0
  218. package/dist/ui/runtime/dev-prompt-queue.js +57 -0
  219. package/dist/ui/runtime/dev-prompt-queue.js.map +1 -0
  220. package/dist/ui/runtime/flow-session.d.ts +4 -0
  221. package/dist/ui/runtime/flow-session.d.ts.map +1 -0
  222. package/dist/ui/runtime/flow-session.js +8 -0
  223. package/dist/ui/runtime/flow-session.js.map +1 -0
  224. package/dist/ui/runtime/run-clack-flow.d.ts +5 -0
  225. package/dist/ui/runtime/run-clack-flow.d.ts.map +1 -0
  226. package/dist/ui/runtime/run-clack-flow.js +34 -0
  227. package/dist/ui/runtime/run-clack-flow.js.map +1 -0
  228. package/dist/ui/theme.d.ts +24 -0
  229. package/dist/ui/theme.d.ts.map +1 -0
  230. package/dist/ui/theme.js +34 -0
  231. package/dist/ui/theme.js.map +1 -0
  232. package/dist/valkey-sidecar.d.ts +17 -0
  233. package/dist/valkey-sidecar.d.ts.map +1 -0
  234. package/dist/valkey-sidecar.js +94 -0
  235. package/dist/valkey-sidecar.js.map +1 -0
  236. package/package.json +11 -3
  237. package/src/binary-cache.ts +61 -0
  238. package/src/binary-download-lock.ts +124 -0
  239. package/src/cli-package-version.ts +15 -0
  240. package/src/cli.ts +6 -2
  241. package/src/commands/add.ts +26 -19
  242. package/src/commands/admin.ts +380 -137
  243. package/src/commands/cache.ts +105 -5
  244. package/src/commands/dev.ts +29 -21
  245. package/src/commands/init.ts +217 -46
  246. package/src/commands/link-helpers.ts +30 -29
  247. package/src/commands/push.ts +3 -3
  248. package/src/compose-local-server-image.ts +68 -0
  249. package/src/compose-rename.ts +73 -0
  250. package/src/dev-compose.ts +175 -96
  251. package/src/dev-log-bus.ts +18 -0
  252. package/src/dev-log-filter.ts +42 -0
  253. package/src/dev-ports.ts +223 -0
  254. package/src/dev-ready-panel.ts +63 -0
  255. package/src/dev-session-lock.ts +98 -0
  256. package/src/dev-session.ts +98 -18
  257. package/src/dev-shutdown.ts +114 -9
  258. package/src/dev-task-colors.ts +22 -3
  259. package/src/docker-runtime.ts +1 -1
  260. package/src/engine-push-output.ts +5 -1
  261. package/src/ensure-binary.ts +21 -1
  262. package/src/ensure-component-binaries.ts +71 -0
  263. package/src/ensure-dev-api-config.ts +18 -0
  264. package/src/env-file.ts +37 -0
  265. package/src/init-dependency-versions.ts +69 -0
  266. package/src/init-package-json.ts +63 -0
  267. package/src/postgres-ctl.ts +2 -1
  268. package/src/required-host-components.ts +37 -0
  269. package/src/resolve-api-url.ts +43 -0
  270. package/src/rest-cache-admin.ts +135 -0
  271. package/src/scripts/postinstall.ts +9 -46
  272. package/src/self-host-compose.ts +23 -12
  273. package/src/studio-dev-server.ts +5 -4
  274. package/src/ui/README.md +13 -9
  275. package/src/ui/brand.ts +2 -8
  276. package/src/ui/clack-api.ts +123 -0
  277. package/src/ui/clack.ts +153 -0
  278. package/src/ui/components/FlowSpinner.tsx +15 -0
  279. package/src/ui/components/LogoWordmark.tsx +36 -0
  280. package/src/ui/components/PromptPanel.tsx +17 -0
  281. package/src/ui/components/SelectField.tsx +58 -0
  282. package/src/ui/confirm.ts +5 -4
  283. package/src/ui/dev/DevDashboard.tsx +213 -0
  284. package/src/ui/dev/DevReadyPanelView.tsx +67 -0
  285. package/src/ui/fatal.ts +5 -10
  286. package/src/ui/flows/FlowApp.tsx +67 -0
  287. package/src/ui/flows/prompt-fields.tsx +192 -0
  288. package/src/ui/flows/types.ts +50 -0
  289. package/src/ui/index.ts +1 -1
  290. package/src/ui/messages.ts +50 -8
  291. package/src/ui/progress.ts +14 -3
  292. package/src/ui/prompts.ts +17 -9
  293. package/src/ui/runtime/cancel.ts +6 -0
  294. package/src/ui/runtime/command-chrome.ts +147 -0
  295. package/src/ui/runtime/dev-prompt-queue.ts +84 -0
  296. package/src/ui/runtime/flow-session.ts +11 -0
  297. package/src/ui/runtime/run-clack-flow.tsx +52 -0
  298. package/src/ui/theme.ts +41 -0
  299. package/src/valkey-sidecar.ts +126 -0
  300. package/tests/admin-ensure.test.ts +59 -0
  301. package/tests/binary-cache-cloud-overrides.test.ts +2 -2
  302. package/tests/binary-download-lock.test.ts +41 -0
  303. package/tests/cli-help.test.ts +7 -4
  304. package/tests/cli-package-version.test.ts +15 -0
  305. package/tests/command-chrome-coverage.test.ts +149 -0
  306. package/tests/command-chrome-wrap.test.ts +51 -0
  307. package/tests/config.test.ts +8 -4
  308. package/tests/dev-ports.test.ts +41 -0
  309. package/tests/dev-ready-panel.test.ts +20 -0
  310. package/tests/dev-session-lock.test.ts +54 -0
  311. package/tests/dev-ui.test.ts +66 -3
  312. package/tests/docker-runtime.test.ts +9 -20
  313. package/tests/ensure-dev-api-config.test.ts +22 -0
  314. package/tests/init-dependency-versions.test.ts +62 -0
  315. package/tests/init-package-json.test.ts +18 -0
  316. package/tests/init.test.ts +30 -3
  317. package/tests/required-host-components.test.ts +51 -0
  318. package/tests/resolve-api-url.test.ts +23 -0
  319. package/tests/rest-cache-admin.test.ts +28 -0
  320. package/tests/runtime-contract.test.ts +12 -3
  321. package/tests/tsconfig.json +8 -2
  322. package/tests/ui-confirm.test.ts +13 -9
  323. package/tests/ui-messages.test.ts +4 -18
  324. package/tsconfig.json +1 -0
  325. package/tsconfig.tsbuildinfo +1 -1
  326. package/vitest.config.ts +3 -0
  327. package/dist/dev-tui.d.ts +0 -24
  328. package/dist/dev-tui.d.ts.map +0 -1
  329. package/dist/dev-tui.js +0 -188
  330. package/dist/dev-tui.js.map +0 -1
  331. package/src/dev-tui.ts +0 -232
@@ -1,15 +1,23 @@
1
1
  // ─── Admin panel CLI commands (Gap Appendices task 48) ──────────────────────
2
2
  //
3
3
  // `npx supatype admin create-user` — create an admin user in the project's
4
- // {ref}_auth.users table. Used for initial setup and ongoing admin management.
5
- import { randomBytes, scrypt } from "node:crypto";
6
- import { promisify } from "node:util";
4
+ // auth.users table. First admin is ensured on `supatype dev` or `supatype push`.
5
+ import { spawnSync } from "node:child_process";
6
+ import { existsSync } from "node:fs";
7
+ import { dirname, join, resolve } from "node:path";
8
+ import bcrypt from "bcryptjs";
7
9
  import { loadConfig } from "../config.js";
8
- import { connectionString } from "../project-config.js";
10
+ import { connectionString, resolveRuntimeProvider, } from "../project-config.js";
11
+ import { readEnvValue, upsertEnvFile } from "../env-file.js";
12
+ import { hasEngineOverride } from "../binary-cache.js";
9
13
  import { confirm as uiConfirm } from "../ui/confirm.js";
10
14
  import { error, info, plain } from "../ui/messages.js";
11
- import { promptText } from "../ui/prompts.js";
12
- const scryptAsync = promisify(scrypt);
15
+ import { promptPassword, promptText } from "../ui/prompts.js";
16
+ import { isInteractive } from "../ui/interactive.js";
17
+ import { getActiveDevSession, } from "../dev-session.js";
18
+ export const ADMIN_EMAIL_ENV = "SUPATYPE_ADMIN_EMAIL";
19
+ export const ADMIN_PASSWORD_ENV = "SUPATYPE_ADMIN_PASSWORD";
20
+ const BCRYPT_ROUNDS = 10;
13
21
  export function registerAdmin(program) {
14
22
  const adminCmd = program
15
23
  .command("admin")
@@ -37,58 +45,11 @@ export function registerAdmin(program) {
37
45
  }
38
46
  const role = opts.role;
39
47
  info(`Creating admin user: ${email} (role: ${role})...`);
40
- // We use pg directly to insert into the auth.users table
41
48
  const pg = await importPg();
42
49
  const pool = new pg.Pool({ connectionString: connection, max: 2 });
43
50
  try {
44
- // Ensure the auth schema and users table exist
45
- await pool.query(`
46
- CREATE SCHEMA IF NOT EXISTS auth;
47
-
48
- CREATE TABLE IF NOT EXISTS auth.users (
49
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
50
- instance_id UUID,
51
- aud TEXT DEFAULT 'authenticated',
52
- role TEXT DEFAULT 'authenticated',
53
- email TEXT UNIQUE,
54
- encrypted_password TEXT,
55
- email_confirmed_at TIMESTAMPTZ DEFAULT now(),
56
- raw_app_meta_data JSONB DEFAULT '{}',
57
- raw_user_meta_data JSONB DEFAULT '{}',
58
- created_at TIMESTAMPTZ DEFAULT now(),
59
- updated_at TIMESTAMPTZ DEFAULT now(),
60
- confirmation_token TEXT DEFAULT '',
61
- recovery_token TEXT DEFAULT '',
62
- email_change_token_new TEXT DEFAULT '',
63
- email_change TEXT DEFAULT ''
64
- );
65
- `);
66
- // Check if user already exists
67
- const existing = await pool.query(`SELECT id FROM auth.users WHERE email = $1`, [email.toLowerCase()]);
68
- if (existing.rows.length > 0) {
69
- error(`User with email "${email}" already exists.`);
70
- info(`To update their role, use: supatype admin set-role --email ${email} --role ${role}`);
71
- process.exit(1);
72
- }
73
- // Hash the password (bcrypt-style for GoTrue compatibility)
74
- const passwordHash = await hashPassword(password);
75
- // Insert the admin user with the admin role in app_metadata
76
- const appMetadata = JSON.stringify({ role, provider: "email", providers: ["email"] });
77
- const userMetadata = JSON.stringify({});
78
- const result = await pool.query(`INSERT INTO auth.users (
79
- email, encrypted_password, role, aud,
80
- raw_app_meta_data, raw_user_meta_data,
81
- email_confirmed_at, created_at, updated_at
82
- ) VALUES (
83
- $1, $2, 'authenticated', 'authenticated',
84
- $3::jsonb, $4::jsonb,
85
- now(), now(), now()
86
- ) RETURNING id, email`, [email.toLowerCase(), passwordHash, appMetadata, userMetadata]);
87
- const user = result.rows[0];
88
- info("Admin user created successfully.");
89
- plain(` ID: ${user.id}`);
90
- plain(` Email: ${user.email}`);
91
- plain(` Role: ${role}`);
51
+ await ensureAuthUsersTable(pool);
52
+ await createAdminUser(pool, email, password, role);
92
53
  info("This user can now log in to the admin panel at /admin");
93
54
  }
94
55
  catch (err) {
@@ -177,69 +138,291 @@ export function registerAdmin(program) {
177
138
  }
178
139
  });
179
140
  }
180
- // ─── First admin user prompt (task 48) ──────────────────────────────────────
181
- // Called by `supatype push` on initial setup if no admin users exist.
182
- export async function promptFirstAdminUser(connection) {
141
+ /** @deprecated Use ensureFirstAdminUser */
142
+ export const promptFirstAdminUser = ensureFirstAdminUser;
143
+ /**
144
+ * Ensure a first admin user exists (idempotent). Called from `dev` and `push`
145
+ * when auth.users is ready and no admin users exist yet.
146
+ */
147
+ export async function ensureFirstAdminUser(connection, options = {}) {
183
148
  const pg = await importPg();
184
149
  const pool = new pg.Pool({ connectionString: connection, max: 2 });
185
150
  try {
186
- // Check if auth.users table exists
187
- const tableExists = await pool.query(`SELECT EXISTS (
188
- SELECT FROM information_schema.tables
189
- WHERE table_schema = 'auth' AND table_name = 'users'
190
- ) as exists`);
191
- if (!tableExists.rows[0]?.exists)
192
- return;
193
- // Check if any admin users exist
194
- const adminCount = await pool.query(`SELECT COUNT(*) as count FROM auth.users
195
- WHERE raw_app_meta_data->>'role' IS NOT NULL
196
- AND raw_app_meta_data->>'role' != 'authenticated'`);
197
- const count = parseInt(adminCount.rows[0].count, 10);
198
- if (count > 0)
199
- return;
200
- // No admin users — prompt to create one
201
- info("No admin users found for the admin panel.");
202
- const createAdmin = await uiConfirm("Create an admin user now?");
203
- if (!createAdmin) {
204
- info("Skipped. You can create one later with: supatype admin create-user");
205
- return;
151
+ await ensureFirstAdminWithQuery((sql, params) => pool.query(sql, params), options);
152
+ }
153
+ catch {
154
+ // Non-fatal skip when DB is unreachable or auth schema is not ready
155
+ }
156
+ finally {
157
+ await pool.end();
158
+ }
159
+ }
160
+ /**
161
+ * Resolve DB access for the current project (host URL or compose exec when DB
162
+ * is not published to the host).
163
+ */
164
+ export async function ensureFirstAdminUserForProject(cwd, config, options = {}) {
165
+ const root = resolve(cwd);
166
+ const merged = { cwd: root, ...options };
167
+ if (resolveRuntimeProvider(config) === "docker" &&
168
+ merged.compose &&
169
+ !hasEngineOverride(config)) {
170
+ try {
171
+ await ensureFirstAdminWithQuery((sql, params) => composeExecQuery(root, merged.compose, sql, params), merged);
172
+ }
173
+ catch {
174
+ // Non-fatal
175
+ }
176
+ return;
177
+ }
178
+ const connection = merged.compose && hasEngineOverride(config)
179
+ ? hostComposeDbUrlFromEnv(root)
180
+ : options.connection ?? readEnvValue(root, "DATABASE_URL", connectionString(config));
181
+ await ensureFirstAdminUser(connection, merged);
182
+ }
183
+ async function ensureFirstAdminWithQuery(query, options) {
184
+ const cwd = options.cwd ? resolve(options.cwd) : process.cwd();
185
+ if (!(await authUsersTableExists(query)))
186
+ return;
187
+ if (await hasAdminUsers(query))
188
+ return;
189
+ const credentials = await resolveAdminCredentials(options, cwd);
190
+ if (!credentials) {
191
+ if (!isInteractive()) {
192
+ info("No admin users found. Set SUPATYPE_ADMIN_EMAIL / SUPATYPE_ADMIN_PASSWORD in .env, " +
193
+ "or run: supatype admin create-user");
194
+ }
195
+ return;
196
+ }
197
+ const role = options.role ?? "admin";
198
+ try {
199
+ await createAdminUser(query, credentials.email, credentials.password, role, { quiet: true });
200
+ }
201
+ catch (err) {
202
+ const message = err instanceof Error ? err.message : String(err);
203
+ error(`Failed to create admin user: ${message}`);
204
+ return;
205
+ }
206
+ clearAdminSeedPassword(cwd);
207
+ logFirstAdminCreated(credentials.email, role);
208
+ }
209
+ function logFirstAdminCreated(email, role) {
210
+ if (getActiveDevSession()?.isTui()) {
211
+ console.log(`Admin user "${email}" created (role: ${role}).`);
212
+ console.log("Log in at /admin after starting the dev server.");
213
+ return;
214
+ }
215
+ info(`Admin user "${email}" created (role: ${role}).`);
216
+ info("Log in at /admin after starting the dev server.");
217
+ }
218
+ async function resolveAdminCredentials(options, cwd) {
219
+ const envEmail = options.email ?? readEnvValue(cwd, ADMIN_EMAIL_ENV, "").trim();
220
+ const envPassword = options.password ?? readEnvValue(cwd, ADMIN_PASSWORD_ENV, "").trim();
221
+ if (envEmail && envPassword) {
222
+ if (!envEmail.includes("@")) {
223
+ info("Invalid admin email in .env. Skipping admin user creation.");
224
+ return null;
206
225
  }
207
- const email = await promptText("Admin email");
208
- if (!email || !email.includes("@")) {
209
- info("Invalid email. Skipping admin user creation.");
210
- return;
226
+ if (envPassword.length < 8) {
227
+ info("Admin password in .env is too short (min 8 chars). Skipping.");
228
+ return null;
211
229
  }
212
- const password = await promptText("Admin password (min 8 chars)");
213
- if (!password || password.length < 8) {
214
- info("Password too short. Skipping admin user creation.");
215
- return;
230
+ return { email: envEmail, password: envPassword };
231
+ }
232
+ if (!isInteractive())
233
+ return null;
234
+ info("No admin users found for the admin panel.");
235
+ const createAdmin = await uiConfirm("Create an admin user now?");
236
+ if (!createAdmin) {
237
+ info("Skipped. You can create one later with: supatype admin create-user");
238
+ return null;
239
+ }
240
+ const email = await promptText("Admin email");
241
+ if (!email || !email.includes("@")) {
242
+ info("Invalid email. Skipping admin user creation.");
243
+ return null;
244
+ }
245
+ const password = await promptPassword("Admin password (min 8 chars)");
246
+ if (!password || password.length < 8) {
247
+ info("Password too short. Skipping admin user creation.");
248
+ return null;
249
+ }
250
+ return { email, password };
251
+ }
252
+ export function clearAdminSeedPassword(cwd) {
253
+ upsertEnvFile(cwd, {}, [ADMIN_PASSWORD_ENV]);
254
+ }
255
+ export async function hashPasswordForAuth(password) {
256
+ return bcrypt.hash(password, BCRYPT_ROUNDS);
257
+ }
258
+ async function createAdminUser(db, email, password, role, opts = {}) {
259
+ const query = typeof db.query === "function"
260
+ ? (sql, params) => db.query(sql, params)
261
+ : db;
262
+ const normalized = email.toLowerCase();
263
+ const existing = await query(`SELECT id FROM auth.users WHERE email = $1`, [
264
+ normalized,
265
+ ]);
266
+ if (existing.rows.length > 0) {
267
+ throw new Error(`User with email "${email}" already exists.`);
268
+ }
269
+ const passwordHash = await hashPasswordForAuth(password);
270
+ const appMetadata = JSON.stringify({
271
+ role,
272
+ provider: "email",
273
+ providers: ["email"],
274
+ });
275
+ const userMetadata = JSON.stringify({});
276
+ const result = await query(`INSERT INTO auth.users (
277
+ id, email, encrypted_password, role, aud,
278
+ raw_app_meta_data, raw_user_meta_data,
279
+ email_confirmed_at, created_at, updated_at
280
+ ) VALUES (
281
+ gen_random_uuid(), $1, $2, 'authenticated', 'authenticated',
282
+ $3::jsonb, $4::jsonb,
283
+ now(), now(), now()
284
+ ) RETURNING id, email`, [normalized, passwordHash, appMetadata, userMetadata]);
285
+ const user = result.rows[0];
286
+ if (!opts.quiet) {
287
+ info("Admin user created successfully.");
288
+ plain(` ID: ${user.id}`);
289
+ plain(` Email: ${user.email}`);
290
+ plain(` Role: ${role}`);
291
+ }
292
+ return user;
293
+ }
294
+ async function ensureAuthUsersTable(pool) {
295
+ await pool.query(`
296
+ CREATE SCHEMA IF NOT EXISTS auth;
297
+
298
+ CREATE TABLE IF NOT EXISTS auth.users (
299
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
300
+ instance_id UUID,
301
+ aud TEXT DEFAULT 'authenticated',
302
+ role TEXT DEFAULT 'authenticated',
303
+ email TEXT UNIQUE,
304
+ encrypted_password TEXT,
305
+ email_confirmed_at TIMESTAMPTZ DEFAULT now(),
306
+ raw_app_meta_data JSONB DEFAULT '{}',
307
+ raw_user_meta_data JSONB DEFAULT '{}',
308
+ created_at TIMESTAMPTZ DEFAULT now(),
309
+ updated_at TIMESTAMPTZ DEFAULT now(),
310
+ confirmation_token TEXT DEFAULT '',
311
+ recovery_token TEXT DEFAULT '',
312
+ email_change_token_new TEXT DEFAULT '',
313
+ email_change TEXT DEFAULT ''
314
+ );
315
+ `);
316
+ }
317
+ async function authUsersTableExists(query) {
318
+ const result = await query(`SELECT EXISTS (
319
+ SELECT FROM information_schema.tables
320
+ WHERE table_schema = 'auth' AND table_name = 'users'
321
+ ) as exists`);
322
+ return Boolean(result.rows[0]?.exists);
323
+ }
324
+ async function hasAdminUsers(query) {
325
+ const adminCount = await query(`SELECT COUNT(*)::int as count FROM auth.users
326
+ WHERE raw_app_meta_data->>'role' IS NOT NULL
327
+ AND raw_app_meta_data->>'role' != 'authenticated'`);
328
+ const count = adminCount.rows[0]?.count ?? 0;
329
+ return count > 0;
330
+ }
331
+ function composeExecQuery(cwd, compose, sql, params = []) {
332
+ const db = readEnvValue(cwd, "POSTGRES_DB", "supatype");
333
+ const user = readEnvValue(cwd, "POSTGRES_USER", "supatype_admin");
334
+ const envFile = join(cwd, ".env");
335
+ const composeDir = dirname(compose.composePath);
336
+ const args = [
337
+ "compose",
338
+ "-p",
339
+ compose.project,
340
+ "--project-directory",
341
+ cwd,
342
+ "-f",
343
+ compose.composePath,
344
+ ];
345
+ if (existsSync(envFile))
346
+ args.push("--env-file", envFile);
347
+ if (params.length === 0) {
348
+ args.push("exec", "-T", "db", "psql", "-U", user, "-d", db, "-tAc", sql);
349
+ const result = spawnSync("docker", args, { cwd: composeDir, encoding: "utf8" });
350
+ if (result.status !== 0) {
351
+ throw new Error((result.stderr ?? result.stdout ?? "compose psql failed").trim());
352
+ }
353
+ const text = (result.stdout ?? "").trim();
354
+ if (sql.trim().toUpperCase().startsWith("SELECT")) {
355
+ return Promise.resolve({
356
+ rows: parsePsqlScalarRows(sql, text),
357
+ rowCount: 1,
358
+ command: "SELECT",
359
+ oid: 0,
360
+ fields: [],
361
+ });
216
362
  }
217
- const passwordHash = await hashPassword(password);
218
- const appMetadata = JSON.stringify({
219
- role: "admin",
220
- provider: "email",
221
- providers: ["email"],
363
+ return Promise.resolve({
364
+ rows: [],
365
+ rowCount: 0,
366
+ command: "INSERT",
367
+ oid: 0,
368
+ fields: [],
222
369
  });
223
- await pool.query(`INSERT INTO auth.users (
224
- email, encrypted_password, role, aud,
225
- raw_app_meta_data, raw_user_meta_data,
226
- email_confirmed_at, created_at, updated_at
227
- ) VALUES (
228
- $1, $2, 'authenticated', 'authenticated',
229
- $3::jsonb, '{}'::jsonb,
230
- now(), now(), now()
231
- )`, [email.toLowerCase(), passwordHash, appMetadata]);
232
- info(`Admin user "${email}" created (role: admin).`);
233
- info("Log in at /admin after starting the dev server.");
234
370
  }
235
- catch {
236
- // Non-fatal if auth schema doesn't exist yet, skip silently
371
+ args.push("exec", "-T", "db", "psql", "-U", user, "-d", db, "-v", "ON_ERROR_STOP=1", "-c", interpolateSql(sql, params));
372
+ const result = spawnSync("docker", args, { cwd: composeDir, encoding: "utf8" });
373
+ if (result.status !== 0) {
374
+ throw new Error((result.stderr ?? result.stdout ?? "compose psql failed").trim());
237
375
  }
238
- finally {
239
- await pool.end();
376
+ const stdout = (result.stdout ?? "").trim();
377
+ const idMatch = stdout.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\s+\|\s+(.+)/i);
378
+ if (idMatch) {
379
+ return Promise.resolve({
380
+ rows: [{ id: idMatch[1], email: idMatch[2]?.trim() }],
381
+ rowCount: 1,
382
+ command: "INSERT",
383
+ oid: 0,
384
+ fields: [],
385
+ });
386
+ }
387
+ return Promise.resolve({
388
+ rows: [],
389
+ rowCount: 0,
390
+ command: "INSERT",
391
+ oid: 0,
392
+ fields: [],
393
+ });
394
+ }
395
+ function parsePsqlScalarRows(sql, text) {
396
+ const upper = sql.toUpperCase();
397
+ if (upper.includes(" AS EXISTS")) {
398
+ return [{ exists: text === "t" }];
240
399
  }
400
+ if (upper.includes(" AS COUNT")) {
401
+ return [{ count: Number.parseInt(text, 10) || 0 }];
402
+ }
403
+ if (text === "")
404
+ return [];
405
+ return [{ value: text }];
406
+ }
407
+ function interpolateSql(sql, params) {
408
+ return sql.replace(/\$(\d+)/g, (_match, index) => {
409
+ const value = params[Number(index) - 1];
410
+ if (value === null || value === undefined)
411
+ return "NULL";
412
+ if (typeof value === "number" || typeof value === "bigint")
413
+ return String(value);
414
+ if (typeof value === "boolean")
415
+ return value ? "TRUE" : "FALSE";
416
+ return `'${String(value).replace(/'/g, "''")}'`;
417
+ });
418
+ }
419
+ function hostComposeDbUrlFromEnv(cwd) {
420
+ const port = readEnvValue(cwd, "SUPATYPE_DEV_DB_PORT", "54329");
421
+ const user = readEnvValue(cwd, "POSTGRES_USER", "supatype_admin");
422
+ const pass = readEnvValue(cwd, "POSTGRES_PASSWORD", "postgres");
423
+ const db = readEnvValue(cwd, "POSTGRES_DB", "supatype");
424
+ return `postgresql://${user}:${pass}@127.0.0.1:${port}/${db}?sslmode=disable`;
241
425
  }
242
- // ─── Helpers ────────────────────────────────────────────────────────────────────
243
426
  async function importPg() {
244
427
  try {
245
428
  return await import("pg");
@@ -249,9 +432,4 @@ async function importPg() {
249
432
  process.exit(1);
250
433
  }
251
434
  }
252
- async function hashPassword(password) {
253
- const salt = randomBytes(16).toString("hex");
254
- const derived = (await scryptAsync(password, salt, 64));
255
- return `${salt}:${derived.toString("hex")}`;
256
- }
257
435
  //# sourceMappingURL=admin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * supatype cache — list and clean cached component binaries.
2
+ * supatype cache — list and clean cached component binaries + REST Valkey cache.
3
3
  */
4
4
  import type { Command } from "commander";
5
5
  export declare function registerCache(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiFpD"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+KpD"}
@@ -1,19 +1,20 @@
1
1
  /**
2
- * supatype cache — list and clean cached component binaries.
2
+ * supatype cache — list and clean cached component binaries + REST Valkey cache.
3
3
  */
4
4
  import { existsSync, readdirSync, rmSync, statSync } from "node:fs";
5
5
  import { join } from "node:path";
6
6
  import { cacheRoot } from "../binary-cache.js";
7
- import { info, plain } from "../ui/messages.js";
7
+ import { deleteRestCacheEntry, flushRestCache, getRestCacheEntry, listRestCacheEntries, } from "../rest-cache-admin.js";
8
+ import { error, info, plain } from "../ui/messages.js";
8
9
  const COMPONENTS = ["engine", "server", "postgres", "deno"];
9
10
  export function registerCache(program) {
10
11
  const cache = program
11
12
  .command("cache")
12
- .description("Manage cached component binaries");
13
+ .description("Manage cached component binaries and REST API response cache");
13
14
  cache
14
15
  .command("list")
15
16
  .description("List cached component binaries and their sizes")
16
- .action(() => {
17
+ .action(async () => {
17
18
  const root = cacheRoot();
18
19
  if (!existsSync(root)) {
19
20
  info("Cache is empty.");
@@ -48,7 +49,7 @@ export function registerCache(program) {
48
49
  " supatype cache clean # remove everything\n" +
49
50
  " supatype cache clean engine # remove all engine versions\n" +
50
51
  " supatype cache clean engine 0.4.2")
51
- .action((component, version) => {
52
+ .action(async (component, version) => {
52
53
  const root = cacheRoot();
53
54
  if (!existsSync(root)) {
54
55
  info("Cache is already empty.");
@@ -75,6 +76,98 @@ export function registerCache(program) {
75
76
  }
76
77
  info("Done.");
77
78
  });
79
+ const rest = cache
80
+ .command("rest")
81
+ .description("Manage REST API response cache in Valkey");
82
+ rest
83
+ .command("list")
84
+ .description("List cached REST GET entries")
85
+ .option("--table <name>", "Filter by table name")
86
+ .option("--json", "Output JSON")
87
+ .action(async (opts) => {
88
+ const cwd = process.cwd();
89
+ try {
90
+ const result = await listRestCacheEntries(cwd, { table: opts.table, limit: 100 });
91
+ if (opts.json) {
92
+ plain(JSON.stringify(result, null, 2));
93
+ return;
94
+ }
95
+ if (result.entries.length === 0) {
96
+ info("No REST cache entries.");
97
+ return;
98
+ }
99
+ for (const e of result.entries) {
100
+ plain(` ${e.table ?? "?"} ${e.scope ?? "?"} ttl=${e.ttl_seconds}s ${e.size_bytes}B ${e.key}`);
101
+ }
102
+ if (result.cursor !== "0") {
103
+ plain(`\n(more available — cursor ${result.cursor})`);
104
+ }
105
+ }
106
+ catch (e) {
107
+ error(e instanceof Error ? e.message : String(e));
108
+ process.exitCode = 1;
109
+ }
110
+ });
111
+ rest
112
+ .command("get <key>")
113
+ .description("Show one cache entry (full Valkey key)")
114
+ .option("--json", "Output JSON")
115
+ .action(async (key, opts) => {
116
+ const cwd = process.cwd();
117
+ try {
118
+ const detail = await getRestCacheEntry(cwd, key);
119
+ if (opts.json) {
120
+ plain(JSON.stringify(detail, null, 2));
121
+ return;
122
+ }
123
+ plain(`key: ${detail.key}`);
124
+ plain(`table: ${detail.table ?? ""}`);
125
+ plain(`scope: ${detail.scope ?? ""}`);
126
+ plain(`ttl: ${detail.ttl_seconds}s`);
127
+ plain(`status: ${detail.status_code}`);
128
+ if (detail.body_preview)
129
+ plain(`body:\n${detail.body_preview}`);
130
+ }
131
+ catch (e) {
132
+ error(e instanceof Error ? e.message : String(e));
133
+ process.exitCode = 1;
134
+ }
135
+ });
136
+ rest
137
+ .command("delete <key>")
138
+ .description("Delete one cache entry")
139
+ .action(async (key) => {
140
+ const cwd = process.cwd();
141
+ try {
142
+ await deleteRestCacheEntry(cwd, key);
143
+ info(`Deleted ${key}`);
144
+ }
145
+ catch (e) {
146
+ error(e instanceof Error ? e.message : String(e));
147
+ process.exitCode = 1;
148
+ }
149
+ });
150
+ rest
151
+ .command("flush")
152
+ .description("Flush REST cache entries")
153
+ .option("--table <name>", "Only flush one table")
154
+ .option("--yes", "Confirm flush")
155
+ .action(async (opts) => {
156
+ if (!opts.yes) {
157
+ error("Pass --yes to confirm flush");
158
+ process.exitCode = 1;
159
+ return;
160
+ }
161
+ const cwd = process.cwd();
162
+ try {
163
+ await flushRestCache(cwd, opts.table);
164
+ info(opts.table ? `Flushed cache for table ${opts.table}` : "Flushed all REST cache entries");
165
+ }
166
+ catch (e) {
167
+ error(e instanceof Error ? e.message : String(e));
168
+ process.exitCode = 1;
169
+ }
170
+ });
78
171
  }
79
172
  function dirSize(dir) {
80
173
  let total = 0;