@pushto/cli 0.2.1 → 0.4.6

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 (184) hide show
  1. package/dist/commands/__tests__/deploy-domain.test.d.ts +2 -0
  2. package/dist/commands/__tests__/deploy-domain.test.d.ts.map +1 -0
  3. package/dist/commands/__tests__/deploy-domain.test.js +41 -0
  4. package/dist/commands/__tests__/deploy-domain.test.js.map +1 -0
  5. package/dist/commands/__tests__/headless-smoke.test.d.ts +2 -0
  6. package/dist/commands/__tests__/headless-smoke.test.d.ts.map +1 -0
  7. package/dist/commands/__tests__/headless-smoke.test.js +110 -0
  8. package/dist/commands/__tests__/headless-smoke.test.js.map +1 -0
  9. package/dist/commands/auth.d.ts +2 -0
  10. package/dist/commands/auth.d.ts.map +1 -0
  11. package/dist/commands/auth.js +77 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/cron.d.ts +2 -0
  14. package/dist/commands/cron.d.ts.map +1 -0
  15. package/dist/commands/cron.js +157 -0
  16. package/dist/commands/cron.js.map +1 -0
  17. package/dist/commands/db.d.ts +4 -0
  18. package/dist/commands/db.d.ts.map +1 -0
  19. package/dist/commands/db.js +63 -0
  20. package/dist/commands/db.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +16 -1
  22. package/dist/commands/deploy.d.ts.map +1 -1
  23. package/dist/commands/deploy.js +230 -150
  24. package/dist/commands/deploy.js.map +1 -1
  25. package/dist/commands/doctor.d.ts.map +1 -1
  26. package/dist/commands/doctor.js +289 -54
  27. package/dist/commands/doctor.js.map +1 -1
  28. package/dist/commands/domain.d.ts.map +1 -1
  29. package/dist/commands/domain.js +52 -7
  30. package/dist/commands/domain.js.map +1 -1
  31. package/dist/commands/echo.d.ts +2 -0
  32. package/dist/commands/echo.d.ts.map +1 -0
  33. package/dist/commands/echo.js +227 -0
  34. package/dist/commands/echo.js.map +1 -0
  35. package/dist/commands/env.d.ts +3 -1
  36. package/dist/commands/env.d.ts.map +1 -1
  37. package/dist/commands/env.js +76 -50
  38. package/dist/commands/env.js.map +1 -1
  39. package/dist/commands/init.d.ts +3 -1
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +58 -11
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/login.d.ts.map +1 -1
  44. package/dist/commands/login.js +50 -23
  45. package/dist/commands/login.js.map +1 -1
  46. package/dist/commands/logs.d.ts +3 -1
  47. package/dist/commands/logs.d.ts.map +1 -1
  48. package/dist/commands/logs.js +77 -21
  49. package/dist/commands/logs.js.map +1 -1
  50. package/dist/commands/mail.d.ts +2 -0
  51. package/dist/commands/mail.d.ts.map +1 -0
  52. package/dist/commands/mail.js +105 -0
  53. package/dist/commands/mail.js.map +1 -0
  54. package/dist/commands/open.d.ts.map +1 -1
  55. package/dist/commands/open.js +21 -1
  56. package/dist/commands/open.js.map +1 -1
  57. package/dist/commands/preview.d.ts +22 -0
  58. package/dist/commands/preview.d.ts.map +1 -0
  59. package/dist/commands/preview.js +223 -0
  60. package/dist/commands/preview.js.map +1 -0
  61. package/dist/commands/status.d.ts +3 -1
  62. package/dist/commands/status.d.ts.map +1 -1
  63. package/dist/commands/status.js +62 -12
  64. package/dist/commands/status.js.map +1 -1
  65. package/dist/commands/upgrade.d.ts.map +1 -1
  66. package/dist/commands/upgrade.js +73 -10
  67. package/dist/commands/upgrade.js.map +1 -1
  68. package/dist/commands/use.d.ts +2 -0
  69. package/dist/commands/use.d.ts.map +1 -0
  70. package/dist/commands/use.js +108 -0
  71. package/dist/commands/use.js.map +1 -0
  72. package/dist/commands/vault.d.ts +2 -0
  73. package/dist/commands/vault.d.ts.map +1 -0
  74. package/dist/commands/vault.js +119 -0
  75. package/dist/commands/vault.js.map +1 -0
  76. package/dist/commands/whoami.d.ts.map +1 -1
  77. package/dist/commands/whoami.js +12 -1
  78. package/dist/commands/whoami.js.map +1 -1
  79. package/dist/index.js +117 -14
  80. package/dist/index.js.map +1 -1
  81. package/dist/lib/__tests__/build-runner.test.d.ts +2 -0
  82. package/dist/lib/__tests__/build-runner.test.d.ts.map +1 -0
  83. package/dist/lib/__tests__/build-runner.test.js +119 -0
  84. package/dist/lib/__tests__/build-runner.test.js.map +1 -0
  85. package/dist/lib/__tests__/cron-tail.test.d.ts +2 -0
  86. package/dist/lib/__tests__/cron-tail.test.d.ts.map +1 -0
  87. package/dist/lib/__tests__/cron-tail.test.js +27 -0
  88. package/dist/lib/__tests__/cron-tail.test.js.map +1 -0
  89. package/dist/lib/__tests__/detect-static-framework.test.d.ts +2 -0
  90. package/dist/lib/__tests__/detect-static-framework.test.d.ts.map +1 -0
  91. package/dist/lib/__tests__/detect-static-framework.test.js +146 -0
  92. package/dist/lib/__tests__/detect-static-framework.test.js.map +1 -0
  93. package/dist/lib/__tests__/errors.test.d.ts +2 -0
  94. package/dist/lib/__tests__/errors.test.d.ts.map +1 -0
  95. package/dist/lib/__tests__/errors.test.js +56 -0
  96. package/dist/lib/__tests__/errors.test.js.map +1 -0
  97. package/dist/lib/__tests__/interactive.test.d.ts +2 -0
  98. package/dist/lib/__tests__/interactive.test.d.ts.map +1 -0
  99. package/dist/lib/__tests__/interactive.test.js +79 -0
  100. package/dist/lib/__tests__/interactive.test.js.map +1 -0
  101. package/dist/lib/__tests__/output.test.d.ts +2 -0
  102. package/dist/lib/__tests__/output.test.d.ts.map +1 -0
  103. package/dist/lib/__tests__/output.test.js +144 -0
  104. package/dist/lib/__tests__/output.test.js.map +1 -0
  105. package/dist/lib/__tests__/prepare-artifact.test.d.ts +2 -0
  106. package/dist/lib/__tests__/prepare-artifact.test.d.ts.map +1 -0
  107. package/dist/lib/__tests__/prepare-artifact.test.js +55 -0
  108. package/dist/lib/__tests__/prepare-artifact.test.js.map +1 -0
  109. package/dist/lib/__tests__/preview-args.test.d.ts +2 -0
  110. package/dist/lib/__tests__/preview-args.test.d.ts.map +1 -0
  111. package/dist/lib/__tests__/preview-args.test.js +37 -0
  112. package/dist/lib/__tests__/preview-args.test.js.map +1 -0
  113. package/dist/lib/api.d.ts.map +1 -1
  114. package/dist/lib/api.js +22 -4
  115. package/dist/lib/api.js.map +1 -1
  116. package/dist/lib/ask.d.ts +15 -0
  117. package/dist/lib/ask.d.ts.map +1 -0
  118. package/dist/lib/ask.js +24 -0
  119. package/dist/lib/ask.js.map +1 -0
  120. package/dist/lib/build-runner.d.ts +25 -0
  121. package/dist/lib/build-runner.d.ts.map +1 -0
  122. package/dist/lib/build-runner.js +141 -0
  123. package/dist/lib/build-runner.js.map +1 -0
  124. package/dist/lib/config.d.ts +6 -0
  125. package/dist/lib/config.d.ts.map +1 -1
  126. package/dist/lib/config.js +7 -1
  127. package/dist/lib/config.js.map +1 -1
  128. package/dist/lib/cron-tail.d.ts +10 -0
  129. package/dist/lib/cron-tail.d.ts.map +1 -0
  130. package/dist/lib/cron-tail.js +5 -0
  131. package/dist/lib/cron-tail.js.map +1 -0
  132. package/dist/lib/detect-static-framework.d.ts +31 -0
  133. package/dist/lib/detect-static-framework.d.ts.map +1 -0
  134. package/dist/lib/detect-static-framework.js +96 -0
  135. package/dist/lib/detect-static-framework.js.map +1 -0
  136. package/dist/lib/env-parse.d.ts +48 -0
  137. package/dist/lib/env-parse.d.ts.map +1 -0
  138. package/dist/lib/env-parse.js +91 -0
  139. package/dist/lib/env-parse.js.map +1 -0
  140. package/dist/lib/errors.d.ts +111 -0
  141. package/dist/lib/errors.d.ts.map +1 -0
  142. package/dist/lib/errors.js +64 -0
  143. package/dist/lib/errors.js.map +1 -0
  144. package/dist/lib/file-walker.d.ts +23 -0
  145. package/dist/lib/file-walker.d.ts.map +1 -0
  146. package/dist/lib/file-walker.js +114 -0
  147. package/dist/lib/file-walker.js.map +1 -0
  148. package/dist/lib/interactive.d.ts +13 -0
  149. package/dist/lib/interactive.d.ts.map +1 -0
  150. package/dist/lib/interactive.js +24 -0
  151. package/dist/lib/interactive.js.map +1 -0
  152. package/dist/lib/output.d.ts +24 -0
  153. package/dist/lib/output.d.ts.map +1 -0
  154. package/dist/lib/output.js +71 -0
  155. package/dist/lib/output.js.map +1 -0
  156. package/dist/lib/prepare-artifact.d.ts +22 -0
  157. package/dist/lib/prepare-artifact.d.ts.map +1 -0
  158. package/dist/lib/prepare-artifact.js +26 -0
  159. package/dist/lib/prepare-artifact.js.map +1 -0
  160. package/dist/lib/preview-args.d.ts +20 -0
  161. package/dist/lib/preview-args.d.ts.map +1 -0
  162. package/dist/lib/preview-args.js +19 -0
  163. package/dist/lib/preview-args.js.map +1 -0
  164. package/dist/lib/safe-json.d.ts +7 -2
  165. package/dist/lib/safe-json.d.ts.map +1 -1
  166. package/dist/lib/safe-json.js +23 -4
  167. package/dist/lib/safe-json.js.map +1 -1
  168. package/dist/lib/update-check.d.ts +17 -0
  169. package/dist/lib/update-check.d.ts.map +1 -0
  170. package/dist/lib/update-check.js +81 -0
  171. package/dist/lib/update-check.js.map +1 -0
  172. package/dist/lib/upload-limits.d.ts +17 -0
  173. package/dist/lib/upload-limits.d.ts.map +1 -0
  174. package/dist/lib/upload-limits.js +17 -0
  175. package/dist/lib/upload-limits.js.map +1 -0
  176. package/dist/lib/zip-project.d.ts +19 -0
  177. package/dist/lib/zip-project.d.ts.map +1 -0
  178. package/dist/lib/zip-project.js +39 -0
  179. package/dist/lib/zip-project.js.map +1 -0
  180. package/dist/version.d.ts +2 -0
  181. package/dist/version.d.ts.map +1 -0
  182. package/dist/version.js +16 -0
  183. package/dist/version.js.map +1 -0
  184. package/package.json +5 -8
@@ -0,0 +1,227 @@
1
+ import chalk from 'chalk';
2
+ import { getToken } from '../lib/config.js';
3
+ import { resolveSlug } from '../lib/resolve-slug.js';
4
+ import { api } from '../lib/api.js';
5
+ import { safeJson } from '../lib/safe-json.js';
6
+ const ensureAuthed = () => {
7
+ const token = getToken();
8
+ if (!token) {
9
+ console.log(chalk.red('> not logged in.'));
10
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
11
+ process.exit(1);
12
+ }
13
+ const slug = resolveSlug();
14
+ if (!slug) {
15
+ console.log(chalk.red('> no project here. run pushto init first.'));
16
+ process.exit(1);
17
+ }
18
+ return slug;
19
+ };
20
+ const usage = () => {
21
+ console.log(chalk.dim(' usage:'));
22
+ console.log(chalk.cyan(' pushto echo on') + chalk.dim(' start recording'));
23
+ console.log(chalk.cyan(' pushto echo off') + chalk.dim(' stop recording'));
24
+ console.log(chalk.cyan(' pushto echo status') + chalk.dim(' show settings + 24h routes'));
25
+ console.log(chalk.cyan(' pushto echo replay') + chalk.dim(' replay recent recordings'));
26
+ console.log();
27
+ console.log(chalk.dim(' replay flags:'));
28
+ console.log(chalk.dim(' --target=<url> https url under your project (preview/prod/custom)'));
29
+ console.log(chalk.dim(' --label=<text> optional human label'));
30
+ console.log(chalk.dim(' --since=<iso> only recordings since that timestamp'));
31
+ console.log(chalk.dim(' --route=<sig> filter by route signature, e.g. "GET /api/x"'));
32
+ console.log(chalk.dim(' --status=<n> filter by recorded status code'));
33
+ console.log(chalk.dim(' --limit=<n> max recordings (default 100, max 500)'));
34
+ };
35
+ const parseFlags = (args) => {
36
+ const out = {};
37
+ for (const a of args) {
38
+ const m = /^--([\w-]+)(?:=(.*))?$/.exec(a);
39
+ if (!m)
40
+ continue;
41
+ out[m[1]] = m[2] ?? 'true';
42
+ }
43
+ return out;
44
+ };
45
+ const showStatus = async (slug) => {
46
+ const res = await api(`/cli/projects/${slug}/echo`);
47
+ if (!res.ok) {
48
+ const data = await safeJson(res);
49
+ console.log(chalk.red(`> ${data.error ?? 'failed to load echo status.'}`));
50
+ process.exit(1);
51
+ }
52
+ const data = (await res.json());
53
+ const dot = data.enabled ? chalk.green('●') : chalk.dim('○');
54
+ console.log(`${dot} echo ${data.enabled ? chalk.green('on') : chalk.dim('off')}`);
55
+ console.log(chalk.dim(' retention ') +
56
+ `${data.retentionDays}d ${data.retentionDays === 30 ? chalk.dim('(max)') : ''}`);
57
+ console.log(chalk.dim(' recordings ') +
58
+ `${data.usage.recordings.current.toLocaleString()} / ${data.usage.recordings.limit.toLocaleString()} this month`);
59
+ console.log(chalk.dim(' replays ') +
60
+ `${data.usage.replays.current.toLocaleString()} / ${data.usage.replays.limit.toLocaleString()} this month`);
61
+ if (data.routes.length === 0) {
62
+ console.log();
63
+ console.log(chalk.dim(' no routes recorded in the last 24h.'));
64
+ return;
65
+ }
66
+ console.log();
67
+ console.log(chalk.dim(' routes (last 24h):'));
68
+ for (const r of data.routes) {
69
+ const ok = chalk.green(`${r.okCount} ok`);
70
+ const err = r.errCount > 0 ? chalk.red(` ${r.errCount} err`) : '';
71
+ console.log(` ${r.routeSignature.padEnd(40)} ${ok}${err}`);
72
+ }
73
+ };
74
+ const setEnabled = async (slug, enabled) => {
75
+ const res = await api(`/cli/projects/${slug}/echo`, {
76
+ method: 'POST',
77
+ body: JSON.stringify({ enabled }),
78
+ });
79
+ if (!res.ok) {
80
+ const data = await safeJson(res);
81
+ console.log(chalk.red(`> ${data.error ?? 'failed.'}`));
82
+ process.exit(1);
83
+ }
84
+ if (enabled) {
85
+ console.log(chalk.green('> recording on.'));
86
+ console.log(chalk.dim(' capturing up to 10k requests/month, retained 7 days.'));
87
+ }
88
+ else {
89
+ console.log(chalk.dim('> recording off. existing recordings stay until expiry.'));
90
+ }
91
+ };
92
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
93
+ const formatProgressLine = (p) => {
94
+ const total = p.counts.identical + p.counts.tolerated + p.counts.breaking + p.counts.inconclusive;
95
+ const pct = p.recordingCount > 0 ? Math.round((total / p.recordingCount) * 100) : 0;
96
+ return ` ${total}/${p.recordingCount} (${pct}%) ${chalk.green(p.counts.identical + ' ok')} ${chalk.cyan(p.counts.tolerated + ' tol')} ${chalk.red(p.counts.breaking + ' break')} ${chalk.yellow(p.counts.inconclusive + ' incl')}`;
97
+ };
98
+ const runReplayCmd = async (slug, flags) => {
99
+ const target = flags.target;
100
+ if (!target) {
101
+ console.log(chalk.red('> --target=<url> is required.'));
102
+ console.log(chalk.dim(' e.g. --target=https://') + chalk.cyan(`fix-checkout-${slug}.preview.pushto.host`));
103
+ process.exit(1);
104
+ }
105
+ const isProd = (() => {
106
+ try {
107
+ return new URL(target).hostname.toLowerCase() === `${slug}.pushto.host`;
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ })();
113
+ if (isProd) {
114
+ console.log(chalk.yellow('> heads up — that target is your production deploy.'));
115
+ console.log(chalk.dim(' any mutating request will mutate prod data. add an ') +
116
+ chalk.cyan('x-pushto-replay') +
117
+ chalk.dim(' check on your server to no-op writes.'));
118
+ console.log(chalk.dim(` type "${slug}" and press enter to confirm:`));
119
+ const typed = await readLine();
120
+ if (typed.trim() !== slug) {
121
+ console.log(chalk.red('> aborted.'));
122
+ process.exit(1);
123
+ }
124
+ }
125
+ const startBody = { target };
126
+ if (flags.label)
127
+ startBody.label = flags.label;
128
+ if (flags.since)
129
+ startBody.since = flags.since;
130
+ if (flags.route)
131
+ startBody.route = flags.route;
132
+ if (flags.status)
133
+ startBody.status = Number(flags.status);
134
+ if (flags.limit)
135
+ startBody.limit = Number(flags.limit);
136
+ const startRes = await api(`/cli/projects/${slug}/echo/replay`, {
137
+ method: 'POST',
138
+ body: JSON.stringify(startBody),
139
+ });
140
+ if (!startRes.ok) {
141
+ const data = await safeJson(startRes);
142
+ console.log(chalk.red(`> ${data.error ?? 'replay start failed.'}`));
143
+ process.exit(1);
144
+ }
145
+ const start = (await startRes.json());
146
+ console.log(chalk.dim(`> replaying ${start.recordingCount} recordings against ${target}`));
147
+ const startedAt = Date.now();
148
+ const TIMEOUT_MS = 5 * 60 * 1000;
149
+ let done = false;
150
+ let last = null;
151
+ while (!done) {
152
+ if (Date.now() - startedAt > TIMEOUT_MS) {
153
+ console.log(chalk.red('> giving up — replay still running after 5 minutes.'));
154
+ console.log(chalk.dim(` check the dashboard or rerun: pushto echo replay --target=${target}`));
155
+ process.exit(1);
156
+ }
157
+ await sleep(2_000);
158
+ const r = await api(`/cli/projects/${slug}/echo/replay/${start.replayId}`);
159
+ if (!r.ok)
160
+ continue;
161
+ last = (await r.json());
162
+ process.stdout.write('\r' + formatProgressLine(last) + ' ');
163
+ if (last.replayStatus === 'COMPLETED' || last.replayStatus === 'FAILED') {
164
+ done = true;
165
+ }
166
+ }
167
+ process.stdout.write('\n');
168
+ if (!last)
169
+ return;
170
+ if (last.replayStatus === 'FAILED') {
171
+ console.log(chalk.red(`> replay failed: ${last.failureReason ?? 'unknown error'}`));
172
+ process.exit(1);
173
+ }
174
+ console.log();
175
+ console.log(` ${chalk.green('✓')} ${last.counts.identical} identical`);
176
+ if (last.counts.tolerated > 0) {
177
+ console.log(` ${chalk.cyan('~')} ${last.counts.tolerated} tolerated diffs`);
178
+ }
179
+ console.log(` ${chalk.red('✗')} ${last.counts.breaking} breaking`);
180
+ console.log(` ${chalk.yellow('!')} ${last.counts.inconclusive} inconclusive`);
181
+ if (last.breakingExamples.length > 0) {
182
+ console.log();
183
+ console.log(chalk.dim(' breaking examples:'));
184
+ for (const ex of last.breakingExamples) {
185
+ const reasons = (ex.reasons ?? []).slice(0, 1).join('; ');
186
+ const arrow = ex.replayStatus !== null ? `${ex.recordedStatus} → ${ex.replayStatus}` : `${ex.recordedStatus}`;
187
+ console.log(` ${chalk.red(arrow)} ${chalk.dim(reasons)}`);
188
+ }
189
+ }
190
+ console.log();
191
+ console.log(chalk.dim(` full report: https://pushto.host/dashboard/projects/${slug}/echo`));
192
+ if (last.counts.breaking > 0)
193
+ process.exit(1);
194
+ };
195
+ const readLine = () => new Promise((resolve) => {
196
+ let buf = '';
197
+ process.stdin.setEncoding('utf8');
198
+ const onData = (chunk) => {
199
+ buf += chunk;
200
+ const nl = buf.indexOf('\n');
201
+ if (nl >= 0) {
202
+ process.stdin.off('data', onData);
203
+ process.stdin.pause();
204
+ resolve(buf.slice(0, nl).replace(/\r$/, ''));
205
+ }
206
+ };
207
+ process.stdin.resume();
208
+ process.stdin.on('data', onData);
209
+ });
210
+ export const echo = async (action, args) => {
211
+ if (!action || action === 'help')
212
+ return usage();
213
+ const slug = ensureAuthed();
214
+ const flags = parseFlags(args);
215
+ if (action === 'status')
216
+ return showStatus(slug);
217
+ if (action === 'on')
218
+ return setEnabled(slug, true);
219
+ if (action === 'off')
220
+ return setEnabled(slug, false);
221
+ if (action === 'replay')
222
+ return runReplayCmd(slug, flags);
223
+ console.log(chalk.red(`> unknown action: ${action}`));
224
+ usage();
225
+ process.exit(1);
226
+ };
227
+ //# sourceMappingURL=echo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/commands/echo.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export declare const env: (action: string, args: string[]) => Promise<void>;
1
+ export declare const env: (action: string, args: string[], opts?: {
2
+ json?: boolean;
3
+ }) => Promise<void>;
2
4
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,GAAG,GAAU,QAAQ,MAAM,EAAE,MAAM,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAwKtE,CAAC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,GAAG,GACd,QAAQ,MAAM,EACd,MAAM,MAAM,EAAE,EACd,OAAM;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,KAC5B,OAAO,CAAC,IAAI,CAwMd,CAAC"}
@@ -5,31 +5,36 @@ import { getToken } from '../lib/config.js';
5
5
  import { resolveSlug } from '../lib/resolve-slug.js';
6
6
  import { api } from '../lib/api.js';
7
7
  import { safeJson } from '../lib/safe-json.js';
8
- export const env = async (action, args) => {
8
+ import { parseEnvContent } from '../lib/env-parse.js';
9
+ import { fail, emitOk, emitErr } from '../lib/output.js';
10
+ import { buildError, exitCodeFor } from '../lib/errors.js';
11
+ export const env = async (action, args, opts = {}) => {
9
12
  const token = getToken();
10
13
  if (!token) {
11
- console.log(chalk.red('> not logged in.'));
12
- console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
13
- process.exit(1);
14
+ fail('NOT_AUTHENTICATED', 'not logged in.', opts, {
15
+ stage: 'auth',
16
+ fix: { label: 'sign in', cmd: 'pushto login', prose: 'run {cmd} first.' },
17
+ });
14
18
  }
15
19
  const slug = resolveSlug();
16
20
  if (!slug) {
17
- console.log(chalk.red('> no project here. run pushto init first.'));
18
- process.exit(1);
21
+ // This command's copy puts the fix INSIDE the sentence, unlike status.ts
22
+ // which uses a second line. `human` carries it whole and no `fix` is
23
+ // attached, so the rendered line stays byte-identical. Agents still get
24
+ // the actionable part from `code: NO_PROJECT`.
25
+ fail('NO_PROJECT', 'no project here. run pushto init first.', opts);
19
26
  }
20
27
  if (action === 'set') {
21
28
  // pushto env set KEY=value
22
29
  const pair = args[0];
23
30
  if (!pair || !pair.includes('=')) {
24
- console.log(chalk.red('> usage: pushto env set KEY=value'));
25
- process.exit(1);
31
+ fail('BAD_USAGE', 'usage: pushto env set KEY=value', opts);
26
32
  }
27
33
  const eqIdx = pair.indexOf('=');
28
34
  const key = pair.slice(0, eqIdx);
29
35
  const value = pair.slice(eqIdx + 1);
30
36
  if (!key) {
31
- console.log(chalk.red('> key is empty.'));
32
- process.exit(1);
37
+ fail('INVALID_ENV_KEY', 'key is empty.', opts);
33
38
  }
34
39
  // Call the tRPC mutation via REST-like endpoint
35
40
  // We'll use a simple CLI API endpoint for this
@@ -39,20 +44,30 @@ export const env = async (action, args) => {
39
44
  });
40
45
  if (!res.ok) {
41
46
  const data = (await safeJson(res));
42
- console.log(chalk.red(`> ${data.error ?? 'failed to set env var.'}`));
43
- process.exit(1);
47
+ fail('SERVER_ERROR', data.error ?? 'failed to set env var.', opts);
44
48
  }
49
+ const setData = await safeJson(res);
45
50
  console.log(chalk.green(`> ${key} set.`));
51
+ if (setData.warning) {
52
+ console.log(chalk.yellow(` ${setData.warning}`));
53
+ }
46
54
  }
47
55
  else if (action === 'list' || action === 'ls') {
48
56
  // pushto env list
49
57
  const res = await api(`/cli/projects/${slug}/env`);
50
58
  if (!res.ok) {
51
59
  const data = (await safeJson(res));
52
- console.log(chalk.red(`> ${data.error ?? 'failed to list env vars.'}`));
53
- process.exit(1);
60
+ fail('SERVER_ERROR', data.error ?? 'failed to list env vars.', opts);
54
61
  }
55
62
  const vars = await safeJson(res);
63
+ // Values are masked in the human table; the machine payload carries keys
64
+ // only for the same reason, so `--json` is not a secrets exfiltration
65
+ // path that the visible output would never permit. `pushto env pull`
66
+ // stays the deliberate way to get values onto disk.
67
+ if (opts.json) {
68
+ emitOk({ project: slug, vars: vars.map((v) => ({ key: v.key })) }, opts);
69
+ return;
70
+ }
56
71
  if (vars.length === 0) {
57
72
  console.log(chalk.dim('> no env vars set.'));
58
73
  return;
@@ -68,8 +83,7 @@ export const env = async (action, args) => {
68
83
  const res = await api(`/cli/projects/${slug}/env`);
69
84
  if (!res.ok) {
70
85
  const data = (await safeJson(res));
71
- console.log(chalk.red(`> ${data.error ?? 'failed to pull env vars.'}`));
72
- process.exit(1);
86
+ fail('SERVER_ERROR', data.error ?? 'failed to pull env vars.', opts);
73
87
  }
74
88
  const vars = await safeJson(res);
75
89
  if (vars.length === 0) {
@@ -83,50 +97,59 @@ export const env = async (action, args) => {
83
97
  console.log(chalk.dim(' make sure .env is in your .gitignore.'));
84
98
  }
85
99
  else if (action === 'push') {
86
- // pushto env push — upload local .env to project
100
+ // pushto env push — upload local .env to project in ONE bulk request.
101
+ // Pre-fix this looped a POST per var, and every POST restarts the
102
+ // container — a 50-var .env restarted the user's app 50 times in a row.
87
103
  const envFile = args[0] || '.env';
88
104
  const envPath = path.join(process.cwd(), envFile);
89
105
  if (!fs.existsSync(envPath)) {
90
- console.log(chalk.red(`> ${envFile} not found in this directory.`));
91
- process.exit(1);
106
+ fail('NO_FILES', `${envFile} not found in this directory.`, opts, {
107
+ details: { file: envFile },
108
+ });
92
109
  }
93
110
  const content = fs.readFileSync(envPath, 'utf-8');
94
- const lines = content.split('\n');
95
- let count = 0;
96
- for (const line of lines) {
97
- const trimmed = line.trim();
98
- if (!trimmed || trimmed.startsWith('#'))
99
- continue;
100
- const eqIdx = trimmed.indexOf('=');
101
- if (eqIdx === -1)
102
- continue;
103
- const key = trimmed.slice(0, eqIdx).trim();
104
- let value = trimmed.slice(eqIdx + 1).trim();
105
- // Strip surrounding quotes
106
- if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
107
- value = value.slice(1, -1);
108
- }
109
- if (!key)
110
- continue;
111
- const res = await api(`/cli/projects/${slug}/env`, {
112
- method: 'POST',
113
- body: JSON.stringify({ key, value }),
114
- });
115
- if (res.ok) {
116
- count++;
117
- console.log(chalk.dim(` ${key} ✓`));
111
+ const { vars, skipped: localSkipped } = parseEnvContent(content);
112
+ if (Object.keys(vars).length === 0) {
113
+ // Not fail(), because that exits immediately and the original prints
114
+ // the headline BEFORE the per-key reasons. emitErr keeps that order;
115
+ // the exit code is still derived, never hand-picked. The reasons are
116
+ // the actionable part, so machines get them as `details`.
117
+ emitErr(buildError('INVALID_ENV_KEY', `no usable KEY=value pairs in ${envFile}.`, {
118
+ details: { file: envFile, skipped: localSkipped },
119
+ }), opts);
120
+ if (!opts.json) {
121
+ for (const s of localSkipped) {
122
+ console.log(chalk.dim(` ${s.key}: ${s.reason}`));
123
+ }
118
124
  }
119
- else {
120
- console.log(chalk.red(` ${key} ✗`));
125
+ process.exit(exitCodeFor('INVALID_ENV_KEY'));
126
+ }
127
+ const res = await api(`/cli/projects/${slug}/env`, {
128
+ method: 'PUT',
129
+ body: JSON.stringify({ vars }),
130
+ });
131
+ if (!res.ok) {
132
+ const data = await safeJson(res);
133
+ fail('SERVER_ERROR', data.error ?? 'failed to push env vars.', opts);
134
+ }
135
+ const pushData = await safeJson(res);
136
+ const imported = pushData.imported ?? 0;
137
+ const skipped = [...localSkipped, ...(pushData.skipped ?? [])];
138
+ console.log(chalk.green(`> pushed ${imported} var${imported !== 1 ? 's' : ''} from ${envFile}`));
139
+ if (skipped.length > 0) {
140
+ console.log(chalk.yellow(` ${skipped.length} skipped:`));
141
+ for (const s of skipped) {
142
+ console.log(chalk.dim(` ${s.key}: ${s.reason}`));
121
143
  }
122
144
  }
123
- console.log(chalk.green(`\n> pushed ${count} var${count !== 1 ? 's' : ''} from ${envFile}`));
145
+ if (pushData.warning) {
146
+ console.log(chalk.yellow(` ${pushData.warning}`));
147
+ }
124
148
  }
125
149
  else if (action === 'rm' || action === 'remove' || action === 'delete') {
126
150
  const key = args[0];
127
151
  if (!key) {
128
- console.log(chalk.red('> usage: pushto env rm KEY'));
129
- process.exit(1);
152
+ fail('BAD_USAGE', 'usage: pushto env rm KEY', opts);
130
153
  }
131
154
  const res = await api(`/cli/projects/${slug}/env`, {
132
155
  method: 'DELETE',
@@ -134,10 +157,13 @@ export const env = async (action, args) => {
134
157
  });
135
158
  if (!res.ok) {
136
159
  const data = (await safeJson(res));
137
- console.log(chalk.red(`> ${data.error ?? 'failed to delete env var.'}`));
138
- process.exit(1);
160
+ fail('SERVER_ERROR', data.error ?? 'failed to delete env var.', opts);
139
161
  }
162
+ const rmData = await safeJson(res);
140
163
  console.log(chalk.green(`> ${key} removed.`));
164
+ if (rmData.warning) {
165
+ console.log(chalk.yellow(` ${rmData.warning}`));
166
+ }
141
167
  }
142
168
  else {
143
169
  console.log(chalk.dim(' usage:'));
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export declare const init: (name: string) => Promise<void>;
1
+ export declare const init: (name: string, opts?: {
2
+ json?: boolean;
3
+ }) => Promise<void>;
2
4
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,IAAI,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAyDrD,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,IAAI,GAAU,MAAM,MAAM,EAAE,OAAM;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,KAAG,OAAO,CAAC,IAAI,CAsGpF,CAAC"}
@@ -5,12 +5,45 @@ import path from 'node:path';
5
5
  import { getToken, setProjectSlug } from '../lib/config.js';
6
6
  import { api } from '../lib/api.js';
7
7
  import { safeJson } from '../lib/safe-json.js';
8
- export const init = async (name) => {
8
+ import { fail, emitOk, spinnerStream } from '../lib/output.js';
9
+ import { exitCodeFor } from '../lib/errors.js';
10
+ export const init = async (name, opts = {}) => {
9
11
  const token = getToken();
10
12
  if (!token) {
11
- console.log(chalk.red('> not logged in.'));
12
- console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
13
- process.exit(1);
13
+ fail('NOT_AUTHENTICATED', 'not logged in.', opts, {
14
+ stage: 'auth',
15
+ fix: { label: 'sign in', cmd: 'pushto login', prose: 'run {cmd} first.' },
16
+ });
17
+ }
18
+ // Refuse to clobber an existing .pushto. Pre-fix `pushto init <new>`
19
+ // in a dir that already had a .pushto silently overwrote it — the user
20
+ // lost the link to the old project AND the old project became an
21
+ // orphan on the server (still billable, no longer reachable from
22
+ // this dir). Now show what's already linked + how to proceed.
23
+ const pushtoPath = path.join(process.cwd(), '.pushto');
24
+ if (fs.existsSync(pushtoPath)) {
25
+ let existingSlug = 'unknown';
26
+ try {
27
+ const parsed = JSON.parse(fs.readFileSync(pushtoPath, 'utf-8'));
28
+ if (typeof parsed.slug === 'string')
29
+ existingSlug = parsed.slug;
30
+ }
31
+ catch {
32
+ /* malformed .pushto — fall through with 'unknown' */
33
+ }
34
+ // Three alternatives, so the human keeps its three tailored lines while
35
+ // the machine gets the linked slug in `details` and one canonical fix.
36
+ if (!opts.json) {
37
+ console.log(chalk.red(`> this directory is already linked to ${chalk.cyan(existingSlug)}.`));
38
+ console.log(chalk.dim(' to deploy that project, just run: ') + chalk.cyan('pushto'));
39
+ console.log(chalk.dim(' to switch projects, delete .pushto first: ') + chalk.cyan('rm .pushto'));
40
+ console.log(chalk.dim(' to start a new project, ') + chalk.cyan('cd') + chalk.dim(' to a different directory.'));
41
+ process.exit(exitCodeFor('BAD_USAGE'));
42
+ }
43
+ fail('BAD_USAGE', `this directory is already linked to ${existingSlug}.`, opts, {
44
+ details: { linkedSlug: existingSlug },
45
+ fix: { label: 'deploy the linked project', cmd: 'pushto' },
46
+ });
14
47
  }
15
48
  const slug = name
16
49
  .toLowerCase()
@@ -18,10 +51,11 @@ export const init = async (name) => {
18
51
  .replace(/-+/g, '-')
19
52
  .replace(/^-|-$/g, '');
20
53
  if (slug.length < 3) {
21
- console.log(chalk.red('> name too short. needs at least 3 characters.'));
22
- process.exit(1);
54
+ fail('BAD_USAGE', 'name too short. needs at least 3 characters.', opts, {
55
+ details: { slug, minLength: 3 },
56
+ });
23
57
  }
24
- const spinner = ora('creating project...').start();
58
+ const spinner = ora({ text: 'creating project...', stream: spinnerStream(opts) }).start();
25
59
  try {
26
60
  const res = await api('/cli/projects', {
27
61
  method: 'POST',
@@ -29,14 +63,19 @@ export const init = async (name) => {
29
63
  });
30
64
  const data = await safeJson(res);
31
65
  if (!res.ok) {
32
- spinner.fail(chalk.red(`> ${data.error ?? 'something went wrong.'}`));
33
- process.exit(1);
66
+ spinner.stop();
67
+ fail('SERVER_ERROR', data.error ?? 'something went wrong.', opts);
34
68
  }
35
69
  // Write .pushto file in current directory
36
70
  const pushtoConfig = { slug, projectId: data.project?.id };
37
71
  fs.writeFileSync(path.join(process.cwd(), '.pushto'), JSON.stringify(pushtoConfig, null, 2) + '\n');
38
72
  // Also store globally so bare `pushto` works from this dir
39
73
  setProjectSlug(slug);
74
+ spinner.stop();
75
+ if (opts.json) {
76
+ emitOk({ slug, projectId: data.project?.id, url: `https://${slug}.pushto.host` }, opts);
77
+ return;
78
+ }
40
79
  spinner.succeed(chalk.green(`> ${slug} is ready.`));
41
80
  console.log(chalk.dim(` ${data.message ?? 'project created.'}`));
42
81
  console.log();
@@ -44,8 +83,16 @@ export const init = async (name) => {
44
83
  console.log(chalk.dim(' your url will be: ') + chalk.cyan(`${slug}.pushto.host`));
45
84
  }
46
85
  catch (err) {
47
- spinner.fail(chalk.red('> could not reach pushto.host. check your internet.'));
48
- process.exit(1);
86
+ // Distinguish network failures from local errors (write permission,
87
+ // disk full, etc.). The original blanket message blamed the user's
88
+ // internet for fs.writeFileSync failures and other local issues.
89
+ const msg = err instanceof Error ? err.message : '';
90
+ const isNetwork = /fetch|enotfound|econnrefused|timeout|abort|network/i.test(msg);
91
+ spinner.stop();
92
+ if (isNetwork) {
93
+ fail('NETWORK', 'could not reach pushto.host. check your internet.', opts);
94
+ }
95
+ fail('SERVER_ERROR', `init failed: ${msg || 'unknown error'}`, opts);
49
96
  }
50
97
  };
51
98
  //# sourceMappingURL=init.js.map