@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,227 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getToken } from '../lib/config.js';
|
|
3
|
+
import { resolveSlug } from '../lib/resolve-slug.js';
|
|
4
|
+
import { api } from '../lib/api.js';
|
|
5
|
+
import { safeJson } from '../lib/safe-json.js';
|
|
6
|
+
const ensureAuthed = () => {
|
|
7
|
+
const token = getToken();
|
|
8
|
+
if (!token) {
|
|
9
|
+
console.log(chalk.red('> not logged in.'));
|
|
10
|
+
console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const slug = resolveSlug();
|
|
14
|
+
if (!slug) {
|
|
15
|
+
console.log(chalk.red('> no project here. run pushto init first.'));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
return slug;
|
|
19
|
+
};
|
|
20
|
+
const usage = () => {
|
|
21
|
+
console.log(chalk.dim(' usage:'));
|
|
22
|
+
console.log(chalk.cyan(' pushto echo on') + chalk.dim(' start recording'));
|
|
23
|
+
console.log(chalk.cyan(' pushto echo off') + chalk.dim(' stop recording'));
|
|
24
|
+
console.log(chalk.cyan(' pushto echo status') + chalk.dim(' show settings + 24h routes'));
|
|
25
|
+
console.log(chalk.cyan(' pushto echo replay') + chalk.dim(' replay recent recordings'));
|
|
26
|
+
console.log();
|
|
27
|
+
console.log(chalk.dim(' replay flags:'));
|
|
28
|
+
console.log(chalk.dim(' --target=<url> https url under your project (preview/prod/custom)'));
|
|
29
|
+
console.log(chalk.dim(' --label=<text> optional human label'));
|
|
30
|
+
console.log(chalk.dim(' --since=<iso> only recordings since that timestamp'));
|
|
31
|
+
console.log(chalk.dim(' --route=<sig> filter by route signature, e.g. "GET /api/x"'));
|
|
32
|
+
console.log(chalk.dim(' --status=<n> filter by recorded status code'));
|
|
33
|
+
console.log(chalk.dim(' --limit=<n> max recordings (default 100, max 500)'));
|
|
34
|
+
};
|
|
35
|
+
const parseFlags = (args) => {
|
|
36
|
+
const out = {};
|
|
37
|
+
for (const a of args) {
|
|
38
|
+
const m = /^--([\w-]+)(?:=(.*))?$/.exec(a);
|
|
39
|
+
if (!m)
|
|
40
|
+
continue;
|
|
41
|
+
out[m[1]] = m[2] ?? 'true';
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
};
|
|
45
|
+
const showStatus = async (slug) => {
|
|
46
|
+
const res = await api(`/cli/projects/${slug}/echo`);
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const data = await safeJson(res);
|
|
49
|
+
console.log(chalk.red(`> ${data.error ?? 'failed to load echo status.'}`));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const data = (await res.json());
|
|
53
|
+
const dot = data.enabled ? chalk.green('●') : chalk.dim('○');
|
|
54
|
+
console.log(`${dot} echo ${data.enabled ? chalk.green('on') : chalk.dim('off')}`);
|
|
55
|
+
console.log(chalk.dim(' retention ') +
|
|
56
|
+
`${data.retentionDays}d ${data.retentionDays === 30 ? chalk.dim('(max)') : ''}`);
|
|
57
|
+
console.log(chalk.dim(' recordings ') +
|
|
58
|
+
`${data.usage.recordings.current.toLocaleString()} / ${data.usage.recordings.limit.toLocaleString()} this month`);
|
|
59
|
+
console.log(chalk.dim(' replays ') +
|
|
60
|
+
`${data.usage.replays.current.toLocaleString()} / ${data.usage.replays.limit.toLocaleString()} this month`);
|
|
61
|
+
if (data.routes.length === 0) {
|
|
62
|
+
console.log();
|
|
63
|
+
console.log(chalk.dim(' no routes recorded in the last 24h.'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
console.log();
|
|
67
|
+
console.log(chalk.dim(' routes (last 24h):'));
|
|
68
|
+
for (const r of data.routes) {
|
|
69
|
+
const ok = chalk.green(`${r.okCount} ok`);
|
|
70
|
+
const err = r.errCount > 0 ? chalk.red(` ${r.errCount} err`) : '';
|
|
71
|
+
console.log(` ${r.routeSignature.padEnd(40)} ${ok}${err}`);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const setEnabled = async (slug, enabled) => {
|
|
75
|
+
const res = await api(`/cli/projects/${slug}/echo`, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
body: JSON.stringify({ enabled }),
|
|
78
|
+
});
|
|
79
|
+
if (!res.ok) {
|
|
80
|
+
const data = await safeJson(res);
|
|
81
|
+
console.log(chalk.red(`> ${data.error ?? 'failed.'}`));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (enabled) {
|
|
85
|
+
console.log(chalk.green('> recording on.'));
|
|
86
|
+
console.log(chalk.dim(' capturing up to 10k requests/month, retained 7 days.'));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log(chalk.dim('> recording off. existing recordings stay until expiry.'));
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
93
|
+
const formatProgressLine = (p) => {
|
|
94
|
+
const total = p.counts.identical + p.counts.tolerated + p.counts.breaking + p.counts.inconclusive;
|
|
95
|
+
const pct = p.recordingCount > 0 ? Math.round((total / p.recordingCount) * 100) : 0;
|
|
96
|
+
return ` ${total}/${p.recordingCount} (${pct}%) ${chalk.green(p.counts.identical + ' ok')} ${chalk.cyan(p.counts.tolerated + ' tol')} ${chalk.red(p.counts.breaking + ' break')} ${chalk.yellow(p.counts.inconclusive + ' incl')}`;
|
|
97
|
+
};
|
|
98
|
+
const runReplayCmd = async (slug, flags) => {
|
|
99
|
+
const target = flags.target;
|
|
100
|
+
if (!target) {
|
|
101
|
+
console.log(chalk.red('> --target=<url> is required.'));
|
|
102
|
+
console.log(chalk.dim(' e.g. --target=https://') + chalk.cyan(`fix-checkout-${slug}.preview.pushto.host`));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const isProd = (() => {
|
|
106
|
+
try {
|
|
107
|
+
return new URL(target).hostname.toLowerCase() === `${slug}.pushto.host`;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
})();
|
|
113
|
+
if (isProd) {
|
|
114
|
+
console.log(chalk.yellow('> heads up — that target is your production deploy.'));
|
|
115
|
+
console.log(chalk.dim(' any mutating request will mutate prod data. add an ') +
|
|
116
|
+
chalk.cyan('x-pushto-replay') +
|
|
117
|
+
chalk.dim(' check on your server to no-op writes.'));
|
|
118
|
+
console.log(chalk.dim(` type "${slug}" and press enter to confirm:`));
|
|
119
|
+
const typed = await readLine();
|
|
120
|
+
if (typed.trim() !== slug) {
|
|
121
|
+
console.log(chalk.red('> aborted.'));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const startBody = { target };
|
|
126
|
+
if (flags.label)
|
|
127
|
+
startBody.label = flags.label;
|
|
128
|
+
if (flags.since)
|
|
129
|
+
startBody.since = flags.since;
|
|
130
|
+
if (flags.route)
|
|
131
|
+
startBody.route = flags.route;
|
|
132
|
+
if (flags.status)
|
|
133
|
+
startBody.status = Number(flags.status);
|
|
134
|
+
if (flags.limit)
|
|
135
|
+
startBody.limit = Number(flags.limit);
|
|
136
|
+
const startRes = await api(`/cli/projects/${slug}/echo/replay`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
body: JSON.stringify(startBody),
|
|
139
|
+
});
|
|
140
|
+
if (!startRes.ok) {
|
|
141
|
+
const data = await safeJson(startRes);
|
|
142
|
+
console.log(chalk.red(`> ${data.error ?? 'replay start failed.'}`));
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
const start = (await startRes.json());
|
|
146
|
+
console.log(chalk.dim(`> replaying ${start.recordingCount} recordings against ${target}`));
|
|
147
|
+
const startedAt = Date.now();
|
|
148
|
+
const TIMEOUT_MS = 5 * 60 * 1000;
|
|
149
|
+
let done = false;
|
|
150
|
+
let last = null;
|
|
151
|
+
while (!done) {
|
|
152
|
+
if (Date.now() - startedAt > TIMEOUT_MS) {
|
|
153
|
+
console.log(chalk.red('> giving up — replay still running after 5 minutes.'));
|
|
154
|
+
console.log(chalk.dim(` check the dashboard or rerun: pushto echo replay --target=${target}`));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
await sleep(2_000);
|
|
158
|
+
const r = await api(`/cli/projects/${slug}/echo/replay/${start.replayId}`);
|
|
159
|
+
if (!r.ok)
|
|
160
|
+
continue;
|
|
161
|
+
last = (await r.json());
|
|
162
|
+
process.stdout.write('\r' + formatProgressLine(last) + ' ');
|
|
163
|
+
if (last.replayStatus === 'COMPLETED' || last.replayStatus === 'FAILED') {
|
|
164
|
+
done = true;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
process.stdout.write('\n');
|
|
168
|
+
if (!last)
|
|
169
|
+
return;
|
|
170
|
+
if (last.replayStatus === 'FAILED') {
|
|
171
|
+
console.log(chalk.red(`> replay failed: ${last.failureReason ?? 'unknown error'}`));
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
console.log();
|
|
175
|
+
console.log(` ${chalk.green('✓')} ${last.counts.identical} identical`);
|
|
176
|
+
if (last.counts.tolerated > 0) {
|
|
177
|
+
console.log(` ${chalk.cyan('~')} ${last.counts.tolerated} tolerated diffs`);
|
|
178
|
+
}
|
|
179
|
+
console.log(` ${chalk.red('✗')} ${last.counts.breaking} breaking`);
|
|
180
|
+
console.log(` ${chalk.yellow('!')} ${last.counts.inconclusive} inconclusive`);
|
|
181
|
+
if (last.breakingExamples.length > 0) {
|
|
182
|
+
console.log();
|
|
183
|
+
console.log(chalk.dim(' breaking examples:'));
|
|
184
|
+
for (const ex of last.breakingExamples) {
|
|
185
|
+
const reasons = (ex.reasons ?? []).slice(0, 1).join('; ');
|
|
186
|
+
const arrow = ex.replayStatus !== null ? `${ex.recordedStatus} → ${ex.replayStatus}` : `${ex.recordedStatus}`;
|
|
187
|
+
console.log(` ${chalk.red(arrow)} ${chalk.dim(reasons)}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
console.log();
|
|
191
|
+
console.log(chalk.dim(` full report: https://pushto.host/dashboard/projects/${slug}/echo`));
|
|
192
|
+
if (last.counts.breaking > 0)
|
|
193
|
+
process.exit(1);
|
|
194
|
+
};
|
|
195
|
+
const readLine = () => new Promise((resolve) => {
|
|
196
|
+
let buf = '';
|
|
197
|
+
process.stdin.setEncoding('utf8');
|
|
198
|
+
const onData = (chunk) => {
|
|
199
|
+
buf += chunk;
|
|
200
|
+
const nl = buf.indexOf('\n');
|
|
201
|
+
if (nl >= 0) {
|
|
202
|
+
process.stdin.off('data', onData);
|
|
203
|
+
process.stdin.pause();
|
|
204
|
+
resolve(buf.slice(0, nl).replace(/\r$/, ''));
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
process.stdin.resume();
|
|
208
|
+
process.stdin.on('data', onData);
|
|
209
|
+
});
|
|
210
|
+
export const echo = async (action, args) => {
|
|
211
|
+
if (!action || action === 'help')
|
|
212
|
+
return usage();
|
|
213
|
+
const slug = ensureAuthed();
|
|
214
|
+
const flags = parseFlags(args);
|
|
215
|
+
if (action === 'status')
|
|
216
|
+
return showStatus(slug);
|
|
217
|
+
if (action === 'on')
|
|
218
|
+
return setEnabled(slug, true);
|
|
219
|
+
if (action === 'off')
|
|
220
|
+
return setEnabled(slug, false);
|
|
221
|
+
if (action === 'replay')
|
|
222
|
+
return runReplayCmd(slug, flags);
|
|
223
|
+
console.log(chalk.red(`> unknown action: ${action}`));
|
|
224
|
+
usage();
|
|
225
|
+
process.exit(1);
|
|
226
|
+
};
|
|
227
|
+
//# sourceMappingURL=echo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/commands/echo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAsC/C,MAAM,YAAY,GAAG,GAAW,EAAE;IAChC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,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;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,GAAS,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAc,EAA0B,EAAE;IAC5D,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC9B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;IACvD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAqB,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,6BAA6B,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAe,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACzB,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAClF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACzB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,CACnH,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACzB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,CAC7G,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,OAAgB,EAAiB,EAAE;IACzE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,iBAAiB,IAAI,OAAO,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;KAClC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAqB,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACpF,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE1E,MAAM,kBAAkB,GAAG,CAAC,CAAe,EAAU,EAAE;IACrD,MAAM,KAAK,GACT,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;IACtF,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,cAAc,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC;AAC1O,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,KAA6B,EAAiB,EAAE;IACxF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,sBAAsB,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,cAAc,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CACtD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,+BAA+B,CAAC,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAA4B,EAAE,MAAM,EAAE,CAAC;IACtD,IAAI,KAAK,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC/C,IAAI,KAAK,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC/C,IAAI,KAAK,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,iBAAiB,IAAI,cAAc,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;KAChC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAqB,QAAQ,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,sBAAsB,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,cAAc,uBAAuB,MAAM,EAAE,CAAC,CAAC,CAAC;IAE3F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,IAAI,GAAwB,IAAI,CAAC;IAErC,OAAO,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,MAAM,EAAE,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,iBAAiB,IAAI,gBAAgB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,SAAS;QACpB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAiB,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,YAAY,KAAK,WAAW,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACxE,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,YAAY,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,kBAAkB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,WAAW,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,eAAe,CAAC,CAAC;IAE/E,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC/C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;YAC9G,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,IAAI,OAAO,CAAC,CAAC,CAAC;IAE7F,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,GAAoB,EAAE,CACrC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;QAC/B,GAAG,IAAI,KAAK,CAAC;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAE,IAAc,EAAiB,EAAE;IAC1E,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,EAAE,CAAC;IAEjD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC;IACR,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/commands/env.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,GAAG,GACd,QAAQ,MAAM,EACd,MAAM,MAAM,EAAE,EACd,OAAM;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,KAC5B,OAAO,CAAC,IAAI,CAwMd,CAAC"}
|
package/dist/commands/env.js
CHANGED
|
@@ -5,31 +5,36 @@ import { getToken } from '../lib/config.js';
|
|
|
5
5
|
import { resolveSlug } from '../lib/resolve-slug.js';
|
|
6
6
|
import { api } from '../lib/api.js';
|
|
7
7
|
import { safeJson } from '../lib/safe-json.js';
|
|
8
|
-
|
|
8
|
+
import { parseEnvContent } from '../lib/env-parse.js';
|
|
9
|
+
import { fail, emitOk, emitErr } from '../lib/output.js';
|
|
10
|
+
import { buildError, exitCodeFor } from '../lib/errors.js';
|
|
11
|
+
export const env = async (action, args, opts = {}) => {
|
|
9
12
|
const token = getToken();
|
|
10
13
|
if (!token) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
fail('NOT_AUTHENTICATED', 'not logged in.', opts, {
|
|
15
|
+
stage: 'auth',
|
|
16
|
+
fix: { label: 'sign in', cmd: 'pushto login', prose: 'run {cmd} first.' },
|
|
17
|
+
});
|
|
14
18
|
}
|
|
15
19
|
const slug = resolveSlug();
|
|
16
20
|
if (!slug) {
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
// This command's copy puts the fix INSIDE the sentence, unlike status.ts
|
|
22
|
+
// which uses a second line. `human` carries it whole and no `fix` is
|
|
23
|
+
// attached, so the rendered line stays byte-identical. Agents still get
|
|
24
|
+
// the actionable part from `code: NO_PROJECT`.
|
|
25
|
+
fail('NO_PROJECT', 'no project here. run pushto init first.', opts);
|
|
19
26
|
}
|
|
20
27
|
if (action === 'set') {
|
|
21
28
|
// pushto env set KEY=value
|
|
22
29
|
const pair = args[0];
|
|
23
30
|
if (!pair || !pair.includes('=')) {
|
|
24
|
-
|
|
25
|
-
process.exit(1);
|
|
31
|
+
fail('BAD_USAGE', 'usage: pushto env set KEY=value', opts);
|
|
26
32
|
}
|
|
27
33
|
const eqIdx = pair.indexOf('=');
|
|
28
34
|
const key = pair.slice(0, eqIdx);
|
|
29
35
|
const value = pair.slice(eqIdx + 1);
|
|
30
36
|
if (!key) {
|
|
31
|
-
|
|
32
|
-
process.exit(1);
|
|
37
|
+
fail('INVALID_ENV_KEY', 'key is empty.', opts);
|
|
33
38
|
}
|
|
34
39
|
// Call the tRPC mutation via REST-like endpoint
|
|
35
40
|
// We'll use a simple CLI API endpoint for this
|
|
@@ -39,20 +44,30 @@ export const env = async (action, args) => {
|
|
|
39
44
|
});
|
|
40
45
|
if (!res.ok) {
|
|
41
46
|
const data = (await safeJson(res));
|
|
42
|
-
|
|
43
|
-
process.exit(1);
|
|
47
|
+
fail('SERVER_ERROR', data.error ?? 'failed to set env var.', opts);
|
|
44
48
|
}
|
|
49
|
+
const setData = await safeJson(res);
|
|
45
50
|
console.log(chalk.green(`> ${key} set.`));
|
|
51
|
+
if (setData.warning) {
|
|
52
|
+
console.log(chalk.yellow(` ${setData.warning}`));
|
|
53
|
+
}
|
|
46
54
|
}
|
|
47
55
|
else if (action === 'list' || action === 'ls') {
|
|
48
56
|
// pushto env list
|
|
49
57
|
const res = await api(`/cli/projects/${slug}/env`);
|
|
50
58
|
if (!res.ok) {
|
|
51
59
|
const data = (await safeJson(res));
|
|
52
|
-
|
|
53
|
-
process.exit(1);
|
|
60
|
+
fail('SERVER_ERROR', data.error ?? 'failed to list env vars.', opts);
|
|
54
61
|
}
|
|
55
62
|
const vars = await safeJson(res);
|
|
63
|
+
// Values are masked in the human table; the machine payload carries keys
|
|
64
|
+
// only for the same reason, so `--json` is not a secrets exfiltration
|
|
65
|
+
// path that the visible output would never permit. `pushto env pull`
|
|
66
|
+
// stays the deliberate way to get values onto disk.
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
emitOk({ project: slug, vars: vars.map((v) => ({ key: v.key })) }, opts);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
56
71
|
if (vars.length === 0) {
|
|
57
72
|
console.log(chalk.dim('> no env vars set.'));
|
|
58
73
|
return;
|
|
@@ -68,8 +83,7 @@ export const env = async (action, args) => {
|
|
|
68
83
|
const res = await api(`/cli/projects/${slug}/env`);
|
|
69
84
|
if (!res.ok) {
|
|
70
85
|
const data = (await safeJson(res));
|
|
71
|
-
|
|
72
|
-
process.exit(1);
|
|
86
|
+
fail('SERVER_ERROR', data.error ?? 'failed to pull env vars.', opts);
|
|
73
87
|
}
|
|
74
88
|
const vars = await safeJson(res);
|
|
75
89
|
if (vars.length === 0) {
|
|
@@ -83,50 +97,59 @@ export const env = async (action, args) => {
|
|
|
83
97
|
console.log(chalk.dim(' make sure .env is in your .gitignore.'));
|
|
84
98
|
}
|
|
85
99
|
else if (action === 'push') {
|
|
86
|
-
// pushto env push — upload local .env to project
|
|
100
|
+
// pushto env push — upload local .env to project in ONE bulk request.
|
|
101
|
+
// Pre-fix this looped a POST per var, and every POST restarts the
|
|
102
|
+
// container — a 50-var .env restarted the user's app 50 times in a row.
|
|
87
103
|
const envFile = args[0] || '.env';
|
|
88
104
|
const envPath = path.join(process.cwd(), envFile);
|
|
89
105
|
if (!fs.existsSync(envPath)) {
|
|
90
|
-
|
|
91
|
-
|
|
106
|
+
fail('NO_FILES', `${envFile} not found in this directory.`, opts, {
|
|
107
|
+
details: { file: envFile },
|
|
108
|
+
});
|
|
92
109
|
}
|
|
93
110
|
const content = fs.readFileSync(envPath, 'utf-8');
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
value = value.slice(1, -1);
|
|
108
|
-
}
|
|
109
|
-
if (!key)
|
|
110
|
-
continue;
|
|
111
|
-
const res = await api(`/cli/projects/${slug}/env`, {
|
|
112
|
-
method: 'POST',
|
|
113
|
-
body: JSON.stringify({ key, value }),
|
|
114
|
-
});
|
|
115
|
-
if (res.ok) {
|
|
116
|
-
count++;
|
|
117
|
-
console.log(chalk.dim(` ${key} ✓`));
|
|
111
|
+
const { vars, skipped: localSkipped } = parseEnvContent(content);
|
|
112
|
+
if (Object.keys(vars).length === 0) {
|
|
113
|
+
// Not fail(), because that exits immediately and the original prints
|
|
114
|
+
// the headline BEFORE the per-key reasons. emitErr keeps that order;
|
|
115
|
+
// the exit code is still derived, never hand-picked. The reasons are
|
|
116
|
+
// the actionable part, so machines get them as `details`.
|
|
117
|
+
emitErr(buildError('INVALID_ENV_KEY', `no usable KEY=value pairs in ${envFile}.`, {
|
|
118
|
+
details: { file: envFile, skipped: localSkipped },
|
|
119
|
+
}), opts);
|
|
120
|
+
if (!opts.json) {
|
|
121
|
+
for (const s of localSkipped) {
|
|
122
|
+
console.log(chalk.dim(` ${s.key}: ${s.reason}`));
|
|
123
|
+
}
|
|
118
124
|
}
|
|
119
|
-
|
|
120
|
-
|
|
125
|
+
process.exit(exitCodeFor('INVALID_ENV_KEY'));
|
|
126
|
+
}
|
|
127
|
+
const res = await api(`/cli/projects/${slug}/env`, {
|
|
128
|
+
method: 'PUT',
|
|
129
|
+
body: JSON.stringify({ vars }),
|
|
130
|
+
});
|
|
131
|
+
if (!res.ok) {
|
|
132
|
+
const data = await safeJson(res);
|
|
133
|
+
fail('SERVER_ERROR', data.error ?? 'failed to push env vars.', opts);
|
|
134
|
+
}
|
|
135
|
+
const pushData = await safeJson(res);
|
|
136
|
+
const imported = pushData.imported ?? 0;
|
|
137
|
+
const skipped = [...localSkipped, ...(pushData.skipped ?? [])];
|
|
138
|
+
console.log(chalk.green(`> pushed ${imported} var${imported !== 1 ? 's' : ''} from ${envFile}`));
|
|
139
|
+
if (skipped.length > 0) {
|
|
140
|
+
console.log(chalk.yellow(` ${skipped.length} skipped:`));
|
|
141
|
+
for (const s of skipped) {
|
|
142
|
+
console.log(chalk.dim(` ${s.key}: ${s.reason}`));
|
|
121
143
|
}
|
|
122
144
|
}
|
|
123
|
-
|
|
145
|
+
if (pushData.warning) {
|
|
146
|
+
console.log(chalk.yellow(` ${pushData.warning}`));
|
|
147
|
+
}
|
|
124
148
|
}
|
|
125
149
|
else if (action === 'rm' || action === 'remove' || action === 'delete') {
|
|
126
150
|
const key = args[0];
|
|
127
151
|
if (!key) {
|
|
128
|
-
|
|
129
|
-
process.exit(1);
|
|
152
|
+
fail('BAD_USAGE', 'usage: pushto env rm KEY', opts);
|
|
130
153
|
}
|
|
131
154
|
const res = await api(`/cli/projects/${slug}/env`, {
|
|
132
155
|
method: 'DELETE',
|
|
@@ -134,10 +157,13 @@ export const env = async (action, args) => {
|
|
|
134
157
|
});
|
|
135
158
|
if (!res.ok) {
|
|
136
159
|
const data = (await safeJson(res));
|
|
137
|
-
|
|
138
|
-
process.exit(1);
|
|
160
|
+
fail('SERVER_ERROR', data.error ?? 'failed to delete env var.', opts);
|
|
139
161
|
}
|
|
162
|
+
const rmData = await safeJson(res);
|
|
140
163
|
console.log(chalk.green(`> ${key} removed.`));
|
|
164
|
+
if (rmData.warning) {
|
|
165
|
+
console.log(chalk.yellow(` ${rmData.warning}`));
|
|
166
|
+
}
|
|
141
167
|
}
|
|
142
168
|
else {
|
|
143
169
|
console.log(chalk.dim(' usage:'));
|
package/dist/commands/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,IAAI,GAAU,MAAM,MAAM,EAAE,OAAM;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,KAAG,OAAO,CAAC,IAAI,CAsGpF,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -5,12 +5,45 @@ import path from 'node:path';
|
|
|
5
5
|
import { getToken, setProjectSlug } from '../lib/config.js';
|
|
6
6
|
import { api } from '../lib/api.js';
|
|
7
7
|
import { safeJson } from '../lib/safe-json.js';
|
|
8
|
-
|
|
8
|
+
import { fail, emitOk, spinnerStream } from '../lib/output.js';
|
|
9
|
+
import { exitCodeFor } from '../lib/errors.js';
|
|
10
|
+
export const init = async (name, opts = {}) => {
|
|
9
11
|
const token = getToken();
|
|
10
12
|
if (!token) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
fail('NOT_AUTHENTICATED', 'not logged in.', opts, {
|
|
14
|
+
stage: 'auth',
|
|
15
|
+
fix: { label: 'sign in', cmd: 'pushto login', prose: 'run {cmd} first.' },
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
// Refuse to clobber an existing .pushto. Pre-fix `pushto init <new>`
|
|
19
|
+
// in a dir that already had a .pushto silently overwrote it — the user
|
|
20
|
+
// lost the link to the old project AND the old project became an
|
|
21
|
+
// orphan on the server (still billable, no longer reachable from
|
|
22
|
+
// this dir). Now show what's already linked + how to proceed.
|
|
23
|
+
const pushtoPath = path.join(process.cwd(), '.pushto');
|
|
24
|
+
if (fs.existsSync(pushtoPath)) {
|
|
25
|
+
let existingSlug = 'unknown';
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(fs.readFileSync(pushtoPath, 'utf-8'));
|
|
28
|
+
if (typeof parsed.slug === 'string')
|
|
29
|
+
existingSlug = parsed.slug;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
/* malformed .pushto — fall through with 'unknown' */
|
|
33
|
+
}
|
|
34
|
+
// Three alternatives, so the human keeps its three tailored lines while
|
|
35
|
+
// the machine gets the linked slug in `details` and one canonical fix.
|
|
36
|
+
if (!opts.json) {
|
|
37
|
+
console.log(chalk.red(`> this directory is already linked to ${chalk.cyan(existingSlug)}.`));
|
|
38
|
+
console.log(chalk.dim(' to deploy that project, just run: ') + chalk.cyan('pushto'));
|
|
39
|
+
console.log(chalk.dim(' to switch projects, delete .pushto first: ') + chalk.cyan('rm .pushto'));
|
|
40
|
+
console.log(chalk.dim(' to start a new project, ') + chalk.cyan('cd') + chalk.dim(' to a different directory.'));
|
|
41
|
+
process.exit(exitCodeFor('BAD_USAGE'));
|
|
42
|
+
}
|
|
43
|
+
fail('BAD_USAGE', `this directory is already linked to ${existingSlug}.`, opts, {
|
|
44
|
+
details: { linkedSlug: existingSlug },
|
|
45
|
+
fix: { label: 'deploy the linked project', cmd: 'pushto' },
|
|
46
|
+
});
|
|
14
47
|
}
|
|
15
48
|
const slug = name
|
|
16
49
|
.toLowerCase()
|
|
@@ -18,10 +51,11 @@ export const init = async (name) => {
|
|
|
18
51
|
.replace(/-+/g, '-')
|
|
19
52
|
.replace(/^-|-$/g, '');
|
|
20
53
|
if (slug.length < 3) {
|
|
21
|
-
|
|
22
|
-
|
|
54
|
+
fail('BAD_USAGE', 'name too short. needs at least 3 characters.', opts, {
|
|
55
|
+
details: { slug, minLength: 3 },
|
|
56
|
+
});
|
|
23
57
|
}
|
|
24
|
-
const spinner = ora('creating project...').start();
|
|
58
|
+
const spinner = ora({ text: 'creating project...', stream: spinnerStream(opts) }).start();
|
|
25
59
|
try {
|
|
26
60
|
const res = await api('/cli/projects', {
|
|
27
61
|
method: 'POST',
|
|
@@ -29,14 +63,19 @@ export const init = async (name) => {
|
|
|
29
63
|
});
|
|
30
64
|
const data = await safeJson(res);
|
|
31
65
|
if (!res.ok) {
|
|
32
|
-
spinner.
|
|
33
|
-
|
|
66
|
+
spinner.stop();
|
|
67
|
+
fail('SERVER_ERROR', data.error ?? 'something went wrong.', opts);
|
|
34
68
|
}
|
|
35
69
|
// Write .pushto file in current directory
|
|
36
70
|
const pushtoConfig = { slug, projectId: data.project?.id };
|
|
37
71
|
fs.writeFileSync(path.join(process.cwd(), '.pushto'), JSON.stringify(pushtoConfig, null, 2) + '\n');
|
|
38
72
|
// Also store globally so bare `pushto` works from this dir
|
|
39
73
|
setProjectSlug(slug);
|
|
74
|
+
spinner.stop();
|
|
75
|
+
if (opts.json) {
|
|
76
|
+
emitOk({ slug, projectId: data.project?.id, url: `https://${slug}.pushto.host` }, opts);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
40
79
|
spinner.succeed(chalk.green(`> ${slug} is ready.`));
|
|
41
80
|
console.log(chalk.dim(` ${data.message ?? 'project created.'}`));
|
|
42
81
|
console.log();
|
|
@@ -44,8 +83,16 @@ export const init = async (name) => {
|
|
|
44
83
|
console.log(chalk.dim(' your url will be: ') + chalk.cyan(`${slug}.pushto.host`));
|
|
45
84
|
}
|
|
46
85
|
catch (err) {
|
|
47
|
-
|
|
48
|
-
|
|
86
|
+
// Distinguish network failures from local errors (write permission,
|
|
87
|
+
// disk full, etc.). The original blanket message blamed the user's
|
|
88
|
+
// internet for fs.writeFileSync failures and other local issues.
|
|
89
|
+
const msg = err instanceof Error ? err.message : '';
|
|
90
|
+
const isNetwork = /fetch|enotfound|econnrefused|timeout|abort|network/i.test(msg);
|
|
91
|
+
spinner.stop();
|
|
92
|
+
if (isNetwork) {
|
|
93
|
+
fail('NETWORK', 'could not reach pushto.host. check your internet.', opts);
|
|
94
|
+
}
|
|
95
|
+
fail('SERVER_ERROR', `init failed: ${msg || 'unknown error'}`, opts);
|
|
49
96
|
}
|
|
50
97
|
};
|
|
51
98
|
//# sourceMappingURL=init.js.map
|