@pushto/cli 0.2.0 → 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 (188) 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 +344 -68
  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 +401 -69
  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 +70 -18
  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 +80 -39
  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 +32 -8
  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 +123 -13
  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 +2 -0
  114. package/dist/lib/api.d.ts.map +1 -1
  115. package/dist/lib/api.js +38 -5
  116. package/dist/lib/api.js.map +1 -1
  117. package/dist/lib/ask.d.ts +15 -0
  118. package/dist/lib/ask.d.ts.map +1 -0
  119. package/dist/lib/ask.js +24 -0
  120. package/dist/lib/ask.js.map +1 -0
  121. package/dist/lib/build-runner.d.ts +25 -0
  122. package/dist/lib/build-runner.d.ts.map +1 -0
  123. package/dist/lib/build-runner.js +141 -0
  124. package/dist/lib/build-runner.js.map +1 -0
  125. package/dist/lib/config.d.ts +6 -0
  126. package/dist/lib/config.d.ts.map +1 -1
  127. package/dist/lib/config.js +13 -2
  128. package/dist/lib/config.js.map +1 -1
  129. package/dist/lib/cron-tail.d.ts +10 -0
  130. package/dist/lib/cron-tail.d.ts.map +1 -0
  131. package/dist/lib/cron-tail.js +5 -0
  132. package/dist/lib/cron-tail.js.map +1 -0
  133. package/dist/lib/detect-static-framework.d.ts +31 -0
  134. package/dist/lib/detect-static-framework.d.ts.map +1 -0
  135. package/dist/lib/detect-static-framework.js +96 -0
  136. package/dist/lib/detect-static-framework.js.map +1 -0
  137. package/dist/lib/env-parse.d.ts +48 -0
  138. package/dist/lib/env-parse.d.ts.map +1 -0
  139. package/dist/lib/env-parse.js +91 -0
  140. package/dist/lib/env-parse.js.map +1 -0
  141. package/dist/lib/errors.d.ts +111 -0
  142. package/dist/lib/errors.d.ts.map +1 -0
  143. package/dist/lib/errors.js +64 -0
  144. package/dist/lib/errors.js.map +1 -0
  145. package/dist/lib/file-walker.d.ts +23 -0
  146. package/dist/lib/file-walker.d.ts.map +1 -0
  147. package/dist/lib/file-walker.js +114 -0
  148. package/dist/lib/file-walker.js.map +1 -0
  149. package/dist/lib/interactive.d.ts +13 -0
  150. package/dist/lib/interactive.d.ts.map +1 -0
  151. package/dist/lib/interactive.js +24 -0
  152. package/dist/lib/interactive.js.map +1 -0
  153. package/dist/lib/output.d.ts +24 -0
  154. package/dist/lib/output.d.ts.map +1 -0
  155. package/dist/lib/output.js +71 -0
  156. package/dist/lib/output.js.map +1 -0
  157. package/dist/lib/prepare-artifact.d.ts +22 -0
  158. package/dist/lib/prepare-artifact.d.ts.map +1 -0
  159. package/dist/lib/prepare-artifact.js +26 -0
  160. package/dist/lib/prepare-artifact.js.map +1 -0
  161. package/dist/lib/preview-args.d.ts +20 -0
  162. package/dist/lib/preview-args.d.ts.map +1 -0
  163. package/dist/lib/preview-args.js +19 -0
  164. package/dist/lib/preview-args.js.map +1 -0
  165. package/dist/lib/resolve-slug.d.ts.map +1 -1
  166. package/dist/lib/resolve-slug.js +9 -2
  167. package/dist/lib/resolve-slug.js.map +1 -1
  168. package/dist/lib/safe-json.d.ts +7 -2
  169. package/dist/lib/safe-json.d.ts.map +1 -1
  170. package/dist/lib/safe-json.js +23 -4
  171. package/dist/lib/safe-json.js.map +1 -1
  172. package/dist/lib/update-check.d.ts +17 -0
  173. package/dist/lib/update-check.d.ts.map +1 -0
  174. package/dist/lib/update-check.js +81 -0
  175. package/dist/lib/update-check.js.map +1 -0
  176. package/dist/lib/upload-limits.d.ts +17 -0
  177. package/dist/lib/upload-limits.d.ts.map +1 -0
  178. package/dist/lib/upload-limits.js +17 -0
  179. package/dist/lib/upload-limits.js.map +1 -0
  180. package/dist/lib/zip-project.d.ts +19 -0
  181. package/dist/lib/zip-project.d.ts.map +1 -0
  182. package/dist/lib/zip-project.js +39 -0
  183. package/dist/lib/zip-project.js.map +1 -0
  184. package/dist/version.d.ts +2 -0
  185. package/dist/version.d.ts.map +1 -0
  186. package/dist/version.js +16 -0
  187. package/dist/version.js.map +1 -0
  188. package/package.json +5 -8
@@ -0,0 +1,105 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'node:fs';
3
+ import { getToken } from '../lib/config.js';
4
+ import { resolveSlug } from '../lib/resolve-slug.js';
5
+ import { api } from '../lib/api.js';
6
+ import { safeJson } from '../lib/safe-json.js';
7
+ const ensureAuthed = () => {
8
+ const token = getToken();
9
+ if (!token) {
10
+ console.log(chalk.red('> not logged in.'));
11
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
12
+ process.exit(1);
13
+ }
14
+ const slug = resolveSlug();
15
+ if (!slug) {
16
+ console.log(chalk.red('> no project here. run pushto init first.'));
17
+ process.exit(1);
18
+ }
19
+ return slug;
20
+ };
21
+ const parseFlags = (args) => {
22
+ const out = {};
23
+ for (let i = 0; i < args.length; i++) {
24
+ const a = args[i];
25
+ if (!a.startsWith('--'))
26
+ continue;
27
+ const key = a.slice(2);
28
+ const next = args[i + 1];
29
+ if (next && !next.startsWith('--')) {
30
+ out[key] = next;
31
+ i++;
32
+ }
33
+ else {
34
+ out[key] = 'true';
35
+ }
36
+ }
37
+ return out;
38
+ };
39
+ const usage = () => {
40
+ console.log(chalk.dim(' usage:'));
41
+ console.log(chalk.cyan(' pushto mail send --to <addr> --subject <s> --body <b>'));
42
+ console.log(chalk.cyan(' pushto mail send --to <addr> --subject <s> --file <path>') + chalk.dim(' body from file'));
43
+ console.log(chalk.cyan(' pushto mail ls') + chalk.dim(' last 50 sends'));
44
+ };
45
+ export const mail = async (action, args) => {
46
+ if (!action || action === 'help')
47
+ return usage();
48
+ const slug = ensureAuthed();
49
+ if (action === 'send') {
50
+ const flags = parseFlags(args);
51
+ const to = flags.to;
52
+ const subject = flags.subject;
53
+ let body = flags.body;
54
+ if (!body && flags.file) {
55
+ if (!fs.existsSync(flags.file)) {
56
+ console.log(chalk.red(`> can't find ${flags.file}.`));
57
+ process.exit(1);
58
+ }
59
+ body = fs.readFileSync(flags.file, 'utf-8');
60
+ }
61
+ if (!to || !subject || !body) {
62
+ console.log(chalk.red('> need --to, --subject, and --body (or --file).'));
63
+ process.exit(1);
64
+ }
65
+ const res = await api(`/cli/projects/${slug}/mail`, {
66
+ method: 'POST',
67
+ body: JSON.stringify({ to, subject, body }),
68
+ });
69
+ if (!res.ok) {
70
+ const data = await safeJson(res);
71
+ console.log(chalk.red(`> ${data.error ?? 'send failed.'}`));
72
+ process.exit(1);
73
+ }
74
+ const data = await safeJson(res);
75
+ console.log(chalk.green(`> ${data.message}`));
76
+ console.log(chalk.dim(` id: `) + chalk.cyan(data.id));
77
+ return;
78
+ }
79
+ if (action === 'ls' || action === 'list' || action === 'history') {
80
+ const res = await api(`/cli/projects/${slug}/mail`);
81
+ if (!res.ok) {
82
+ const data = await safeJson(res);
83
+ console.log(chalk.red(`> ${data.error ?? 'failed to list sends.'}`));
84
+ process.exit(1);
85
+ }
86
+ const data = await safeJson(res);
87
+ if (data.sends.length === 0) {
88
+ console.log(chalk.dim('> no emails sent yet.'));
89
+ return;
90
+ }
91
+ console.log(chalk.green(`> ${slug} mail — last ${data.sends.length} send${data.sends.length !== 1 ? 's' : ''}\n`));
92
+ for (const s of data.sends) {
93
+ const when = new Date(s.createdAt).toISOString().replace('T', ' ').slice(0, 19);
94
+ const status = s.status === 'sent' || s.status === 'delivered'
95
+ ? chalk.green(s.status)
96
+ : s.status === 'queued'
97
+ ? chalk.yellow(s.status)
98
+ : chalk.red(s.status);
99
+ console.log(` ${chalk.dim(when)} ${status} ${chalk.cyan(s.toAddress.padEnd(30))} ${s.subject}`);
100
+ }
101
+ return;
102
+ }
103
+ usage();
104
+ };
105
+ //# sourceMappingURL=mail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.js","sourceRoot":"","sources":["../../src/commands/mail.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,IAAI,QAAa,OAAO,CAAC,IAAI,CAsBzC,CAAC"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,IAAI,QAAa,OAAO,CAAC,IAAI,CAiCzC,CAAC"}
@@ -1,21 +1,45 @@
1
1
  import chalk from 'chalk';
2
- import { execSync } from 'node:child_process';
2
+ import { execFileSync } from 'node:child_process';
3
3
  import { resolveSlug } from '../lib/resolve-slug.js';
4
+ import { api } from '../lib/api.js';
5
+ import { safeJson } from '../lib/safe-json.js';
6
+ /** Open a URL in the user's default browser, safely (no shell injection). */
7
+ const openUrl = (url) => {
8
+ const args = process.platform === 'darwin'
9
+ ? ['open', [url]]
10
+ : process.platform === 'win32'
11
+ ? ['cmd', ['/c', 'start', '', url]]
12
+ : ['xdg-open', [url]];
13
+ execFileSync(args[0], args[1], { stdio: 'ignore' });
14
+ };
4
15
  export const open = async () => {
5
16
  const slug = resolveSlug();
6
17
  if (!slug) {
7
18
  console.log(chalk.red('> no project here. run pushto init first.'));
8
19
  process.exit(1);
9
20
  }
10
- const url = `https://${slug}.pushto.host`;
21
+ // Prefer the custom domain if the user has one set — that's their REAL
22
+ // public URL. Pre-2026-05-02 `pushto open` always launched the
23
+ // <slug>.pushto.host subdomain, which works (CF still resolves it) but
24
+ // ignores the domain the user actually wants visitors to see. Falls
25
+ // back to the subdomain when the API is unreachable so offline use
26
+ // still works.
27
+ let url = `https://${slug}.pushto.host`;
28
+ try {
29
+ const res = await api(`/cli/projects/${slug}`);
30
+ if (res.ok) {
31
+ const project = await safeJson(res);
32
+ if (project.customDomain) {
33
+ url = `https://${project.customDomain}`;
34
+ }
35
+ }
36
+ }
37
+ catch {
38
+ // Network error or auth issue — stick with the subdomain default.
39
+ }
11
40
  console.log(chalk.green(`> opening ${url}`));
12
- const cmd = process.platform === 'darwin'
13
- ? `open "${url}"`
14
- : process.platform === 'win32'
15
- ? `start "${url}"`
16
- : `xdg-open "${url}"`;
17
41
  try {
18
- execSync(cmd, { stdio: 'ignore' });
42
+ openUrl(url);
19
43
  }
20
44
  catch {
21
45
  console.log(chalk.dim(` couldn't open browser. go to: `) + chalk.cyan(url));
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IAC5C,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,IAAI,cAAc,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;IAE7C,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,SAAS,GAAG,GAAG;QACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,UAAU,GAAG,GAAG;YAClB,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC;IAE5B,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,6EAA6E;AAC7E,MAAM,OAAO,GAAG,CAAC,GAAW,EAAQ,EAAE;IACpC,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IAC5C,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uEAAuE;IACvE,+DAA+D;IAC/D,uEAAuE;IACvE,oEAAoE;IACpE,mEAAmE;IACnE,eAAe;IACf,IAAI,GAAG,GAAG,WAAW,IAAI,cAAc,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAmC,GAAG,CAAC,CAAC;YACtE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,GAAG,GAAG,WAAW,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ interface PreviewOptions {
2
+ branch?: string;
3
+ label?: string;
4
+ }
5
+ /**
6
+ * `pushto preview` — deploy a temporary, shareable static copy of your site.
7
+ *
8
+ * pushto preview create from the current dir
9
+ * pushto preview create same, spelled out (the docs' form)
10
+ * pushto preview dist create from ./dist (a built static output)
11
+ * pushto preview create dist same, spelled out
12
+ * pushto preview --branch x label the preview "x" (defaults to git branch)
13
+ * pushto preview --label "demo" add a human-readable note
14
+ * pushto preview ls list active + expired previews
15
+ * pushto preview rm <ref> tear one down by id, branch, or label
16
+ *
17
+ * The action grammar lives in lib/preview-args.ts (tested); this file only
18
+ * carries the side effects.
19
+ */
20
+ export declare const preview: (action: string, args: string[], options?: PreviewOptions) => Promise<void>;
21
+ export {};
22
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAaA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyND;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO,GAClB,QAAQ,MAAM,EACd,MAAM,MAAM,EAAE,EACd,UAAS,cAAmB,KAC3B,OAAO,CAAC,IAAI,CAcd,CAAC"}
@@ -0,0 +1,223 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { getToken } from '../lib/config.js';
6
+ import { api, deploySignal } from '../lib/api.js';
7
+ import { resolveSlug } from '../lib/resolve-slug.js';
8
+ import { safeJson } from '../lib/safe-json.js';
9
+ import { getGitInfo, zipDirectory } from '../lib/zip-project.js';
10
+ import { SERVER_UPLOAD_CAP_BYTES, fmtMB } from '../lib/upload-limits.js';
11
+ import { prepareArtifact } from '../lib/prepare-artifact.js';
12
+ import { resolvePreviewAction } from '../lib/preview-args.js';
13
+ const daysUntil = (iso) => {
14
+ const diff = new Date(iso).getTime() - Date.now();
15
+ return Math.max(0, Math.ceil(diff / (1000 * 60 * 60 * 24)));
16
+ };
17
+ /** Resolve the active project or exit with an on-brand hint. */
18
+ const requireProject = () => {
19
+ const token = getToken();
20
+ if (!token) {
21
+ console.log(chalk.red('> not logged in.'));
22
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
23
+ process.exit(1);
24
+ }
25
+ const slug = resolveSlug();
26
+ if (!slug) {
27
+ console.log(chalk.red('> no project here.'));
28
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto init <name>') + chalk.dim(' to get started.'));
29
+ process.exit(1);
30
+ }
31
+ return slug;
32
+ };
33
+ const listPreviews = async (slug) => {
34
+ const spinner = ora('fetching previews...').start();
35
+ try {
36
+ const res = await api(`/cli/projects/${slug}/preview`);
37
+ if (!res.ok) {
38
+ const data = await safeJson(res);
39
+ spinner.fail(chalk.red(`> ${data.error ?? 'could not list previews.'}`));
40
+ process.exit(1);
41
+ }
42
+ const data = await safeJson(res);
43
+ const previews = data.previews ?? [];
44
+ spinner.stop();
45
+ if (previews.length === 0) {
46
+ console.log(chalk.dim('> no previews yet.'));
47
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto preview') + chalk.dim(' to create one.'));
48
+ return;
49
+ }
50
+ const active = previews.filter((p) => p.status === 'live' || p.status === 'building');
51
+ // the server owns the cap (LIMITS.PAID.preview.maxActive); 5 is only the
52
+ // offline fallback for older servers that don't send it
53
+ const maxActive = data.maxActive ?? 5;
54
+ console.log('');
55
+ console.log(chalk.dim(` active previews (${active.length}/${maxActive})`));
56
+ console.log('');
57
+ for (const p of previews) {
58
+ const color = p.status === 'live' ? chalk.green : p.status === 'building' ? chalk.yellow : chalk.dim;
59
+ const ttl = p.status === 'live' || p.status === 'building'
60
+ ? chalk.dim(` · ${daysUntil(p.expiresAt)}d left`)
61
+ : '';
62
+ console.log(` ${color(p.status.padEnd(9))} ${chalk.cyan(p.branch)}${p.label ? chalk.dim(' · ' + p.label) : ''}`);
63
+ console.log(` ${' '.repeat(9)} ${chalk.dim(p.previewUrl)}${ttl}`);
64
+ console.log(` ${' '.repeat(9)} ${chalk.dim('id: ' + p.id)}`);
65
+ console.log('');
66
+ }
67
+ console.log(chalk.dim(' remove one with ') + chalk.cyan('pushto preview rm <id, branch, or label>'));
68
+ }
69
+ catch (err) {
70
+ spinner.fail(chalk.red(`> ${err instanceof Error ? err.message : 'could not list previews.'}`));
71
+ process.exit(1);
72
+ }
73
+ };
74
+ const removePreview = async (slug, previewId) => {
75
+ if (!previewId) {
76
+ console.log(chalk.red('> which preview?'));
77
+ console.log(chalk.dim(' usage: ') + chalk.cyan('pushto preview rm <id, branch, or label>'));
78
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto preview ls') + chalk.dim(' to see them.'));
79
+ process.exit(1);
80
+ }
81
+ const spinner = ora('removing preview...').start();
82
+ try {
83
+ const res = await api(`/cli/projects/${slug}/preview/${encodeURIComponent(previewId)}`, {
84
+ method: 'DELETE',
85
+ });
86
+ if (!res.ok) {
87
+ const data = await safeJson(res);
88
+ spinner.fail(chalk.red(`> ${data.error ?? 'could not remove preview.'}`));
89
+ process.exit(1);
90
+ }
91
+ spinner.succeed(chalk.green('> preview removed.'));
92
+ }
93
+ catch (err) {
94
+ spinner.fail(chalk.red(`> ${err instanceof Error ? err.message : 'could not remove preview.'}`));
95
+ process.exit(1);
96
+ }
97
+ };
98
+ const createPreview = async (slug, dir, options) => {
99
+ const git = getGitInfo();
100
+ const branch = (options.branch ?? git.branch).trim();
101
+ const label = options.label?.trim() || null;
102
+ // Resolve + validate the target directory (defaults to cwd). Previews serve
103
+ // static files with no build step, so `pushto preview dist` lets a built app
104
+ // point at its output dir while a plain static site just runs `pushto preview`.
105
+ const targetDir = path.resolve(process.cwd(), dir);
106
+ if (!fs.existsSync(targetDir) || !fs.statSync(targetDir).isDirectory()) {
107
+ console.log(chalk.red(`> not a directory: ${dir}`));
108
+ process.exit(1);
109
+ }
110
+ // The branch is a label, not a git checkout — we upload whatever's in the
111
+ // directory. Previews are meant for non-main branches, but it's a nudge,
112
+ // not a gate (Scott's call: warn and continue).
113
+ if (branch === 'main' || branch === 'master') {
114
+ console.log(chalk.yellow(` heads up: previews are meant for non-main branches. labelling this one "${branch}" anyway.`));
115
+ }
116
+ console.log(chalk.dim('> previewing ') + chalk.cyan(slug) +
117
+ chalk.dim(' · branch ') + chalk.cyan(branch) +
118
+ chalk.dim(' · from ') + chalk.dim(targetDir));
119
+ // Static-output frameworks build HERE, on this machine, before the zip —
120
+ // same rule as `pushto`, applied to whichever directory this preview
121
+ // targets, so `pushto preview` and `pushto preview dist` cannot drift
122
+ // from what `pushto` itself would ship.
123
+ const buildSpinner = ora('checking project...').start();
124
+ const prep = await prepareArtifact(targetDir, (line) => { buildSpinner.text = line; });
125
+ if (prep.kind === 'failed') {
126
+ buildSpinner.fail(chalk.red('> build failed.'));
127
+ console.log('');
128
+ console.log(chalk.red(' reason: ') + chalk.dim(prep.message));
129
+ if (prep.buildOutput.trim()) {
130
+ const tail = prep.buildOutput.trim().split('\n').slice(-40).join('\n');
131
+ console.log(chalk.dim(tail.replace(/^/gm, ' ')));
132
+ }
133
+ process.exit(1);
134
+ }
135
+ if (prep.kind === 'artifact') {
136
+ buildSpinner.succeed(chalk.green(`> built with ${prep.framework}`));
137
+ }
138
+ else {
139
+ buildSpinner.stop();
140
+ }
141
+ const spinner = ora('zipping...').start();
142
+ try {
143
+ const { buffer: zipBuffer, fileCount } = await zipDirectory(prep.zipDir);
144
+ if (fileCount === 0) {
145
+ spinner.fail(chalk.red('> no files found in that directory.'));
146
+ console.log(chalk.dim(" is everything gitignored? wrong directory? a build dir that isn't built yet?"));
147
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto doctor') + chalk.dim(' to see what would be uploaded.'));
148
+ process.exit(1);
149
+ }
150
+ if (zipBuffer.length > SERVER_UPLOAD_CAP_BYTES) {
151
+ spinner.fail(chalk.red(`> preview is ${fmtMB(zipBuffer.length)}. server cap is ${fmtMB(SERVER_UPLOAD_CAP_BYTES)}.`));
152
+ console.log(chalk.dim(' add large files to .gitignore or .pushtoignore, or point at a smaller build dir.'));
153
+ process.exit(1);
154
+ }
155
+ spinner.text = `uploading ${(zipBuffer.length / 1024 / 1024).toFixed(1)}MB...`;
156
+ const form = new FormData();
157
+ form.append('branch', branch);
158
+ if (label)
159
+ form.append('label', label);
160
+ // Wrap in a fresh Uint8Array so the Blob part is ArrayBuffer-backed
161
+ // (a raw Node Buffer trips the strict BlobPart lib types). Mirrors how
162
+ // deploy.ts hands its zip to fetch.
163
+ form.append('archive', new Blob([new Uint8Array(zipBuffer)]), 'preview.zip');
164
+ const res = await api(`/cli/projects/${slug}/preview`, {
165
+ method: 'POST',
166
+ body: form,
167
+ signal: deploySignal(),
168
+ });
169
+ if (!res.ok) {
170
+ if (prep.kind === 'artifact')
171
+ prep.cleanup();
172
+ const data = await safeJson(res);
173
+ spinner.fail(chalk.red(`> ${data.error ?? 'preview failed.'}`));
174
+ process.exit(1);
175
+ }
176
+ const data = await safeJson(res);
177
+ const preview = data.preview;
178
+ spinner.succeed(chalk.green(`> preview live (${fileCount} files)`));
179
+ if (prep.kind === 'artifact')
180
+ prep.cleanup();
181
+ console.log('');
182
+ console.log(` ${chalk.cyan(preview.previewUrl)}`);
183
+ console.log(` ${chalk.dim('expires in ' + daysUntil(preview.expiresAt) + ' days · share it with anyone, no login required')}`);
184
+ console.log('');
185
+ console.log(chalk.dim(' manage your previews with ') + chalk.cyan('pushto preview ls'));
186
+ console.log('');
187
+ }
188
+ catch (err) {
189
+ if (prep.kind === 'artifact')
190
+ prep.cleanup();
191
+ spinner.fail(chalk.red(`> preview failed: ${err instanceof Error ? err.message : 'unknown error'}`));
192
+ process.exit(1);
193
+ }
194
+ };
195
+ /**
196
+ * `pushto preview` — deploy a temporary, shareable static copy of your site.
197
+ *
198
+ * pushto preview create from the current dir
199
+ * pushto preview create same, spelled out (the docs' form)
200
+ * pushto preview dist create from ./dist (a built static output)
201
+ * pushto preview create dist same, spelled out
202
+ * pushto preview --branch x label the preview "x" (defaults to git branch)
203
+ * pushto preview --label "demo" add a human-readable note
204
+ * pushto preview ls list active + expired previews
205
+ * pushto preview rm <ref> tear one down by id, branch, or label
206
+ *
207
+ * The action grammar lives in lib/preview-args.ts (tested); this file only
208
+ * carries the side effects.
209
+ */
210
+ export const preview = async (action, args, options = {}) => {
211
+ const slug = requireProject();
212
+ const resolved = resolvePreviewAction(action, args);
213
+ if (resolved.kind === 'ls') {
214
+ await listPreviews(slug);
215
+ return;
216
+ }
217
+ if (resolved.kind === 'rm') {
218
+ await removePreview(slug, resolved.ref);
219
+ return;
220
+ }
221
+ await createPreview(slug, resolved.dir, options);
222
+ };
223
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export declare const status: () => Promise<void>;
1
+ export declare const status: (opts?: {
2
+ json?: boolean;
3
+ }) => Promise<void>;
2
4
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CA0C3C,CAAC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,MAAM,GAAU,OAAM;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,KAAG,OAAO,CAAC,IAAI,CAuGxE,CAAC"}
@@ -3,6 +3,7 @@ import { getToken } from '../lib/config.js';
3
3
  import { api } from '../lib/api.js';
4
4
  import { resolveSlug } from '../lib/resolve-slug.js';
5
5
  import { safeJson } from '../lib/safe-json.js';
6
+ import { fail, emitOk } from '../lib/output.js';
6
7
  const STATUS_COLORS = {
7
8
  CREATED: chalk.dim,
8
9
  BUILDING: chalk.yellow,
@@ -12,38 +13,87 @@ const STATUS_COLORS = {
12
13
  FAILED: chalk.red,
13
14
  SUSPENDED: chalk.red,
14
15
  };
15
- export const status = async () => {
16
+ export const status = async (opts = {}) => {
16
17
  const token = getToken();
17
18
  if (!token) {
18
- console.log(chalk.red('> not logged in.'));
19
- console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
20
- process.exit(1);
19
+ fail('NOT_AUTHENTICATED', 'not logged in.', opts, {
20
+ stage: 'auth',
21
+ fix: { label: 'sign in', cmd: 'pushto login', prose: 'run {cmd} first.' },
22
+ });
21
23
  }
22
24
  const slug = resolveSlug();
23
25
  if (!slug) {
24
- console.log(chalk.red('> no project here.'));
25
- console.log(chalk.dim(' run ') + chalk.cyan('pushto init <name>') + chalk.dim(' first.'));
26
- process.exit(1);
26
+ fail('NO_PROJECT', 'no project here.', opts, {
27
+ fix: { label: 'get started', cmd: 'pushto init <name>', prose: 'run {cmd} first.' },
28
+ });
27
29
  }
28
30
  try {
29
31
  const res = await api(`/cli/projects/${slug}`);
30
32
  if (!res.ok) {
31
33
  const data = await safeJson(res);
32
- console.log(chalk.red(`> ${data.error ?? 'something went wrong.'}`));
33
- process.exit(1);
34
+ fail('SERVER_ERROR', data.error ?? 'something went wrong.', opts);
34
35
  }
35
36
  const project = await safeJson(res);
36
37
  const colorFn = STATUS_COLORS[project.status] ?? chalk.dim;
38
+ // Early return keeps the human block below byte-identical rather than
39
+ // re-indenting forty lines of hand-tuned copy behind an `if`.
40
+ if (opts.json) {
41
+ emitOk({
42
+ name: project.name,
43
+ status: project.status,
44
+ subdomain: project.subdomain,
45
+ url: `https://${project.subdomain}.pushto.host`,
46
+ ...(project.customDomain ? { customDomain: project.customDomain } : {}),
47
+ }, opts);
48
+ return;
49
+ }
37
50
  console.log(chalk.green(`> ${project.name}`));
38
51
  console.log(chalk.dim(' status: ') + colorFn(project.status.toLowerCase()));
39
52
  console.log(chalk.dim(' url: ') + chalk.cyan(`${project.subdomain}.pushto.host`));
40
53
  if (project.customDomain) {
41
54
  console.log(chalk.dim(' domain: ') + chalk.cyan(project.customDomain));
42
55
  }
56
+ // Status-specific next-step hints. The status line above tells the user
57
+ // *what*; this block tells them *what to do about it*.
58
+ if (project.status === 'FAILED') {
59
+ console.log('');
60
+ console.log(chalk.dim(' last deploy didn\'t go live. run ') +
61
+ chalk.cyan('pushto logs') +
62
+ chalk.dim(' to see what crashed,'));
63
+ console.log(chalk.dim(' then ') +
64
+ chalk.cyan('pushto') +
65
+ chalk.dim(' to redeploy after fixing.'));
66
+ }
67
+ else if (project.status === 'BUILDING' || project.status === 'DEPLOYING') {
68
+ console.log('');
69
+ console.log(chalk.dim(' building right now. small projects finish in ~30s; rust workspaces / heavy node apps can take a few minutes.'));
70
+ console.log(chalk.dim(' watch progress: ') +
71
+ chalk.cyan('pushto logs') +
72
+ chalk.dim(' or ') +
73
+ chalk.cyan(`https://pushto.host/dashboard/projects/${slug}`));
74
+ }
75
+ else if (project.status === 'SLEEPING') {
76
+ console.log('');
77
+ console.log(chalk.dim(' asleep on the free tier. first hit wakes it (~2s).'));
78
+ }
79
+ else if (project.status === 'CREATED') {
80
+ console.log('');
81
+ console.log(chalk.dim(' no code yet. run ') +
82
+ chalk.cyan('pushto') +
83
+ chalk.dim(' to deploy.'));
84
+ }
43
85
  }
44
- catch {
45
- console.log(chalk.red('> could not reach pushto.host. check your internet.'));
46
- process.exit(1);
86
+ catch (err) {
87
+ // Distinguish network failures from local errors (token decrypt, JSON
88
+ // parse, anything else). Same i61 fix shape as `pushto init` —
89
+ // pre-fix every exception blamed the user's internet, including
90
+ // bugs on our side or local filesystem issues.
91
+ const msg = err instanceof Error ? err.message : '';
92
+ const isNetwork = /fetch|enotfound|econnrefused|timeout|abort|network/i.test(msg);
93
+ if (isNetwork) {
94
+ fail('NETWORK', 'could not reach pushto.host. check your internet.', opts);
95
+ }
96
+ fail('SERVER_ERROR', `status check failed: ${msg || 'unknown error'}`, opts);
47
97
  }
48
98
  };
49
99
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,QAAa,OAAO,CAAC,IAAI,CAiB5C,CAAC"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,QAAa,OAAO,CAAC,IAAI,CAgD5C,CAAC"}