onflyt-cli 1.0.1-beta.2 → 1.0.1-beta.3

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.

Potentially problematic release.


This version of onflyt-cli might be problematic. Click here for more details.

Files changed (67) hide show
  1. package/dist/App.d.ts +3 -0
  2. package/dist/App.js +8 -0
  3. package/dist/commands/credits.d.ts +3 -0
  4. package/dist/commands/credits.js +101 -0
  5. package/dist/commands/delete.d.ts +7 -0
  6. package/dist/commands/delete.js +220 -0
  7. package/dist/commands/deploy.d.ts +6 -0
  8. package/dist/commands/deploy.js +715 -0
  9. package/dist/commands/deployments.d.ts +6 -0
  10. package/dist/commands/deployments.js +225 -0
  11. package/dist/commands/help.d.ts +3 -0
  12. package/dist/commands/help.js +76 -0
  13. package/dist/commands/init.d.ts +11 -0
  14. package/dist/commands/init.js +422 -0
  15. package/dist/commands/login.d.ts +6 -0
  16. package/dist/commands/login.js +150 -0
  17. package/dist/commands/logout.d.ts +3 -0
  18. package/dist/commands/logout.js +19 -0
  19. package/dist/commands/logs.d.ts +7 -0
  20. package/dist/commands/logs.js +307 -0
  21. package/dist/commands/projects.d.ts +3 -0
  22. package/dist/commands/projects.js +203 -0
  23. package/dist/commands/rollback.d.ts +6 -0
  24. package/dist/commands/rollback.js +316 -0
  25. package/dist/commands/teams.d.ts +3 -0
  26. package/dist/commands/teams.js +81 -0
  27. package/dist/commands/whoami.d.ts +3 -0
  28. package/dist/commands/whoami.js +34 -0
  29. package/dist/components/Loading.d.ts +13 -0
  30. package/dist/components/Loading.js +42 -0
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.js +77 -116
  33. package/dist/lib/api.d.ts +27 -0
  34. package/dist/lib/api.js +109 -0
  35. package/dist/lib/config.d.ts +32 -0
  36. package/dist/lib/config.js +52 -0
  37. package/dist/lib/deploy-api.d.ts +97 -0
  38. package/dist/lib/deploy-api.js +335 -0
  39. package/dist/lib/deploy.d.ts +36 -0
  40. package/dist/lib/deploy.js +181 -0
  41. package/dist/lib/framework.d.ts +27 -0
  42. package/dist/lib/framework.js +184 -0
  43. package/dist/lib/git.d.ts +25 -0
  44. package/dist/lib/git.js +149 -0
  45. package/dist/lib/scaffold.d.ts +21 -0
  46. package/dist/lib/scaffold.js +190 -0
  47. package/dist/shared/frameworks/registry.d.ts +21 -0
  48. package/dist/shared/frameworks/registry.js +196 -0
  49. package/dist/shared/index.d.ts +4 -0
  50. package/dist/shared/index.js +4 -0
  51. package/dist/shared/limits.d.ts +16 -0
  52. package/dist/shared/limits.js +44 -0
  53. package/dist/shared/pricing.d.ts +2 -0
  54. package/dist/shared/pricing.js +7 -0
  55. package/dist/shared/templates/registry.d.ts +9 -0
  56. package/dist/shared/templates/registry.js +47 -0
  57. package/package.json +2 -3
  58. package/src/App.tsx +1 -1
  59. package/src/commands/deploy.tsx +1 -1
  60. package/src/commands/help.tsx +1 -1
  61. package/src/commands/init.tsx +1 -1
  62. package/src/commands/projects.tsx +1 -1
  63. package/src/components/Loading.tsx +1 -1
  64. package/src/index.tsx +1 -1
  65. package/src/lib/deploy-api.ts +3 -3
  66. package/src/lib/framework.ts +2 -2
  67. package/src/lib/shared.ts +350 -0
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ interface DeploymentsProps {
3
+ projectName?: string;
4
+ }
5
+ declare const Deployments: React.FC<DeploymentsProps>;
6
+ export default Deployments;
@@ -0,0 +1,225 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Text, Box, useInput } from "ink";
3
+ import { isLoggedIn, getConfig } from "../lib/config.js";
4
+ import { api } from "../lib/api.js";
5
+ import { Logo } from "../components/Loading.js";
6
+ import Spinner from "ink-spinner";
7
+ const Deployments = ({ projectName }) => {
8
+ const [step, setStep] = useState("loading");
9
+ const [teams, setTeams] = useState([]);
10
+ const [projects, setProjects] = useState([]);
11
+ const [deployments, setDeployments] = useState([]);
12
+ const [targetProject, setTargetProject] = useState(null);
13
+ const [selectedTeamIndex, setSelectedTeamIndex] = useState(0);
14
+ const [selectedProjectIndex, setSelectedProjectIndex] = useState(0);
15
+ const [errorMsg, setErrorMsg] = useState("");
16
+ useEffect(() => {
17
+ const handleSigInt = () => process.exit(0);
18
+ process.on("SIGINT", handleSigInt);
19
+ return () => {
20
+ process.off("SIGINT", handleSigInt);
21
+ };
22
+ }, []);
23
+ useInput((input, key) => {
24
+ if (input === "q" || input === "Q" || (key.ctrl && input === "c")) {
25
+ process.exit(0);
26
+ }
27
+ if (step === "team") {
28
+ if (key.upArrow) {
29
+ setSelectedTeamIndex((i) => Math.max(0, i - 1));
30
+ }
31
+ else if (key.downArrow) {
32
+ setSelectedTeamIndex((i) => Math.min(teams.length - 1, i + 1));
33
+ }
34
+ else if (key.return) {
35
+ setStep("loading-projects");
36
+ loadProjects(teams[selectedTeamIndex].team.id);
37
+ }
38
+ }
39
+ if (step === "project") {
40
+ if (key.upArrow) {
41
+ setSelectedProjectIndex((i) => Math.max(0, i - 1));
42
+ }
43
+ else if (key.downArrow) {
44
+ setSelectedProjectIndex((i) => Math.min(projects.length - 1, i + 1));
45
+ }
46
+ else if (key.return) {
47
+ setStep("loading-deployments");
48
+ loadDeployments(projects[selectedProjectIndex]);
49
+ }
50
+ else if (key.escape) {
51
+ setStep("team");
52
+ }
53
+ }
54
+ });
55
+ useEffect(() => {
56
+ if (!isLoggedIn()) {
57
+ setErrorMsg("Not logged in. Run 'onflyt login' first.");
58
+ setStep("error");
59
+ return;
60
+ }
61
+ loadTeams();
62
+ }, []);
63
+ const loadTeams = async () => {
64
+ try {
65
+ const config = getConfig();
66
+ api.setToken(config.token);
67
+ const meData = await api.get("/auth/me");
68
+ const userTeams = meData.teams || [];
69
+ if (userTeams.length === 0) {
70
+ setErrorMsg("No teams found");
71
+ setStep("error");
72
+ return;
73
+ }
74
+ setTeams(userTeams);
75
+ if (userTeams.length === 1) {
76
+ setSelectedTeamIndex(0);
77
+ setStep("loading-projects");
78
+ loadProjects(userTeams[0].team.id);
79
+ }
80
+ else {
81
+ setStep("team");
82
+ }
83
+ }
84
+ catch (err) {
85
+ setErrorMsg(err.message);
86
+ setStep("error");
87
+ }
88
+ };
89
+ const loadProjects = async (teamId) => {
90
+ try {
91
+ const projectsRes = await api.get(`/projects/team/${teamId}`);
92
+ const teamProjects = projectsRes.projects || [];
93
+ if (teamProjects.length === 0) {
94
+ setErrorMsg("No projects found in this team");
95
+ setStep("error");
96
+ return;
97
+ }
98
+ setProjects(teamProjects);
99
+ setSelectedProjectIndex(0);
100
+ setStep("project");
101
+ }
102
+ catch (err) {
103
+ setErrorMsg(err.message);
104
+ setStep("error");
105
+ }
106
+ };
107
+ const loadDeployments = async (project) => {
108
+ try {
109
+ setTargetProject(project);
110
+ const depsRes = await api.get(`/deployments/${project.id}?limit=50`);
111
+ const allDeployments = depsRes.deployments || [];
112
+ setDeployments(allDeployments);
113
+ setStep("display");
114
+ }
115
+ catch (err) {
116
+ setErrorMsg(err.message);
117
+ setStep("error");
118
+ }
119
+ };
120
+ if (step === "loading" ||
121
+ step === "loading-projects" ||
122
+ step === "loading-deployments") {
123
+ return (React.createElement(Box, { flexDirection: "column", padding: 1 },
124
+ React.createElement(Logo, null),
125
+ React.createElement(Box, { marginTop: 1 },
126
+ React.createElement(Text, { bold: true }, "Deployments")),
127
+ React.createElement(Box, { marginTop: 1 },
128
+ React.createElement(Text, { dimColor: true },
129
+ "Loading",
130
+ step === "loading-projects"
131
+ ? " projects..."
132
+ : step === "loading-deployments"
133
+ ? " deployments..."
134
+ : "...")),
135
+ React.createElement(Box, { marginTop: 1 },
136
+ React.createElement(Text, null,
137
+ React.createElement(Spinner, null)))));
138
+ }
139
+ if (step === "error") {
140
+ return (React.createElement(Box, { flexDirection: "column" },
141
+ React.createElement(Logo, null),
142
+ React.createElement(Box, { marginTop: 1 },
143
+ React.createElement(Text, { bold: true, color: "red" }, "\u2716 Error")),
144
+ React.createElement(Box, { marginTop: 1 },
145
+ React.createElement(Text, { color: "red" }, errorMsg))));
146
+ }
147
+ if (step === "team") {
148
+ return (React.createElement(Box, { flexDirection: "column", padding: 1 },
149
+ React.createElement(Logo, null),
150
+ React.createElement(Box, { marginTop: 1 },
151
+ React.createElement(Text, { bold: true }, "Deployments")),
152
+ React.createElement(Box, { marginTop: 1 },
153
+ React.createElement(Text, { dimColor: true }, "Step 1/2: Select Team (\u2191\u2193 navigate, Enter select)")),
154
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, teams.map((t, idx) => (React.createElement(Box, { key: t.team.id, marginTop: 1 },
155
+ React.createElement(Text, { color: idx === selectedTeamIndex ? "cyan" : "gray" }, idx === selectedTeamIndex ? "▶ " : " "),
156
+ React.createElement(Text, { bold: idx === selectedTeamIndex }, t.team.name)))))));
157
+ }
158
+ if (step === "project") {
159
+ return (React.createElement(Box, { flexDirection: "column", padding: 1 },
160
+ React.createElement(Logo, null),
161
+ React.createElement(Box, { marginTop: 1 },
162
+ React.createElement(Text, { bold: true }, "Deployments")),
163
+ React.createElement(Box, { marginTop: 1 },
164
+ React.createElement(Text, { dimColor: true },
165
+ "Step 2/2: Select Project - ",
166
+ teams[selectedTeamIndex]?.team.name)),
167
+ React.createElement(Box, null,
168
+ React.createElement(Text, { dimColor: true }, "(\u2191\u2193 navigate, Enter select, Esc go back)")),
169
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, projects.map((p, idx) => (React.createElement(Box, { key: p.id, marginTop: 1 },
170
+ React.createElement(Text, { color: idx === selectedProjectIndex ? "cyan" : "gray" }, idx === selectedProjectIndex ? "▶ " : " "),
171
+ React.createElement(Text, { bold: idx === selectedProjectIndex }, p.name)))))));
172
+ }
173
+ const formatDate = (dateStr) => {
174
+ const date = new Date(dateStr);
175
+ return date.toLocaleDateString() + " " + date.toLocaleTimeString();
176
+ };
177
+ const getStatusColor = (status) => {
178
+ switch (status.toLowerCase()) {
179
+ case "live":
180
+ case "deployed":
181
+ case "success":
182
+ return "green";
183
+ case "building":
184
+ case "queued":
185
+ case "provisioning":
186
+ return "cyan";
187
+ case "failed":
188
+ return "red";
189
+ default:
190
+ return "gray";
191
+ }
192
+ };
193
+ return (React.createElement(Box, { flexDirection: "column", padding: 1 },
194
+ React.createElement(Logo, null),
195
+ React.createElement(Box, { marginTop: 1 },
196
+ React.createElement(Text, { bold: true }, "Deployments")),
197
+ React.createElement(Box, null,
198
+ React.createElement(Text, { dimColor: true },
199
+ targetProject?.name,
200
+ " - ",
201
+ teams[selectedTeamIndex]?.team.name)),
202
+ React.createElement(Box, { marginTop: 1 },
203
+ React.createElement(Text, { dimColor: true }, deployments.length === 0
204
+ ? "No deployments found"
205
+ : `Found ${deployments.length} deployment(s)`)),
206
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, deployments.map((dep, idx) => (React.createElement(Box, { key: dep.id, marginTop: 1, flexDirection: "column", borderStyle: "round", borderDimColor: true, paddingX: 1 },
207
+ React.createElement(Box, null,
208
+ React.createElement(Text, { bold: true, color: getStatusColor(dep.status) }, dep.status.toUpperCase()),
209
+ React.createElement(Text, { dimColor: true },
210
+ " - ",
211
+ formatDate(dep.createdAt))),
212
+ React.createElement(Box, null,
213
+ React.createElement(Text, { dimColor: true },
214
+ "ID: ",
215
+ dep.id)),
216
+ dep.commitMessage && (React.createElement(Box, null,
217
+ React.createElement(Text, { dimColor: true, wrap: "wrap" }, dep.commitMessage))),
218
+ dep.runtimeStatus && (React.createElement(Box, null,
219
+ React.createElement(Text, { dimColor: true },
220
+ "Runtime: ",
221
+ dep.runtimeStatus))))))),
222
+ React.createElement(Box, { marginTop: 2 },
223
+ React.createElement(Text, { dimColor: true }, "Press Q or Ctrl+C to exit"))));
224
+ };
225
+ export default Deployments;
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ declare const Help: React.FC;
3
+ export default Help;
@@ -0,0 +1,76 @@
1
+ import { useEffect } from "react";
2
+ const Help = () => {
3
+ useEffect(() => {
4
+ console.log(`
5
+ \x1b[38;2;255;191;0m
6
+ ╔══════════════════════════════════════════╗
7
+ ║ \u25E1 ONFLYT ║
8
+ ║ Deploy CLI v1.0.1-beta.1 ║
9
+ ╚══════════════════════════════════════════╝
10
+ \x1b[0m
11
+
12
+ \x1b[1mUSAGE\x1b[0m
13
+ $ onflyt <command> [options]
14
+
15
+ \x1b[1mCOMMANDS\x1b[0m
16
+ \x1b[36mlogin\x1b[0m Authenticate with GitHub OAuth
17
+ \x1b[36mlogout\x1b[0m Sign out
18
+ \x1b[36mwhoami\x1b[0m Show current user info
19
+
20
+ \x1b[33mPROJECT\x1b[0m
21
+ \x1b[36minit\x1b[0m Initialize new project (creates onflyt.json)
22
+ \x1b[36mdeploy\x1b[0m Deploy project (ZIP upload)
23
+ \x1b[36mprojects\x1b[0m List projects by team
24
+ \x1b[36mdelete\x1b[0m Delete a project
25
+
26
+ \x1b[33mDEPLOYMENTS\x1b[0m
27
+ \x1b[36mlogs\x1b[0m View deployment logs
28
+ \x1b[36mdeployments\x1b[0m List project deployments
29
+ \x1b[36mrollback\x1b[0m Rollback to previous deployment
30
+
31
+ \x1b[33mTEAM & BILLING\x1b[0m
32
+ \x1b[36mteams\x1b[0m List your teams
33
+ \x1b[36mcredits\x1b[0m Check credits balance
34
+
35
+ \x1b[1mGLOBAL OPTIONS\x1b[0m
36
+ \x1b[36m-h, --help\x1b[0m Show this help
37
+ \x1b[36m-v, --version\x1b[0m Show CLI version
38
+ \x1b[36m-t, --team <id>\x1b[0m Target specific team
39
+ \x1b[36m--no-open\x1b[0m Don't auto-open browser on login
40
+
41
+ \x1b[1mINIT OPTIONS\x1b[0m
42
+ \x1b[36m--name <name>\x1b[0m Project name
43
+ \x1b[36m--template <id>\x1b[0m Template (blank, nextjs, react-vite, etc.)
44
+ \x1b[36m--framework <fw>\x1b[0m Framework (nextjs, react, node, etc.)
45
+ \x1b[36m--package-manager <pm>\x1b[0m Package manager (npm, bun, yarn, pnpm)
46
+ \x1b[36m--git\x1b[0m Connect Git repository
47
+ \x1b[36m--no-git\x1b[0m Skip Git connection
48
+ \x1b[36m-y, --yes\x1b[0m Skip all prompts (use defaults)
49
+
50
+ \x1b[1mLOGS OPTIONS\x1b[0m
51
+ \x1b[36m-l, --live\x1b[0m Stream live logs (SSE)
52
+
53
+ \x1b[1mQUICK START\x1b[0m
54
+ $ onflyt login Authenticate
55
+ $ onflyt init Create onflyt.json
56
+ $ onflyt deploy Deploy project
57
+
58
+ \x1b[1mKEYBOARD SHORTCUTS\x1b[0m
59
+ \x1b[36m↑↓\x1b[0m Navigate selection
60
+ \x1b[36mEnter\x1b[0m Select / Confirm
61
+ \x1b[36mEsc\x1b[0m Go back / Cancel
62
+ \x1b[36mQ\x1b[0m Quit
63
+ \x1b[36mCtrl+C\x1b[0m Quit
64
+
65
+ \x1b[1mEXAMPLES\x1b[0m
66
+ $ onflyt deploy --team tm_xxx Deploy to specific team
67
+ $ onflyt logs dep_xxx --live Stream live logs
68
+ $ onflyt init --name myapp --yes Quick init with defaults
69
+
70
+ \x1b[1mDOCS\x1b[0m
71
+ https://docs.onflyt.com/cli
72
+ `);
73
+ }, []);
74
+ return null;
75
+ };
76
+ export default Help;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface InitProps {
3
+ name?: string;
4
+ framework?: string;
5
+ template?: string;
6
+ packageManager?: string;
7
+ git?: boolean;
8
+ yes?: boolean;
9
+ }
10
+ declare const Init: React.FC<InitProps>;
11
+ export default Init;