@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.
- 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 +344 -68
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +401 -69
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domain.d.ts.map +1 -1
- package/dist/commands/domain.js +70 -18
- 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 +80 -39
- 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 +32 -8
- 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 +123 -13
- 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 +2 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +38 -5
- 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 +13 -2
- 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/resolve-slug.d.ts.map +1 -1
- package/dist/lib/resolve-slug.js +9 -2
- package/dist/lib/resolve-slug.js.map +1 -1
- 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,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":"
|
|
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"}
|
package/dist/commands/open.js
CHANGED
|
@@ -1,21 +1,45 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 +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"}
|