@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.
- package/dist/commands/__tests__/deploy-domain.test.d.ts +2 -0
- package/dist/commands/__tests__/deploy-domain.test.d.ts.map +1 -0
- package/dist/commands/__tests__/deploy-domain.test.js +41 -0
- package/dist/commands/__tests__/deploy-domain.test.js.map +1 -0
- package/dist/commands/__tests__/headless-smoke.test.d.ts +2 -0
- package/dist/commands/__tests__/headless-smoke.test.d.ts.map +1 -0
- package/dist/commands/__tests__/headless-smoke.test.js +110 -0
- package/dist/commands/__tests__/headless-smoke.test.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +77 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/cron.d.ts +2 -0
- package/dist/commands/cron.d.ts.map +1 -0
- package/dist/commands/cron.js +157 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/db.d.ts +4 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +63 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +230 -150
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +289 -54
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domain.d.ts.map +1 -1
- package/dist/commands/domain.js +52 -7
- package/dist/commands/domain.js.map +1 -1
- package/dist/commands/echo.d.ts +2 -0
- package/dist/commands/echo.d.ts.map +1 -0
- package/dist/commands/echo.js +227 -0
- package/dist/commands/echo.js.map +1 -0
- package/dist/commands/env.d.ts +3 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +76 -50
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/init.d.ts +3 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +58 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +50 -23
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +3 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +77 -21
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mail.d.ts +2 -0
- package/dist/commands/mail.d.ts.map +1 -0
- package/dist/commands/mail.js +105 -0
- package/dist/commands/mail.js.map +1 -0
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +21 -1
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/preview.d.ts +22 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +223 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/status.d.ts +3 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +62 -12
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +73 -10
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/use.d.ts +2 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +108 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/commands/vault.d.ts +2 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +119 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +12 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +117 -14
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/build-runner.test.d.ts +2 -0
- package/dist/lib/__tests__/build-runner.test.d.ts.map +1 -0
- package/dist/lib/__tests__/build-runner.test.js +119 -0
- package/dist/lib/__tests__/build-runner.test.js.map +1 -0
- package/dist/lib/__tests__/cron-tail.test.d.ts +2 -0
- package/dist/lib/__tests__/cron-tail.test.d.ts.map +1 -0
- package/dist/lib/__tests__/cron-tail.test.js +27 -0
- package/dist/lib/__tests__/cron-tail.test.js.map +1 -0
- package/dist/lib/__tests__/detect-static-framework.test.d.ts +2 -0
- package/dist/lib/__tests__/detect-static-framework.test.d.ts.map +1 -0
- package/dist/lib/__tests__/detect-static-framework.test.js +146 -0
- package/dist/lib/__tests__/detect-static-framework.test.js.map +1 -0
- package/dist/lib/__tests__/errors.test.d.ts +2 -0
- package/dist/lib/__tests__/errors.test.d.ts.map +1 -0
- package/dist/lib/__tests__/errors.test.js +56 -0
- package/dist/lib/__tests__/errors.test.js.map +1 -0
- package/dist/lib/__tests__/interactive.test.d.ts +2 -0
- package/dist/lib/__tests__/interactive.test.d.ts.map +1 -0
- package/dist/lib/__tests__/interactive.test.js +79 -0
- package/dist/lib/__tests__/interactive.test.js.map +1 -0
- package/dist/lib/__tests__/output.test.d.ts +2 -0
- package/dist/lib/__tests__/output.test.d.ts.map +1 -0
- package/dist/lib/__tests__/output.test.js +144 -0
- package/dist/lib/__tests__/output.test.js.map +1 -0
- package/dist/lib/__tests__/prepare-artifact.test.d.ts +2 -0
- package/dist/lib/__tests__/prepare-artifact.test.d.ts.map +1 -0
- package/dist/lib/__tests__/prepare-artifact.test.js +55 -0
- package/dist/lib/__tests__/prepare-artifact.test.js.map +1 -0
- package/dist/lib/__tests__/preview-args.test.d.ts +2 -0
- package/dist/lib/__tests__/preview-args.test.d.ts.map +1 -0
- package/dist/lib/__tests__/preview-args.test.js +37 -0
- package/dist/lib/__tests__/preview-args.test.js.map +1 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +22 -4
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/ask.d.ts +15 -0
- package/dist/lib/ask.d.ts.map +1 -0
- package/dist/lib/ask.js +24 -0
- package/dist/lib/ask.js.map +1 -0
- package/dist/lib/build-runner.d.ts +25 -0
- package/dist/lib/build-runner.d.ts.map +1 -0
- package/dist/lib/build-runner.js +141 -0
- package/dist/lib/build-runner.js.map +1 -0
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +7 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/cron-tail.d.ts +10 -0
- package/dist/lib/cron-tail.d.ts.map +1 -0
- package/dist/lib/cron-tail.js +5 -0
- package/dist/lib/cron-tail.js.map +1 -0
- package/dist/lib/detect-static-framework.d.ts +31 -0
- package/dist/lib/detect-static-framework.d.ts.map +1 -0
- package/dist/lib/detect-static-framework.js +96 -0
- package/dist/lib/detect-static-framework.js.map +1 -0
- package/dist/lib/env-parse.d.ts +48 -0
- package/dist/lib/env-parse.d.ts.map +1 -0
- package/dist/lib/env-parse.js +91 -0
- package/dist/lib/env-parse.js.map +1 -0
- package/dist/lib/errors.d.ts +111 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +64 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-walker.d.ts +23 -0
- package/dist/lib/file-walker.d.ts.map +1 -0
- package/dist/lib/file-walker.js +114 -0
- package/dist/lib/file-walker.js.map +1 -0
- package/dist/lib/interactive.d.ts +13 -0
- package/dist/lib/interactive.d.ts.map +1 -0
- package/dist/lib/interactive.js +24 -0
- package/dist/lib/interactive.js.map +1 -0
- package/dist/lib/output.d.ts +24 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +71 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prepare-artifact.d.ts +22 -0
- package/dist/lib/prepare-artifact.d.ts.map +1 -0
- package/dist/lib/prepare-artifact.js +26 -0
- package/dist/lib/prepare-artifact.js.map +1 -0
- package/dist/lib/preview-args.d.ts +20 -0
- package/dist/lib/preview-args.d.ts.map +1 -0
- package/dist/lib/preview-args.js +19 -0
- package/dist/lib/preview-args.js.map +1 -0
- package/dist/lib/safe-json.d.ts +7 -2
- package/dist/lib/safe-json.d.ts.map +1 -1
- package/dist/lib/safe-json.js +23 -4
- package/dist/lib/safe-json.js.map +1 -1
- package/dist/lib/update-check.d.ts +17 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +81 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/upload-limits.d.ts +17 -0
- package/dist/lib/upload-limits.d.ts.map +1 -0
- package/dist/lib/upload-limits.js +17 -0
- package/dist/lib/upload-limits.js.map +1 -0
- package/dist/lib/zip-project.d.ts +19 -0
- package/dist/lib/zip-project.d.ts.map +1 -0
- package/dist/lib/zip-project.js +39 -0
- package/dist/lib/zip-project.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/package.json +5 -8
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
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":"
|
|
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"}
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,19 +1,82 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { execSync } from 'node:child_process';
|
|
3
|
+
import { checkForUpdate, getCurrentVersion } from '../lib/update-check.js';
|
|
3
4
|
export const upgrade = async () => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
console.log(chalk.green('> checking for updates...'));
|
|
6
|
+
const info = await checkForUpdate(true);
|
|
7
|
+
if (!info) {
|
|
8
|
+
console.log(chalk.dim(' couldn\'t reach the npm registry. check your connection and try again.'));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!info.needsUpdate) {
|
|
12
|
+
console.log(chalk.green(` you're on the latest version (${info.current}). nothing to do.`));
|
|
13
|
+
console.log(chalk.dim(' go build something.'));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
console.log(chalk.yellow(` update available: ${info.current} → ${chalk.bold(info.latest)}`));
|
|
17
|
+
console.log();
|
|
18
|
+
// Detect how the user installed the CLI and update accordingly
|
|
19
|
+
const pm = detectPackageManager();
|
|
20
|
+
const commands = {
|
|
21
|
+
brew: `brew update && brew upgrade pushto`,
|
|
22
|
+
npm: `npm install -g @pushto/cli@latest`,
|
|
23
|
+
yarn: `yarn global add @pushto/cli@latest`,
|
|
24
|
+
pnpm: `pnpm add -g @pushto/cli@latest`,
|
|
25
|
+
};
|
|
26
|
+
const cmd = commands[pm] ?? commands.npm;
|
|
27
|
+
console.log(chalk.green(`> upgrading via ${pm}...`));
|
|
28
|
+
console.log(chalk.dim(` running: ${cmd}`));
|
|
29
|
+
console.log();
|
|
30
|
+
try {
|
|
31
|
+
execSync(cmd, { stdio: 'inherit' });
|
|
32
|
+
console.log();
|
|
33
|
+
console.log(chalk.green(` upgraded to ${info.latest}. you're good.`));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
console.log();
|
|
37
|
+
console.log(chalk.red(' auto-upgrade failed. run this manually:'));
|
|
38
|
+
console.log(chalk.cyan(` ${cmd}`));
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
/** Best-effort detection of how the user installed the CLI globally. */
|
|
42
|
+
const detectPackageManager = () => {
|
|
43
|
+
// Homebrew installs the Bun-compiled binary; process.execPath points
|
|
44
|
+
// into a Homebrew prefix (Apple Silicon, Intel Mac, or Linuxbrew).
|
|
45
|
+
const exe = process.execPath;
|
|
46
|
+
if (exe.includes('/Cellar/') ||
|
|
47
|
+
exe.startsWith('/opt/homebrew/') ||
|
|
48
|
+
exe.includes('/linuxbrew/') ||
|
|
49
|
+
exe.includes('/home/linuxbrew/')) {
|
|
50
|
+
return 'brew';
|
|
51
|
+
}
|
|
52
|
+
const version = getCurrentVersion();
|
|
53
|
+
try {
|
|
54
|
+
const npmList = execSync('npm ls -g @pushto/cli --depth=0 2>/dev/null', {
|
|
55
|
+
encoding: 'utf-8',
|
|
56
|
+
});
|
|
57
|
+
if (npmList.includes(version))
|
|
58
|
+
return 'npm';
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
/* not installed via npm */
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const pnpmList = execSync('pnpm ls -g @pushto/cli --depth=0 2>/dev/null', {
|
|
65
|
+
encoding: 'utf-8',
|
|
66
|
+
});
|
|
67
|
+
if (pnpmList.includes(version))
|
|
68
|
+
return 'pnpm';
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
/* not installed via pnpm */
|
|
72
|
+
}
|
|
12
73
|
try {
|
|
13
|
-
execSync(
|
|
74
|
+
execSync('yarn global list --depth=0 2>/dev/null', { encoding: 'utf-8' });
|
|
75
|
+
return 'yarn';
|
|
14
76
|
}
|
|
15
77
|
catch {
|
|
16
|
-
|
|
78
|
+
/* not installed via yarn */
|
|
17
79
|
}
|
|
80
|
+
return 'npm'; // safe default
|
|
18
81
|
};
|
|
19
82
|
//# sourceMappingURL=upgrade.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAwEA,eAAO,MAAM,GAAG,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CA6CrD,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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, getProjectSlug, setProjectSlug } from '../lib/config.js';
|
|
6
|
+
import { api } from '../lib/api.js';
|
|
7
|
+
import { safeJson } from '../lib/safe-json.js';
|
|
8
|
+
const requireLogin = () => {
|
|
9
|
+
if (getToken())
|
|
10
|
+
return;
|
|
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
|
+
};
|
|
15
|
+
const hasLocalPushtoFile = () => {
|
|
16
|
+
try {
|
|
17
|
+
const f = path.join(process.cwd(), '.pushto');
|
|
18
|
+
fs.statSync(f);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const listProjects = async () => {
|
|
26
|
+
const spinner = ora('fetching your projects...').start();
|
|
27
|
+
let projects;
|
|
28
|
+
try {
|
|
29
|
+
const res = await api('/cli/projects');
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
const data = await safeJson(res);
|
|
32
|
+
spinner.fail(chalk.red(`> ${data.error ?? 'could not fetch projects.'}`));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
projects = await safeJson(res);
|
|
36
|
+
spinner.stop();
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
const msg = err instanceof Error ? err.message : '';
|
|
40
|
+
const isNetwork = /fetch|enotfound|econnrefused|timeout|abort|network/i.test(msg);
|
|
41
|
+
if (isNetwork) {
|
|
42
|
+
spinner.fail(chalk.red('> could not reach pushto.host. check your internet.'));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
spinner.fail(chalk.red(`> couldn't list projects: ${msg || 'unknown error'}`));
|
|
46
|
+
}
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
if (!projects || projects.length === 0) {
|
|
50
|
+
console.log(chalk.dim(" no projects yet. run ") + chalk.cyan('pushto init <name>') + chalk.dim(' to create one.'));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const current = getProjectSlug();
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log(chalk.dim(' your projects:'));
|
|
56
|
+
for (const p of projects) {
|
|
57
|
+
const marker = p.slug === current ? chalk.green('*') : ' ';
|
|
58
|
+
console.log(` ${marker} ${chalk.cyan(p.slug.padEnd(24))}${chalk.dim(p.status.toLowerCase())}`);
|
|
59
|
+
}
|
|
60
|
+
console.log('');
|
|
61
|
+
console.log(chalk.dim(' switch with ') + chalk.cyan('pushto use <slug>'));
|
|
62
|
+
console.log('');
|
|
63
|
+
};
|
|
64
|
+
export const use = async (slug) => {
|
|
65
|
+
requireLogin();
|
|
66
|
+
if (!slug) {
|
|
67
|
+
await listProjects();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const normalized = slug.toLowerCase();
|
|
71
|
+
const spinner = ora(`verifying ${normalized}...`).start();
|
|
72
|
+
try {
|
|
73
|
+
const res = await api(`/cli/projects/${encodeURIComponent(normalized)}`);
|
|
74
|
+
if (res.status === 404) {
|
|
75
|
+
spinner.fail(chalk.red(`> can't find a project named ${normalized}.`));
|
|
76
|
+
console.log(chalk.dim(' run ') + chalk.cyan('pushto use') + chalk.dim(' to see your projects.'));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
if (!res.ok) {
|
|
80
|
+
const data = await safeJson(res);
|
|
81
|
+
spinner.fail(chalk.red(`> ${data.error ?? 'something went wrong.'}`));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
spinner.stop();
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const msg = err instanceof Error ? err.message : '';
|
|
88
|
+
const isNetwork = /fetch|enotfound|econnrefused|timeout|abort|network/i.test(msg);
|
|
89
|
+
if (isNetwork) {
|
|
90
|
+
spinner.fail(chalk.red('> could not reach pushto.host. check your internet.'));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
spinner.fail(chalk.red(`> couldn't switch projects: ${msg || 'unknown error'}`));
|
|
94
|
+
}
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
setProjectSlug(normalized);
|
|
98
|
+
console.log('');
|
|
99
|
+
console.log(chalk.green(`> now using ${chalk.cyan(normalized)}`));
|
|
100
|
+
console.log(chalk.dim(` bare ${chalk.cyan('pushto')} commands will target ${normalized}.pushto.host`));
|
|
101
|
+
if (hasLocalPushtoFile()) {
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(chalk.yellow(' heads up: this directory has a .pushto file that overrides the global.'));
|
|
104
|
+
console.log(chalk.dim(' delete .pushto here if you want the global slug to apply.'));
|
|
105
|
+
}
|
|
106
|
+
console.log('');
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,KAAK,GAAU,QAAQ,MAAM,EAAE,MAAM,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CA0FxE,CAAC"}
|