percher 0.2.11 → 0.4.0
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/bin/percher.js +7532 -3049
- package/dist/package.json +45 -0
- package/dist/src/ci-env.d.ts +6 -0
- package/dist/src/ci-env.d.ts.map +1 -0
- package/dist/src/ci-env.js +35 -0
- package/dist/src/ci-env.js.map +1 -0
- package/dist/src/cli-utils.d.ts +44 -0
- package/dist/src/cli-utils.d.ts.map +1 -0
- package/dist/src/cli-utils.js +129 -0
- package/dist/src/cli-utils.js.map +1 -0
- package/dist/src/commands/account.d.ts +4 -0
- package/dist/src/commands/account.d.ts.map +1 -0
- package/dist/src/commands/account.js +280 -0
- package/dist/src/commands/account.js.map +1 -0
- package/dist/src/commands/apps.d.ts +13 -0
- package/dist/src/commands/apps.d.ts.map +1 -0
- package/dist/src/commands/apps.js +483 -0
- package/dist/src/commands/apps.js.map +1 -0
- package/dist/src/commands/auth.d.ts +4 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +21 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/data.d.ts +4 -0
- package/dist/src/commands/data.d.ts.map +1 -0
- package/dist/src/commands/data.js +148 -0
- package/dist/src/commands/data.js.map +1 -0
- package/dist/src/commands/deploys.d.ts +4 -0
- package/dist/src/commands/deploys.d.ts.map +1 -0
- package/dist/src/commands/deploys.js +197 -0
- package/dist/src/commands/deploys.js.map +1 -0
- package/dist/src/commands/env.d.ts +4 -0
- package/dist/src/commands/env.d.ts.map +1 -0
- package/dist/src/commands/env.js +66 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/github.d.ts +4 -0
- package/dist/src/commands/github.d.ts.map +1 -0
- package/dist/src/commands/github.js +93 -0
- package/dist/src/commands/github.js.map +1 -0
- package/dist/src/commands/status.d.ts +4 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +53 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/env-set-input.d.ts +13 -0
- package/dist/src/env-set-input.d.ts.map +1 -0
- package/dist/src/env-set-input.js +59 -0
- package/dist/src/env-set-input.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +19 -790
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompt-hidden.d.ts +15 -0
- package/dist/src/prompt-hidden.d.ts.map +1 -0
- package/dist/src/prompt-hidden.js +104 -0
- package/dist/src/prompt-hidden.js.map +1 -0
- package/dist/src/telemetry.d.ts +1 -1
- package/dist/src/telemetry.d.ts.map +1 -1
- package/dist/src/telemetry.js +8 -1
- package/dist/src/telemetry.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
import * as core from "@percher/core";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { SilentExitError, writeLine } from "../cli-utils";
|
|
4
|
+
/**
|
|
5
|
+
* FUTURE12 Phase 8 — exhaustiveness tripwire for the publish-handler
|
|
6
|
+
* switch. Adding a new value to `PublishStatus` without a matching
|
|
7
|
+
* `case` here turns into a TypeScript error at the `assertNever(...)`
|
|
8
|
+
* call site (the discriminator narrows to `never` only when every
|
|
9
|
+
* union member is handled), and a runtime "Unhandled publish status"
|
|
10
|
+
* throw if a non-union value somehow reaches this default. Both are
|
|
11
|
+
* load-bearing — the runtime throw is what `handlePublishResult` relies
|
|
12
|
+
* on so tests can synthesise an out-of-union status via `unknown` cast.
|
|
13
|
+
*
|
|
14
|
+
* `PublishResult.status` is a union of strings, but `PublishResult`
|
|
15
|
+
* itself isn't a discriminated union (other fields aren't keyed off
|
|
16
|
+
* status), so we narrow on `result.status` directly rather than passing
|
|
17
|
+
* the whole result. The runtime message still echoes status + summary
|
|
18
|
+
* so a sentry alert pinpoints the offending value without spelunking.
|
|
19
|
+
*/
|
|
20
|
+
function assertNever(status, summary) {
|
|
21
|
+
throw new Error(`Unhandled publish status: ${JSON.stringify(status)}${summary ? ` (${summary})` : ""}`);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Render a `PublishResult` to the CLI. Extracted so a unit test can
|
|
25
|
+
* exercise the exhaustive switch with a synthesised out-of-union status
|
|
26
|
+
* (cast through `unknown`) without needing to mock the entire publish
|
|
27
|
+
* pipeline.
|
|
28
|
+
*/
|
|
29
|
+
export async function handlePublishResult(ctx, result, options = {}) {
|
|
30
|
+
switch (result.status) {
|
|
31
|
+
case "dry_run": {
|
|
32
|
+
await writeLine(ctx, `Dry run: ${result.fileCount} files, ${(result.bytes / 1024).toFixed(1)} KB`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
case "needs_login": {
|
|
36
|
+
if (result.loginUrl) {
|
|
37
|
+
await writeLine(ctx, `${pc.yellow("!")} Not logged in. Authorize here:`);
|
|
38
|
+
await writeLine(ctx, ` ${result.loginUrl}`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
await writeLine(ctx, `${pc.red("✗")} Not logged in. Run: percher login`);
|
|
42
|
+
}
|
|
43
|
+
throw new SilentExitError();
|
|
44
|
+
}
|
|
45
|
+
case "queued": {
|
|
46
|
+
// FUTURE11 async path — caller passed waitForLive: false (currently
|
|
47
|
+
// only reachable via the MCP/programmatic path, but PublishStatus
|
|
48
|
+
// includes it so the CLI must handle it explicitly rather than
|
|
49
|
+
// falling into the live-success block and printing "Published to
|
|
50
|
+
// undefined" for a row that isn't live yet).
|
|
51
|
+
await writeLine(ctx, `${pc.yellow("!")} ${result.summary}`);
|
|
52
|
+
const deployId = result.deployment?.id;
|
|
53
|
+
const appName = result.app?.name;
|
|
54
|
+
if (deployId && appName) {
|
|
55
|
+
await writeLine(ctx, pc.dim(` Next: percher wait-for-deploy ${deployId} --app ${appName}`));
|
|
56
|
+
}
|
|
57
|
+
else if (deployId) {
|
|
58
|
+
await writeLine(ctx, pc.dim(` Next: percher wait-for-deploy ${deployId}`));
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
case "already_in_progress": {
|
|
63
|
+
// FUTURE12 Phase 6d — server short-circuited the publish because a
|
|
64
|
+
// deploy is already in flight for this app. Print the existing
|
|
65
|
+
// deployId + the recommended next command so a human or agent has a
|
|
66
|
+
// clear path forward.
|
|
67
|
+
await writeLine(ctx, `${pc.yellow("!")} ${result.summary}`);
|
|
68
|
+
if (result.recovery.nextAction === "wait_deploy") {
|
|
69
|
+
const args = result.recovery.args;
|
|
70
|
+
if (args.app && args.deployId) {
|
|
71
|
+
await writeLine(ctx, pc.dim(` Next: percher wait-for-deploy ${args.deployId} --app ${args.app}`));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
case "replaced": {
|
|
77
|
+
// FUTURE11 review round 5 + FUTURE12 Phase 8: don't fall through to
|
|
78
|
+
// the live-success block (would print "Published to undefined" when
|
|
79
|
+
// resolver couldn't find a current live URL). The resolver populates
|
|
80
|
+
// `result.url` when there's a newer live deploy, a wait_deploy
|
|
81
|
+
// recovery when a newer deploy is in flight, and ask_user when it
|
|
82
|
+
// can't determine current state — surface the right hint per branch.
|
|
83
|
+
await writeLine(ctx, `${pc.yellow("!")} ${result.summary}`);
|
|
84
|
+
if (result.url) {
|
|
85
|
+
await writeLine(ctx, pc.dim(` Live URL: ${result.url}`));
|
|
86
|
+
}
|
|
87
|
+
if (result.recovery.nextAction === "wait_deploy") {
|
|
88
|
+
const args = result.recovery.args;
|
|
89
|
+
if (args.app && args.deployId) {
|
|
90
|
+
await writeLine(ctx, pc.dim(` Next: percher deploys inspect ${args.deployId} --app ${args.app}`));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (result.recovery.nextAction === "ask_user" ||
|
|
94
|
+
result.recovery.nextAction === "run_doctor") {
|
|
95
|
+
// FUTURE12 Phase 8 — resolver couldn't determine current state
|
|
96
|
+
// (latest deploy also failed/replaced, or listDeploys errored).
|
|
97
|
+
// Hand off to doctor as the spec's locked fallback line.
|
|
98
|
+
const appName = result.app?.name;
|
|
99
|
+
if (appName) {
|
|
100
|
+
await writeLine(ctx, pc.dim(` Next: percher doctor --app ${appName}`));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
await writeLine(ctx, pc.dim(" Next: percher doctor"));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
case "failed": {
|
|
109
|
+
await writeLine(ctx, `${pc.red("✗")} ${result.error?.title ?? "Deployment failed"}`);
|
|
110
|
+
if (result.error?.explanation) {
|
|
111
|
+
await writeLine(ctx, ` ${result.error.explanation}`);
|
|
112
|
+
}
|
|
113
|
+
if (result.error?.rawErrorMessage) {
|
|
114
|
+
// The classifier turns "Worker /deployer/run failed (502): upstream
|
|
115
|
+
// timeout after 30s" into a friendly explanation; keep the raw
|
|
116
|
+
// string visible too because it carries the load-bearing details
|
|
117
|
+
// (status code, hostname) support will ask for.
|
|
118
|
+
await writeLine(ctx, ` ${pc.dim(`Details: ${result.error.rawErrorMessage}`)}`);
|
|
119
|
+
}
|
|
120
|
+
if (result.error?.suggestion) {
|
|
121
|
+
await writeLine(ctx, ` ${pc.dim(result.error.suggestion)}`);
|
|
122
|
+
}
|
|
123
|
+
if (result.error?.missingEnvVars && result.error.missingEnvVars.length > 0) {
|
|
124
|
+
await writeLine(ctx, "");
|
|
125
|
+
await writeLine(ctx, pc.bold("Missing env vars:"));
|
|
126
|
+
for (const k of result.error.missingEnvVars) {
|
|
127
|
+
await writeLine(ctx, ` ${k}`);
|
|
128
|
+
}
|
|
129
|
+
await writeLine(ctx, pc.dim(` Set with: percher env set ${result.error.missingEnvVars[0]}=...`));
|
|
130
|
+
}
|
|
131
|
+
if (result.error?.relevantFiles && result.error.relevantFiles.length > 0) {
|
|
132
|
+
await writeLine(ctx, "");
|
|
133
|
+
await writeLine(ctx, pc.bold("Check these files:"));
|
|
134
|
+
for (const f of result.error.relevantFiles) {
|
|
135
|
+
await writeLine(ctx, ` ${f}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (result.error?.buildLogTail) {
|
|
139
|
+
await writeLine(ctx, "");
|
|
140
|
+
const lines = result.error.buildLogTail.split("\n");
|
|
141
|
+
await writeLine(ctx, `${pc.bold("Build log")} ${pc.dim(`(last ${lines.length} lines)`)}`);
|
|
142
|
+
for (const line of lines) {
|
|
143
|
+
await writeLine(ctx, ` ${line}`);
|
|
144
|
+
}
|
|
145
|
+
if (result.app?.id && result.deployment?.id) {
|
|
146
|
+
await writeLine(ctx, "");
|
|
147
|
+
await writeLine(ctx, pc.dim(`Full log: percher deploys inspect ${result.deployment.id} --app ${result.app.name}`));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
throw new SilentExitError();
|
|
151
|
+
}
|
|
152
|
+
case "live": {
|
|
153
|
+
const timing = result.timing ? ` (${result.timing.totalSeconds}s)` : "";
|
|
154
|
+
await writeLine(ctx, `${pc.green("✓")} Published to ${result.url}${timing}`);
|
|
155
|
+
// Phase 7.9 follow-up — surface the publish-wide trace ID so a
|
|
156
|
+
// user pasting a bug report into Discord includes the
|
|
157
|
+
// correlation key operators need to grep CLI ↔ API ↔ worker
|
|
158
|
+
// logs in one pass. Hidden behind pc.dim so it stays visual
|
|
159
|
+
// background; rendered only when the publish actually went
|
|
160
|
+
// live (other branches don't emit a successful publish row).
|
|
161
|
+
if (result.traceId) {
|
|
162
|
+
await writeLine(ctx, pc.dim(` Trace: ${result.traceId}`));
|
|
163
|
+
}
|
|
164
|
+
// Build-cache state. We surface this on every successful publish
|
|
165
|
+
// because hiding it caused a stale-image bug to go undiagnosed
|
|
166
|
+
// for three deploys in a row (kvittakvitto, 2026-05-01). When
|
|
167
|
+
// hit=true and the user expected new behavior, this single line
|
|
168
|
+
// points them at `--no-cache` directly.
|
|
169
|
+
// Phase 7.8 follow-up: `cacheReused` is the stronger signal
|
|
170
|
+
// (we never even uploaded) and supersedes the `cacheHit` line
|
|
171
|
+
// when set — the user gets one clear "what happened" line
|
|
172
|
+
// instead of two competing ones.
|
|
173
|
+
if (result.cacheReused) {
|
|
174
|
+
await writeLine(ctx, pc.dim(" Build cache: reused — identical bundle, redeployed without re-upload (--no-cache to force a fresh build)"));
|
|
175
|
+
}
|
|
176
|
+
else if (result.cacheHit === true) {
|
|
177
|
+
await writeLine(ctx, pc.dim(" Build cache: hit (reused image — re-run with --no-cache if your changes aren't reflected)"));
|
|
178
|
+
}
|
|
179
|
+
else if (result.cacheHit === false) {
|
|
180
|
+
await writeLine(ctx, pc.dim(" Build cache: miss (fresh build)"));
|
|
181
|
+
}
|
|
182
|
+
if (result.replacedPreview) {
|
|
183
|
+
await writeLine(ctx, pc.dim(" (replaced previous preview — free plan keeps 1 preview slot per app)"));
|
|
184
|
+
}
|
|
185
|
+
// Show QR code for preview deploys
|
|
186
|
+
if (options.preview && result.url) {
|
|
187
|
+
try {
|
|
188
|
+
const qr = await core.qrToTerminal(result.url);
|
|
189
|
+
await writeLine(ctx, "");
|
|
190
|
+
await writeLine(ctx, pc.dim("Scan to preview on mobile:"));
|
|
191
|
+
await writeLine(ctx, qr);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* QR generation is nice-to-have */
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (result.firstDeploy) {
|
|
198
|
+
await writeLine(ctx, "");
|
|
199
|
+
await writeLine(ctx, pc.bold("First deploy — next steps:"));
|
|
200
|
+
await writeLine(ctx, ` ${pc.cyan("percher dev")} watch for changes and re-deploy`);
|
|
201
|
+
await writeLine(ctx, ` ${pc.cyan("percher env set KEY")} add environment variables`);
|
|
202
|
+
await writeLine(ctx, ` ${pc.cyan("percher logs")} stream live logs`);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
default:
|
|
207
|
+
return assertNever(result.status, result.summary);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export function registerAppsCommands(cli, ctx) {
|
|
211
|
+
cli
|
|
212
|
+
.command("init", "Generate percher.toml for this project")
|
|
213
|
+
.option("--force", "Overwrite existing percher.toml")
|
|
214
|
+
.option("--name <name>", "Override detected app name")
|
|
215
|
+
.action(async (options) => {
|
|
216
|
+
const result = await core.init(ctx, { force: options.force, name: options.name });
|
|
217
|
+
await writeLine(ctx, `${pc.green("✓")} wrote ${result.path}`);
|
|
218
|
+
});
|
|
219
|
+
cli
|
|
220
|
+
.command("publish", "Publish this project to Percher (recommended deploy command)")
|
|
221
|
+
.option("--force", "Skip size warnings")
|
|
222
|
+
.option("--preview", "Deploy as preview (does not replace the live version)")
|
|
223
|
+
.option("-m, --message <msg>", "Deploy note (visible in deploy history)")
|
|
224
|
+
.option("--dry-run", "Show what would be deployed (file count, bytes) without uploading")
|
|
225
|
+
.option("--no-cache", "Skip image-cache lookup and force a fresh build (use when you suspect cached image is stale)")
|
|
226
|
+
.action(async (options) => {
|
|
227
|
+
const { detectCiBranchMessage } = await import("../ci-env");
|
|
228
|
+
let messageOverride = options.message;
|
|
229
|
+
if (options.preview && !options.message) {
|
|
230
|
+
const ci = detectCiBranchMessage(process.env);
|
|
231
|
+
if (ci) {
|
|
232
|
+
messageOverride = ci.message;
|
|
233
|
+
await writeLine(ctx, pc.dim(`Auto-detected ${ci.source} branch — using deploy note "${ci.message}"`));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const result = await core.publish(ctx, {
|
|
237
|
+
force: options.force,
|
|
238
|
+
preview: options.preview,
|
|
239
|
+
message: messageOverride,
|
|
240
|
+
dryRun: options.dryRun,
|
|
241
|
+
noCache: options.cache === false,
|
|
242
|
+
});
|
|
243
|
+
// FUTURE12 Phase 8 — exhaustive switch over PublishStatus lives
|
|
244
|
+
// in handlePublishResult so a future status addition fails type-
|
|
245
|
+
// check at the assertNever default rather than silently falling
|
|
246
|
+
// through to a misleading "Published to undefined" message.
|
|
247
|
+
await handlePublishResult(ctx, result, { preview: options.preview });
|
|
248
|
+
});
|
|
249
|
+
cli
|
|
250
|
+
.command("redeploy [deployId]", "Re-run an existing deploy without re-uploading source")
|
|
251
|
+
.option("--app <name>", "App name (defaults to percher.toml app.name)")
|
|
252
|
+
.action(async (deployId, options) => {
|
|
253
|
+
const result = await core.redeploy(ctx, {
|
|
254
|
+
app: options.app,
|
|
255
|
+
deployId,
|
|
256
|
+
});
|
|
257
|
+
if (result.status === "needs_login") {
|
|
258
|
+
await writeLine(ctx, `${pc.red("✗")} Not logged in. Run: percher login`);
|
|
259
|
+
throw new SilentExitError();
|
|
260
|
+
}
|
|
261
|
+
if (result.status === "failed") {
|
|
262
|
+
await writeLine(ctx, `${pc.red("✗")} ${result.error?.title ?? "Redeploy failed"}`);
|
|
263
|
+
if (result.error?.explanation) {
|
|
264
|
+
await writeLine(ctx, ` ${result.error.explanation}`);
|
|
265
|
+
}
|
|
266
|
+
if (result.error?.suggestion) {
|
|
267
|
+
await writeLine(ctx, ` ${pc.dim(result.error.suggestion)}`);
|
|
268
|
+
}
|
|
269
|
+
if (result.error?.problems && result.error.problems.length > 0) {
|
|
270
|
+
await writeLine(ctx, "");
|
|
271
|
+
await writeLine(ctx, pc.bold("Build problems:"));
|
|
272
|
+
for (const p of result.error.problems) {
|
|
273
|
+
const loc = p.file
|
|
274
|
+
? ` ${pc.dim(`${p.file}${p.line ? `:${p.line}` : ""}${p.column ? `:${p.column}` : ""}`)}`
|
|
275
|
+
: "";
|
|
276
|
+
await writeLine(ctx, ` ${pc.red(p.code)}${loc} ${p.message}`);
|
|
277
|
+
if (p.hint)
|
|
278
|
+
await writeLine(ctx, ` ${pc.dim(`→ ${p.hint}`)}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
throw new SilentExitError();
|
|
282
|
+
}
|
|
283
|
+
const timing = result.timing ? ` (${result.timing.totalSeconds.toFixed(0)}s)` : "";
|
|
284
|
+
await writeLine(ctx, `${pc.green("✓")} Redeployed to ${result.url}${timing}`);
|
|
285
|
+
});
|
|
286
|
+
cli
|
|
287
|
+
.command("push", "Package and deploy this project")
|
|
288
|
+
.option("--dry-run", "Show what would be deployed, don't upload")
|
|
289
|
+
.option("--force", "Skip size warnings")
|
|
290
|
+
.option("--preview", "Deploy as preview (does not replace the live version)")
|
|
291
|
+
.option("--no-cache", "Skip image-cache lookup and force a fresh build (use when you suspect cached image is stale)")
|
|
292
|
+
.action(async (options) => {
|
|
293
|
+
const result = await core.push(ctx, {
|
|
294
|
+
dryRun: options.dryRun,
|
|
295
|
+
force: options.force,
|
|
296
|
+
preview: options.preview,
|
|
297
|
+
noCache: options.cache === false,
|
|
298
|
+
});
|
|
299
|
+
if (result.dryRun) {
|
|
300
|
+
await writeLine(ctx, `Dry run: ${result.fileCount} files, ${(result.bytes / 1024).toFixed(1)} KB`);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
const url = result.deployment?.previewUrl ?? result.deployment?.url ?? result.app.url;
|
|
304
|
+
const label = result.deployment?.previewUrl ? "preview live at" : "deployed to";
|
|
305
|
+
await writeLine(ctx, `${pc.green("✓")} ${label} ${url}`);
|
|
306
|
+
// Mirror the publish output: every successful deploy shows
|
|
307
|
+
// whether the image came from cache or was freshly built. Same
|
|
308
|
+
// wording as publish so users learn one signal across both
|
|
309
|
+
// commands. Codex P3 follow-up on 9e5ceee — push was blind to
|
|
310
|
+
// the exact stale-cache scenario --no-cache was added to fix.
|
|
311
|
+
if (result.deployment?.cacheHit === true) {
|
|
312
|
+
await writeLine(ctx, pc.dim(" Build cache: hit (reused image — re-run with --no-cache if your changes aren't reflected)"));
|
|
313
|
+
}
|
|
314
|
+
else if (result.deployment?.cacheHit === false) {
|
|
315
|
+
await writeLine(ctx, pc.dim(" Build cache: miss (fresh build)"));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
cli
|
|
320
|
+
.command("rename <name> [app]", "Rename an app (changes its subdomain)")
|
|
321
|
+
.action(async (name, app) => {
|
|
322
|
+
const result = await core.rename(ctx, { app, name });
|
|
323
|
+
await writeLine(ctx, `${pc.green("✓")} Renamed to ${result.name} — now live at ${result.url}`);
|
|
324
|
+
await writeLine(ctx, ` Previous name: ${result.previousName} (reserved for 60 days)`);
|
|
325
|
+
await writeLine(ctx, ` ${pc.dim(`Next rename available in ${result.cooldownDays} days`)}`);
|
|
326
|
+
});
|
|
327
|
+
cli
|
|
328
|
+
.command("open [app]", "Open the app URL in your browser")
|
|
329
|
+
.action(async (app) => {
|
|
330
|
+
const url = await core.open(ctx, { app });
|
|
331
|
+
await writeLine(ctx, url);
|
|
332
|
+
});
|
|
333
|
+
cli
|
|
334
|
+
.command("dashboard [tab]", "Open the dashboard for this app (optionally on a specific tab)")
|
|
335
|
+
.option("--app <name>", "App name (overrides percher.toml)")
|
|
336
|
+
.action(async (tab, options) => {
|
|
337
|
+
const url = await core.dashboard(ctx, { app: options.app, tab });
|
|
338
|
+
await writeLine(ctx, url);
|
|
339
|
+
});
|
|
340
|
+
cli
|
|
341
|
+
.command("create [name]", "Create a new app from a template")
|
|
342
|
+
.option("--template <template>", "Template to use (node, python, static, nextjs, hono, express)")
|
|
343
|
+
.option("--force", "Overwrite existing files in target directory")
|
|
344
|
+
.option("--list-templates", "List available templates")
|
|
345
|
+
.action(async (name, options) => {
|
|
346
|
+
if (options.listTemplates) {
|
|
347
|
+
const templates = core.listTemplates();
|
|
348
|
+
await writeLine(ctx, pc.bold("Available templates:"));
|
|
349
|
+
for (const t of templates) {
|
|
350
|
+
await writeLine(ctx, ` ${t}`);
|
|
351
|
+
}
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (!name) {
|
|
355
|
+
throw new Error("App name is required. Usage: percher create <name> --template <template>");
|
|
356
|
+
}
|
|
357
|
+
if (!options.template) {
|
|
358
|
+
const templates = core.listTemplates();
|
|
359
|
+
await writeLine(ctx, `${pc.red("✗")} --template is required. Available: ${templates.join(", ")}`);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const result = await core.create(ctx, {
|
|
363
|
+
name,
|
|
364
|
+
template: options.template,
|
|
365
|
+
force: options.force,
|
|
366
|
+
});
|
|
367
|
+
await writeLine(ctx, `${pc.green("✓")} created ${result.name} from ${result.template}`);
|
|
368
|
+
for (const f of result.files) {
|
|
369
|
+
await writeLine(ctx, ` ${pc.dim(f)}`);
|
|
370
|
+
}
|
|
371
|
+
await writeLine(ctx, "");
|
|
372
|
+
await writeLine(ctx, "Next steps:");
|
|
373
|
+
await writeLine(ctx, ` cd ${result.name}`);
|
|
374
|
+
await writeLine(ctx, " bunx percher publish");
|
|
375
|
+
});
|
|
376
|
+
cli
|
|
377
|
+
.command("delete [app]", "Delete an app permanently")
|
|
378
|
+
.option("--yes", "Skip confirmation prompt")
|
|
379
|
+
.action(async (app, options) => {
|
|
380
|
+
const name = app ?? core.readPercherTomlAppName(ctx.cwd);
|
|
381
|
+
if (!name) {
|
|
382
|
+
await writeLine(ctx, `${pc.red("✗")} No app specified and no percher.toml found.`);
|
|
383
|
+
throw new SilentExitError();
|
|
384
|
+
}
|
|
385
|
+
if (!options.yes) {
|
|
386
|
+
const answer = await ctx.prompt(`${pc.red("!")} This will permanently delete ${pc.bold(name)} and all its data. Type the app name to confirm:`);
|
|
387
|
+
if (answer.trim() !== name) {
|
|
388
|
+
await writeLine(ctx, "Cancelled.");
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
await core.deleteApp(ctx, { app: name, confirm: true });
|
|
393
|
+
await writeLine(ctx, `${pc.green("✓")} Deleted ${name}`);
|
|
394
|
+
});
|
|
395
|
+
cli
|
|
396
|
+
.command("resume [app]", "Resume an app suspended for inactivity")
|
|
397
|
+
.action(async (app) => {
|
|
398
|
+
const result = await core.resume(ctx, { app });
|
|
399
|
+
await writeLine(ctx, `${pc.green("✓")} ${result.message}`);
|
|
400
|
+
});
|
|
401
|
+
cli
|
|
402
|
+
.command("doctor [app]", "Check app health and connectivity")
|
|
403
|
+
.option("--json", "Output as JSON")
|
|
404
|
+
.action(async (app, options) => {
|
|
405
|
+
const result = await core.doctor(ctx, { app, json: options.json });
|
|
406
|
+
if (options.json) {
|
|
407
|
+
await writeLine(ctx, JSON.stringify(result, null, 2));
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
await writeLine(ctx, `${pc.bold("Percher Doctor")}`);
|
|
411
|
+
await writeLine(ctx, "──────────────");
|
|
412
|
+
await writeLine(ctx, "");
|
|
413
|
+
for (const check of result.checks) {
|
|
414
|
+
const icon = check.status === "pass"
|
|
415
|
+
? pc.green("✓")
|
|
416
|
+
: check.status === "fail"
|
|
417
|
+
? pc.red("✗")
|
|
418
|
+
: check.status === "warn"
|
|
419
|
+
? pc.yellow("!")
|
|
420
|
+
: pc.dim("—");
|
|
421
|
+
await writeLine(ctx, `${icon} ${pc.bold(check.name.padEnd(20))} ${check.message}`);
|
|
422
|
+
}
|
|
423
|
+
await writeLine(ctx, "");
|
|
424
|
+
// Per-check counter — still raw, reflects what's in `checks[]`.
|
|
425
|
+
// Color/exit driven by `result.status` (the verdict) below, not
|
|
426
|
+
// by raw failed-count: a `fail` cwd-toml row with --app passed
|
|
427
|
+
// is informational, not blocking, and we don't want to red-flag
|
|
428
|
+
// the run when doctor's verdict is `ok` or `in_progress`.
|
|
429
|
+
const counter = `${result.passed}/${result.total} checks passed`;
|
|
430
|
+
const counterColor = result.status === "ok" ? pc.green : result.status === "in_progress" ? pc.yellow : pc.red;
|
|
431
|
+
await writeLine(ctx, counterColor(counter));
|
|
432
|
+
// Verdict line — the actionable summary doctor produces. This
|
|
433
|
+
// is what humans should read when there's any divergence
|
|
434
|
+
// between the per-check fails and the overall verdict.
|
|
435
|
+
await writeLine(ctx, result.summary);
|
|
436
|
+
}
|
|
437
|
+
// Signal non-zero exit for CI/agent use. Codex round 2 fix on
|
|
438
|
+
// Phase 2a: the previous `result.failed > 0` gate caused
|
|
439
|
+
// `doctor --app foo` against a healthy app to exit 1 just
|
|
440
|
+
// because the cwd toml happened to be invalid. Drive exit off
|
|
441
|
+
// the verdict instead — `ok` and `in_progress` are not failures
|
|
442
|
+
// a CI step should fail on; `blocked`/`needs_action` are.
|
|
443
|
+
if (result.status === "blocked" || result.status === "needs_action") {
|
|
444
|
+
throw new SilentExitError();
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
cli
|
|
448
|
+
.command("dev [app]", "Watch files and deploy on changes")
|
|
449
|
+
.option("--confirm", "Prompt before each push (default: auto-push)")
|
|
450
|
+
.action(async (app, options) => {
|
|
451
|
+
const controller = new AbortController();
|
|
452
|
+
// Handle Ctrl+C gracefully
|
|
453
|
+
const onSignal = () => controller.abort();
|
|
454
|
+
process.on("SIGINT", onSignal);
|
|
455
|
+
process.on("SIGTERM", onSignal);
|
|
456
|
+
await writeLine(ctx, pc.bold("Percher Dev"));
|
|
457
|
+
await writeLine(ctx, "───────────");
|
|
458
|
+
await writeLine(ctx, "");
|
|
459
|
+
try {
|
|
460
|
+
await core.dev(ctx, { app }, {
|
|
461
|
+
signal: controller.signal,
|
|
462
|
+
async writeLine(line) {
|
|
463
|
+
const timestamp = new Date().toLocaleTimeString("sv-SE", { hour12: false });
|
|
464
|
+
await writeLine(ctx, `${pc.dim(`[${timestamp}]`)} ${line}`);
|
|
465
|
+
},
|
|
466
|
+
async onFilesChanged(_files) {
|
|
467
|
+
if (options.confirm) {
|
|
468
|
+
const answer = await ctx.prompt("Push changes? [Y/n]", { default: "y" });
|
|
469
|
+
return /^y(es)?$|^$/i.test(answer.trim());
|
|
470
|
+
}
|
|
471
|
+
return true; // auto-push by default
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
finally {
|
|
476
|
+
process.removeListener("SIGINT", onSignal);
|
|
477
|
+
process.removeListener("SIGTERM", onSignal);
|
|
478
|
+
}
|
|
479
|
+
await writeLine(ctx, "");
|
|
480
|
+
await writeLine(ctx, pc.dim("Dev session ended."));
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
//# sourceMappingURL=apps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/commands/apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D;;;;;;;;;;;;;;;GAeG;AACH,SAAS,WAAW,CAAC,MAAa,EAAE,OAA2B;IAC7D,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAY,EACZ,MAAqB,EACrB,UAAiC,EAAE;IAEnC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,SAAS,CACb,GAAG,EACH,YAAY,MAAM,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC7E,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBACzE,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,oEAAoE;YACpE,kEAAkE;YAClE,+DAA+D;YAC/D,iEAAiE;YACjE,6CAA6C;YAC7C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YACjC,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,mCAAmC,QAAQ,UAAU,OAAO,EAAE,CAAC,CACvE,CAAC;YACJ,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,mEAAmE;YACnE,+DAA+D;YAC/D,oEAAoE;YACpE,sBAAsB;YACtB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAA2C,CAAC;gBACzE,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC9B,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,QAAQ,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,oEAAoE;YACpE,oEAAoE;YACpE,qEAAqE;YACrE,+DAA+D;YAC/D,kEAAkE;YAClE,qEAAqE;YACrE,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAA2C,CAAC;gBACzE,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC9B,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,QAAQ,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IACL,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,UAAU;gBACzC,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,YAAY,EAC3C,CAAC;gBACD,+DAA+D;gBAC/D,gEAAgE;gBAChE,yDAAyD;gBACzD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;gBACjC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC1E,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAAC;YACrF,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;gBAC9B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC;gBAClC,oEAAoE;gBACpE,+DAA+D;gBAC/D,iEAAiE;gBACjE,gDAAgD;gBAChD,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;gBAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,cAAc,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3E,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACnD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC5C,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjC,CAAC;gBACD,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAC5E,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzE,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACpD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;oBAC3C,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;gBAC/B,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC1F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACpC,CAAC;gBACD,IAAI,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC;oBAC5C,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACzB,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CACJ,qCAAqC,MAAM,CAAC,UAAU,CAAC,EAAE,UAAU,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CACrF,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;YAC7E,+DAA+D;YAC/D,sDAAsD;YACtD,4DAA4D;YAC5D,4DAA4D;YAC5D,2DAA2D;YAC3D,6DAA6D;YAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,iEAAiE;YACjE,+DAA+D;YAC/D,8DAA8D;YAC9D,gEAAgE;YAChE,wCAAwC;YACxC,4DAA4D;YAC5D,8DAA8D;YAC9D,0DAA0D;YAC1D,iCAAiC;YACjC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CACJ,4GAA4G,CAC7G,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACpC,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CACJ,6FAA6F,CAC9F,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACrC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,wEAAwE,CAAC,CACjF,CAAC;YACJ,CAAC;YACD,mCAAmC;YACnC,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC/C,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACzB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;oBAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBAC5D,MAAM,SAAS,CACb,GAAG,EACH,KAAK,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,2CAA2C,CACvE,CAAC;gBACF,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,6BAA6B,CAAC,CAAC;gBACvF,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;YAChF,CAAC;YACD,OAAO;QACT,CAAC;QACD;YACE,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAQ,EAAE,GAAY;IACzD,GAAG;SACA,OAAO,CAAC,MAAM,EAAE,wCAAwC,CAAC;SACzD,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,4BAA4B,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,EAAE,8DAA8D,CAAC;SAClF,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC;SACvC,MAAM,CAAC,WAAW,EAAE,uDAAuD,CAAC;SAC5E,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,CAAC;SACxE,MAAM,CAAC,WAAW,EAAE,mEAAmE,CAAC;SACxF,MAAM,CACL,YAAY,EACZ,8FAA8F,CAC/F;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,eAAe,GAAuB,OAAO,CAAC,OAAO,CAAC;QAC1D,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,EAAE,EAAE,CAAC;gBACP,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC;gBAC7B,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,MAAM,gCAAgC,EAAE,CAAC,OAAO,GAAG,CAAC,CAChF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,KAAK;SACjC,CAAC,CAAC;QACH,gEAAgE;QAChE,iEAAiE;QACjE,gEAAgE;QAChE,4DAA4D;QAC5D,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,qBAAqB,EAAE,uDAAuD,CAAC;SACvF,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ;SACT,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACzE,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,iBAAiB,EAAE,CAAC,CAAC;YACnF,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;gBAC9B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;gBAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/D,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI;wBAChB,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;wBACzF,CAAC,CAAC,EAAE,CAAC;oBACP,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC/D,IAAI,CAAC,CAAC,IAAI;wBAAE,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YACD,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,EAAE,iCAAiC,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;SAChE,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC;SACvC,MAAM,CAAC,WAAW,EAAE,uDAAuD,CAAC;SAC5E,MAAM,CACL,YAAY,EACZ,8FAA8F,CAC/F;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,KAAK;SACjC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,SAAS,CACb,GAAG,EACH,YAAY,MAAM,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC7E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YACtF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC;YAChF,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;YACzD,2DAA2D;YAC3D,+DAA+D;YAC/D,2DAA2D;YAC3D,8DAA8D;YAC9D,8DAA8D;YAC9D,IAAI,MAAM,CAAC,UAAU,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACzC,MAAM,SAAS,CACb,GAAG,EACH,EAAE,CAAC,GAAG,CACJ,6FAA6F,CAC9F,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,EAAE,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACjD,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,GAAuB,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,SAAS,CACb,GAAG,EACH,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,IAAI,kBAAkB,MAAM,CAAC,GAAG,EAAE,CACzE,CAAC;QACF,MAAM,SAAS,CAAC,GAAG,EAAE,oBAAoB,MAAM,CAAC,YAAY,yBAAyB,CAAC,CAAC;QACvF,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,YAAY,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,YAAY,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,iBAAiB,EAAE,gEAAgE,CAAC;SAC5F,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,OAAyB,EAAE,EAAE;QACnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,eAAe,EAAE,kCAAkC,CAAC;SAC5D,MAAM,CACL,uBAAuB,EACvB,+DAA+D,CAChE;SACA,MAAM,CAAC,SAAS,EAAE,8CAA8C,CAAC;SACjE,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAAO,EAAE,EAAE;QAClD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,SAAS,CACb,GAAG,EACH,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,uCAAuC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5E,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpC,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACpC,MAAM,SAAS,CAAC,GAAG,EAAE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,cAAc,EAAE,2BAA2B,CAAC;SACpD,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,OAAO,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YACnF,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAC7B,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD,CAC/G,CAAC;YACF,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC3B,MAAM,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,cAAc,EAAE,wCAAwC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,cAAc,EAAE,mCAAmC,CAAC;SAC5D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,OAAO,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAEnE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACvC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,MAAM;oBACrB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;oBACf,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;wBACvB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;wBACb,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;4BACvB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;4BAChB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzB,gEAAgE;YAChE,gEAAgE;YAChE,+DAA+D;YAC/D,gEAAgE;YAChE,0DAA0D;YAC1D,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,gBAAgB,CAAC;YACjE,MAAM,YAAY,GAChB,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YAC3F,MAAM,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,8DAA8D;YAC9D,yDAAyD;YACzD,uDAAuD;YACvD,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,8DAA8D;QAC9D,yDAAyD;QACzD,0DAA0D;QAC1D,8DAA8D;QAC9D,gEAAgE;QAChE,0DAA0D;QAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACpE,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,WAAW,EAAE,mCAAmC,CAAC;SACzD,MAAM,CAAC,WAAW,EAAE,8CAA8C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,GAAuB,EAAE,OAA8B,EAAE,EAAE;QACxE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACpC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CACZ,GAAG,EACH,EAAE,GAAG,EAAE,EACP;gBACE,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,KAAK,CAAC,SAAS,CAAC,IAAI;oBAClB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5E,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBACD,KAAK,CAAC,cAAc,CAAC,MAAM;oBACzB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;wBACpB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;wBACzE,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5C,CAAC;oBACD,OAAO,IAAI,CAAC,CAAC,uBAAuB;gBACtC,CAAC;aACF,CACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAiBjE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as core from "@percher/core";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import { SilentExitError, writeLine } from "../cli-utils";
|
|
4
|
+
export function registerAuthCommands(cli, ctx) {
|
|
5
|
+
cli
|
|
6
|
+
.command("login", "Authenticate with Percher")
|
|
7
|
+
.option("--token <token>", "Dev: skip browser, use a token")
|
|
8
|
+
.option("--api-url <url>", "Override API URL")
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
await core.login(ctx, { token: options.token, apiUrl: options.apiUrl });
|
|
11
|
+
});
|
|
12
|
+
cli.command("whoami", "Show the signed-in user").action(async () => {
|
|
13
|
+
if (!ctx.client.token) {
|
|
14
|
+
await writeLine(ctx, `${pc.red("✗")} Not logged in. Run: percher login`);
|
|
15
|
+
throw new SilentExitError();
|
|
16
|
+
}
|
|
17
|
+
const me = await core.whoami(ctx);
|
|
18
|
+
await writeLine(ctx, `Signed in as ${me.email} (${me.userId})`);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,GAAQ,EAAE,GAAY;IACzD,GAAG;SACA,OAAO,CAAC,OAAO,EAAE,2BAA2B,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;SAC3D,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACzE,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/commands/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4LjF"}
|