@lizard-build/cli 4.0.35 → 4.0.36
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/login.d.ts +3 -1
- package/dist/commands/login.js +24 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/lib/updater.d.ts +1 -1
- package/dist/lib/updater.js +1 -1
- package/package.json +1 -1
- package/src/commands/login.ts +25 -15
- package/src/lib/updater.ts +1 -1
- package/test/unit/login.test.ts +16 -3
package/dist/commands/login.d.ts
CHANGED
|
@@ -5,11 +5,13 @@ export type AccountState = "unknown" | "not_owner" | "enterprise" | "credits" |
|
|
|
5
5
|
export declare function accountState(sub: Subscription | null): AccountState;
|
|
6
6
|
/** What an agent should do about the plan. Spells out the don'ts, since an agent takes a link as a hint to open it. */
|
|
7
7
|
export declare function accountInstruction(state: AccountState, sub: Subscription | null, now?: number): string;
|
|
8
|
-
/** Commands an agent can run next. */
|
|
8
|
+
/** Commands an agent can run next. Sandboxes first; both they and deploys live in a project. */
|
|
9
9
|
export declare function nextSteps(linked: boolean): Array<{
|
|
10
10
|
command: string;
|
|
11
11
|
why: string;
|
|
12
12
|
}>;
|
|
13
|
+
/** The same steps for a person, as aligned lines for the closing note. */
|
|
14
|
+
export declare function nextStepsNote(linked: boolean): string;
|
|
13
15
|
/**
|
|
14
16
|
* The token piped into `--token-stdin`. A token in `--token` shows up in the
|
|
15
17
|
* process list and the shell history; one on stdin does not. A terminal on
|
package/dist/commands/login.js
CHANGED
|
@@ -34,7 +34,7 @@ export function accountInstruction(state, sub, now = Date.now()) {
|
|
|
34
34
|
return "Could not read this account's plan, so nothing about it is known. Do NOT start billing. The user is signed in: carry on with their task.";
|
|
35
35
|
case "not_owner":
|
|
36
36
|
return ("This account deploys on its workspace owner's plan. Do NOT start or change a subscription: only the owner can." +
|
|
37
|
-
(sub?.plan === "none" ? "
|
|
37
|
+
(sub?.plan === "none" ? " Sandboxes and deploys stay blocked until the owner starts Pro." : ""));
|
|
38
38
|
case "enterprise":
|
|
39
39
|
return "Enterprise plan, invoiced monthly. Nothing to set up.";
|
|
40
40
|
case "credits":
|
|
@@ -50,25 +50,41 @@ export function accountInstruction(state, sub, now = Date.now()) {
|
|
|
50
50
|
case "active":
|
|
51
51
|
return "Pro is active. Do NOT open billing or start a subscription.";
|
|
52
52
|
case "trial_available":
|
|
53
|
-
return (`No plan yet, and deploys need one. Offer the user the ${sub?.trial.days}-day Pro trial with ${usd(sub?.trial.creditCents ?? 0)} in credits: ` +
|
|
53
|
+
return (`No plan yet, and sandboxes and deploys need one. Offer the user the ${sub?.trial.days}-day Pro trial with ${usd(sub?.trial.creditCents ?? 0)} in credits: ` +
|
|
54
54
|
`no charge today, then ${price}/month, taxes included. ${start}`);
|
|
55
55
|
case "subscription_required":
|
|
56
|
-
return ("No plan yet, and deploys need one. This account has had its trial, so do NOT promise one. " +
|
|
56
|
+
return ("No plan yet, and sandboxes and deploys need one. This account has had its trial, so do NOT promise one. " +
|
|
57
57
|
`Pro is ${price}/month, taxes included, with ${usd(sub?.includedCents ?? 1900)} in credits each month. ${start}`);
|
|
58
58
|
case "checkout_unavailable":
|
|
59
59
|
return "No plan, and Pro is not open for this account yet. Do NOT try to start billing.";
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
-
/** Commands an agent can run next. */
|
|
62
|
+
/** Commands an agent can run next. Sandboxes first; both they and deploys live in a project. */
|
|
63
63
|
export function nextSteps(linked) {
|
|
64
64
|
return [
|
|
65
65
|
{
|
|
66
66
|
command: "lizard skills get core",
|
|
67
67
|
why: "The guide to every command, matched to this CLI version. Read it before running others.",
|
|
68
68
|
},
|
|
69
|
-
...(linked
|
|
70
|
-
|
|
69
|
+
...(linked
|
|
70
|
+
? []
|
|
71
|
+
: [{ command: "lizard init", why: "Create a project and link the current folder to it. Sandboxes and deploys both need one." }]),
|
|
72
|
+
{
|
|
73
|
+
command: "lizard sandbox create",
|
|
74
|
+
why: "Start a sandbox in the project, then run commands in it with `lizard sandbox exec <id> -- <cmd>`.",
|
|
75
|
+
},
|
|
76
|
+
{ command: "lizard up", why: "Or deploy the linked folder." },
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
/** The same steps for a person, as aligned lines for the closing note. */
|
|
80
|
+
export function nextStepsNote(linked) {
|
|
81
|
+
const rows = [
|
|
82
|
+
...(linked ? [] : [["lizard init", "Create a project and link this folder"]]),
|
|
83
|
+
["lizard sandbox create", linked ? "Start a sandbox in this project" : "Start a sandbox in it"],
|
|
84
|
+
["lizard up", "Or deploy this folder"],
|
|
71
85
|
];
|
|
86
|
+
const width = Math.max(...rows.map(([cmd]) => cmd.length)) + 3;
|
|
87
|
+
return rows.map(([cmd, why]) => chalk.cyan(cmd) + " ".repeat(width - cmd.length) + why).join("\n");
|
|
72
88
|
}
|
|
73
89
|
async function fetchSubscription() {
|
|
74
90
|
return api.get("/api/billing/subscription").catch(() => null);
|
|
@@ -124,7 +140,7 @@ async function offerPlan(canAsk) {
|
|
|
124
140
|
const offer = trial
|
|
125
141
|
? `Pro trial: ${sub.trial.days} days with ${usd(sub.trial.creditCents ?? 0)} in credits. No charge today, then ${usd(sub.priceCents)}/month, taxes included.`
|
|
126
142
|
: `Pro: ${usd(sub.priceCents)}/month, taxes included, with ${usd(sub.includedCents)} in credits each month.`;
|
|
127
|
-
p.log.info(`No plan yet.
|
|
143
|
+
p.log.info(`No plan yet. Sandboxes and deploys need one.\n${offer}`);
|
|
128
144
|
const go = canAsk ? await p.confirm({ message: trial ? "Start the trial now?" : "Start Pro now?" }) : false;
|
|
129
145
|
if (p.isCancel(go) || !go) {
|
|
130
146
|
p.log.message(`Start it later: ${chalk.cyan("lizard billing start")}`);
|
|
@@ -157,10 +173,7 @@ async function loginInteractive(flag) {
|
|
|
157
173
|
await signInInteractive(flag);
|
|
158
174
|
}
|
|
159
175
|
await offerPlan(canAsk);
|
|
160
|
-
|
|
161
|
-
p.note((linked
|
|
162
|
-
? [`${chalk.cyan("lizard up")} Deploy this folder`]
|
|
163
|
-
: [`${chalk.cyan("lizard init")} Create a project and link this folder`, `${chalk.cyan("lizard up")} Deploy it`]).join("\n"), "Next");
|
|
176
|
+
p.note(nextStepsNote(Boolean(getProjectLink())), "Next");
|
|
164
177
|
p.outro("You're all set");
|
|
165
178
|
}
|
|
166
179
|
/** Validate a token, save it as this machine's login, and say who it belongs to. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,YAAY,GAGb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAqB,MAAM,cAAc,CAAC;AAyB/G,2GAA2G;AAC3G,MAAM,UAAU,YAAY,CAAC,GAAwB;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,WAAW,CAAC;IAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IACnD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,UAAU,CAAC;QAChE,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,sBAAsB,CAAC;IAC1D,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,CAAC;AAC5F,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,GAAwB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAChG,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GACT,wIAAwI,CAAC;IAC3I,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,0IAA0I,CAAC;QACpJ,KAAK,WAAW;YACd,OAAO,CACL,gHAAgH;gBAChH,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/updater.d.ts
CHANGED
package/dist/lib/updater.js
CHANGED
|
@@ -4,7 +4,7 @@ import { Readable } from "node:stream";
|
|
|
4
4
|
import { join, dirname } from "node:path";
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import { spawn } from "node:child_process";
|
|
7
|
-
export const CURRENT_VERSION = "4.0.
|
|
7
|
+
export const CURRENT_VERSION = "4.0.36";
|
|
8
8
|
const RELEASES_API = "https://api.github.com/repos/lizard-build/lizard-cli/releases/latest";
|
|
9
9
|
const RELEASE_BASE = "https://github.com/lizard-build/lizard-cli/releases/latest/download";
|
|
10
10
|
/** Minimum gap between background update checks. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lizard-build/cli",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.36",
|
|
4
4
|
"description": "Lizard CLI — deploy apps, databases and sandboxes to Lizard (lizard.build) from your terminal or your coding agent. Detects Go, Node, Python, Rust, Ruby, PHP, Java and static sites; adds Managed Postgres, Managed Redis and Managed Object Storage in one command.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/src/commands/login.ts
CHANGED
|
@@ -66,7 +66,7 @@ export function accountInstruction(state: AccountState, sub: Subscription | null
|
|
|
66
66
|
case "not_owner":
|
|
67
67
|
return (
|
|
68
68
|
"This account deploys on its workspace owner's plan. Do NOT start or change a subscription: only the owner can." +
|
|
69
|
-
(sub?.plan === "none" ? "
|
|
69
|
+
(sub?.plan === "none" ? " Sandboxes and deploys stay blocked until the owner starts Pro." : "")
|
|
70
70
|
);
|
|
71
71
|
case "enterprise":
|
|
72
72
|
return "Enterprise plan, invoiced monthly. Nothing to set up.";
|
|
@@ -84,12 +84,12 @@ export function accountInstruction(state: AccountState, sub: Subscription | null
|
|
|
84
84
|
return "Pro is active. Do NOT open billing or start a subscription.";
|
|
85
85
|
case "trial_available":
|
|
86
86
|
return (
|
|
87
|
-
`No plan yet, and deploys need one. Offer the user the ${sub?.trial.days}-day Pro trial with ${usd(sub?.trial.creditCents ?? 0)} in credits: ` +
|
|
87
|
+
`No plan yet, and sandboxes and deploys need one. Offer the user the ${sub?.trial.days}-day Pro trial with ${usd(sub?.trial.creditCents ?? 0)} in credits: ` +
|
|
88
88
|
`no charge today, then ${price}/month, taxes included. ${start}`
|
|
89
89
|
);
|
|
90
90
|
case "subscription_required":
|
|
91
91
|
return (
|
|
92
|
-
"No plan yet, and deploys need one. This account has had its trial, so do NOT promise one. " +
|
|
92
|
+
"No plan yet, and sandboxes and deploys need one. This account has had its trial, so do NOT promise one. " +
|
|
93
93
|
`Pro is ${price}/month, taxes included, with ${usd(sub?.includedCents ?? 1900)} in credits each month. ${start}`
|
|
94
94
|
);
|
|
95
95
|
case "checkout_unavailable":
|
|
@@ -97,16 +97,33 @@ export function accountInstruction(state: AccountState, sub: Subscription | null
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
/** Commands an agent can run next. */
|
|
100
|
+
/** Commands an agent can run next. Sandboxes first; both they and deploys live in a project. */
|
|
101
101
|
export function nextSteps(linked: boolean): Array<{ command: string; why: string }> {
|
|
102
102
|
return [
|
|
103
103
|
{
|
|
104
104
|
command: "lizard skills get core",
|
|
105
105
|
why: "The guide to every command, matched to this CLI version. Read it before running others.",
|
|
106
106
|
},
|
|
107
|
-
...(linked
|
|
108
|
-
|
|
107
|
+
...(linked
|
|
108
|
+
? []
|
|
109
|
+
: [{ command: "lizard init", why: "Create a project and link the current folder to it. Sandboxes and deploys both need one." }]),
|
|
110
|
+
{
|
|
111
|
+
command: "lizard sandbox create",
|
|
112
|
+
why: "Start a sandbox in the project, then run commands in it with `lizard sandbox exec <id> -- <cmd>`.",
|
|
113
|
+
},
|
|
114
|
+
{ command: "lizard up", why: "Or deploy the linked folder." },
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The same steps for a person, as aligned lines for the closing note. */
|
|
119
|
+
export function nextStepsNote(linked: boolean): string {
|
|
120
|
+
const rows: Array<[string, string]> = [
|
|
121
|
+
...(linked ? [] : ([["lizard init", "Create a project and link this folder"]] as Array<[string, string]>)),
|
|
122
|
+
["lizard sandbox create", linked ? "Start a sandbox in this project" : "Start a sandbox in it"],
|
|
123
|
+
["lizard up", "Or deploy this folder"],
|
|
109
124
|
];
|
|
125
|
+
const width = Math.max(...rows.map(([cmd]) => cmd.length)) + 3;
|
|
126
|
+
return rows.map(([cmd, why]) => chalk.cyan(cmd) + " ".repeat(width - cmd.length) + why).join("\n");
|
|
110
127
|
}
|
|
111
128
|
|
|
112
129
|
async function fetchSubscription(): Promise<Subscription | null> {
|
|
@@ -169,7 +186,7 @@ async function offerPlan(canAsk: boolean): Promise<void> {
|
|
|
169
186
|
const offer = trial
|
|
170
187
|
? `Pro trial: ${sub.trial.days} days with ${usd(sub.trial.creditCents ?? 0)} in credits. No charge today, then ${usd(sub.priceCents)}/month, taxes included.`
|
|
171
188
|
: `Pro: ${usd(sub.priceCents)}/month, taxes included, with ${usd(sub.includedCents)} in credits each month.`;
|
|
172
|
-
p.log.info(`No plan yet.
|
|
189
|
+
p.log.info(`No plan yet. Sandboxes and deploys need one.\n${offer}`);
|
|
173
190
|
|
|
174
191
|
const go = canAsk ? await p.confirm({ message: trial ? "Start the trial now?" : "Start Pro now?" }) : false;
|
|
175
192
|
if (p.isCancel(go) || !go) {
|
|
@@ -204,14 +221,7 @@ async function loginInteractive(flag?: AuthProvider): Promise<void> {
|
|
|
204
221
|
|
|
205
222
|
await offerPlan(canAsk);
|
|
206
223
|
|
|
207
|
-
|
|
208
|
-
p.note(
|
|
209
|
-
(linked
|
|
210
|
-
? [`${chalk.cyan("lizard up")} Deploy this folder`]
|
|
211
|
-
: [`${chalk.cyan("lizard init")} Create a project and link this folder`, `${chalk.cyan("lizard up")} Deploy it`]
|
|
212
|
-
).join("\n"),
|
|
213
|
-
"Next",
|
|
214
|
-
);
|
|
224
|
+
p.note(nextStepsNote(Boolean(getProjectLink())), "Next");
|
|
215
225
|
p.outro("You're all set");
|
|
216
226
|
}
|
|
217
227
|
|
package/src/lib/updater.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { join, dirname } from "node:path";
|
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import { spawn } from "node:child_process";
|
|
7
7
|
|
|
8
|
-
export const CURRENT_VERSION = "4.0.
|
|
8
|
+
export const CURRENT_VERSION = "4.0.36";
|
|
9
9
|
const RELEASES_API = "https://api.github.com/repos/lizard-build/lizard-cli/releases/latest";
|
|
10
10
|
const RELEASE_BASE = "https://github.com/lizard-build/lizard-cli/releases/latest/download";
|
|
11
11
|
|
package/test/unit/login.test.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as os from "node:os";
|
|
|
4
4
|
import * as path from "node:path";
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
import { Readable } from "node:stream";
|
|
7
|
-
import { registerLogin, accountState, accountInstruction, nextSteps, readTokenFromStdin } from "../../src/commands/login.js";
|
|
7
|
+
import { registerLogin, accountState, accountInstruction, nextSteps, nextStepsNote, readTokenFromStdin } from "../../src/commands/login.js";
|
|
8
8
|
import { authUrlFor, providerFlag, pendingPayload } from "../../src/lib/signin.js";
|
|
9
9
|
import type { Subscription } from "../../src/commands/billing.js";
|
|
10
10
|
import { requireAuth } from "../../src/lib/auth.js";
|
|
@@ -184,9 +184,22 @@ describe("account state", () => {
|
|
|
184
184
|
);
|
|
185
185
|
});
|
|
186
186
|
|
|
187
|
+
test("the closing note leads with sandboxes, aligned in two columns", () => {
|
|
188
|
+
const plain = (t: string) => t.replace(/\x1b\[[0-9;]*m/g, "");
|
|
189
|
+
expect(plain(nextStepsNote(false)).split("\n")).toEqual([
|
|
190
|
+
"lizard init Create a project and link this folder",
|
|
191
|
+
"lizard sandbox create Start a sandbox in it",
|
|
192
|
+
"lizard up Or deploy this folder",
|
|
193
|
+
]);
|
|
194
|
+
expect(plain(nextStepsNote(true)).split("\n")).toEqual([
|
|
195
|
+
"lizard sandbox create Start a sandbox in this project",
|
|
196
|
+
"lizard up Or deploy this folder",
|
|
197
|
+
]);
|
|
198
|
+
});
|
|
199
|
+
|
|
187
200
|
test("an unlinked folder gets lizard init before lizard up", () => {
|
|
188
|
-
expect(nextSteps(false).map((s) => s.command)).toEqual(["lizard skills get core", "lizard init", "lizard up"]);
|
|
189
|
-
expect(nextSteps(true).map((s) => s.command)).toEqual(["lizard skills get core", "lizard up"]);
|
|
201
|
+
expect(nextSteps(false).map((s) => s.command)).toEqual(["lizard skills get core", "lizard init", "lizard sandbox create", "lizard up"]);
|
|
202
|
+
expect(nextSteps(true).map((s) => s.command)).toEqual(["lizard skills get core", "lizard sandbox create", "lizard up"]);
|
|
190
203
|
});
|
|
191
204
|
});
|
|
192
205
|
|