flowershow 0.1.9 → 0.2.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/README.md +246 -10
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -0
- package/dist/lib/api-client.d.ts +68 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +104 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +133 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/commands/auth-login.d.ts +2 -0
- package/dist/lib/commands/auth-login.d.ts.map +1 -0
- package/dist/lib/commands/auth-login.js +55 -0
- package/dist/lib/commands/auth-login.js.map +1 -0
- package/dist/lib/commands/auth-logout.d.ts +2 -0
- package/dist/lib/commands/auth-logout.d.ts.map +1 -0
- package/dist/lib/commands/auth-logout.js +26 -0
- package/dist/lib/commands/auth-logout.js.map +1 -0
- package/dist/lib/commands/auth-status.d.ts +2 -0
- package/dist/lib/commands/auth-status.d.ts.map +1 -0
- package/dist/lib/commands/auth-status.js +36 -0
- package/dist/lib/commands/auth-status.js.map +1 -0
- package/dist/lib/commands/delete.d.ts +2 -0
- package/dist/lib/commands/delete.d.ts.map +1 -0
- package/dist/lib/commands/delete.js +80 -0
- package/dist/lib/commands/delete.js.map +1 -0
- package/dist/lib/commands/list.d.ts +2 -0
- package/dist/lib/commands/list.d.ts.map +1 -0
- package/dist/lib/commands/list.js +42 -0
- package/dist/lib/commands/list.js.map +1 -0
- package/dist/lib/commands/publish.d.ts +2 -0
- package/dist/lib/commands/publish.d.ts.map +1 -0
- package/dist/lib/commands/publish.js +166 -0
- package/dist/lib/commands/publish.js.map +1 -0
- package/dist/lib/const.d.ts +4 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/const.js +4 -0
- package/dist/lib/const.js.map +1 -0
- package/dist/lib/files.d.ts +13 -0
- package/dist/lib/files.d.ts.map +1 -0
- package/dist/lib/files.js +156 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/utils.d.ts +22 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +90 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +39 -28
- package/CHANGELOG.md +0 -74
- package/src/bin/cli.js +0 -97
- package/src/index.js +0 -1
- package/src/lib/Installer.js +0 -185
- package/src/lib/build.js +0 -18
- package/src/lib/buildExport.js +0 -11
- package/src/lib/const.js +0 -1
- package/src/lib/install.js +0 -28
- package/src/lib/preview.js +0 -18
- package/src/lib/publish.js +0 -8
- package/src/lib/upgrade.js +0 -8
- package/src/lib/utils/exit.js +0 -3
- package/src/lib/utils/index.js +0 -5
- package/src/lib/utils/isSubdir.js +0 -6
- package/src/lib/utils/logger.js +0 -19
- package/src/lib/utils/sendEvent.js +0 -5
- package/src/lib/utils/spinner.js +0 -49
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { homedir } from "os";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { API_URL } from "./const.js";
|
|
6
|
+
const CONFIG_DIR = join(homedir(), ".flowershow");
|
|
7
|
+
const TOKEN_FILE = join(CONFIG_DIR, "token.json");
|
|
8
|
+
export function saveToken(token, username) {
|
|
9
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
10
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
const data = {
|
|
13
|
+
token,
|
|
14
|
+
username,
|
|
15
|
+
savedAt: new Date().toISOString(),
|
|
16
|
+
};
|
|
17
|
+
writeFileSync(TOKEN_FILE, JSON.stringify(data, null, 2), "utf-8");
|
|
18
|
+
}
|
|
19
|
+
export function getToken() {
|
|
20
|
+
if (!existsSync(TOKEN_FILE)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const data = readFileSync(TOKEN_FILE, "utf-8");
|
|
25
|
+
return JSON.parse(data);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error(chalk.yellow("Warning: Failed to read token file"));
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function removeToken() {
|
|
33
|
+
if (existsSync(TOKEN_FILE)) {
|
|
34
|
+
try {
|
|
35
|
+
const fs = await import("fs/promises");
|
|
36
|
+
await fs.unlink(TOKEN_FILE);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.code !== "ENOENT") {
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function isAuthenticated() {
|
|
46
|
+
const tokenData = getToken();
|
|
47
|
+
return tokenData !== null && !!tokenData.token;
|
|
48
|
+
}
|
|
49
|
+
export function getAuthHeaders() {
|
|
50
|
+
const tokenData = getToken();
|
|
51
|
+
if (!tokenData || !tokenData.token) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
Authorization: `Bearer ${tokenData.token}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function pollForToken(apiUrl, deviceCode, interval, expiresIn) {
|
|
59
|
+
const startTime = Date.now();
|
|
60
|
+
const expirationTime = startTime + expiresIn * 1000;
|
|
61
|
+
let currentInterval = interval;
|
|
62
|
+
while (Date.now() < expirationTime) {
|
|
63
|
+
await new Promise((resolve) => setTimeout(resolve, currentInterval * 500));
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(`${apiUrl}/api/cli/device/token`, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
headers: {
|
|
68
|
+
"Content-Type": "application/json",
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
device_code: deviceCode,
|
|
72
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
const data = (await response.json());
|
|
76
|
+
if (response.ok && data.access_token) {
|
|
77
|
+
return data.access_token;
|
|
78
|
+
}
|
|
79
|
+
if (data.error === "authorization_pending") {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (data.error === "slow_down") {
|
|
83
|
+
currentInterval += 5;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (data.error === "expired_token") {
|
|
87
|
+
throw new Error("The device code has expired. Please try again.");
|
|
88
|
+
}
|
|
89
|
+
if (data.error === "access_denied") {
|
|
90
|
+
throw new Error("Authorization was denied.");
|
|
91
|
+
}
|
|
92
|
+
throw new Error(data.error_description || data.error || "Unknown error occurred");
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof Error &&
|
|
96
|
+
(error.message.includes("expired") || error.message.includes("denied"))) {
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw new Error("Authorization timed out. Please try again.");
|
|
103
|
+
}
|
|
104
|
+
export function requireAuth() {
|
|
105
|
+
if (!isAuthenticated()) {
|
|
106
|
+
displayError("You must be authenticated to use this command.\n" +
|
|
107
|
+
"Run `flowershow auth login` to authenticate.");
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export async function getAuthenticatedUser() {
|
|
112
|
+
const tokenData = getToken();
|
|
113
|
+
if (!tokenData) {
|
|
114
|
+
throw new Error("Not authenticated");
|
|
115
|
+
}
|
|
116
|
+
const userInfo = await getUserInfo(API_URL, tokenData.token);
|
|
117
|
+
return userInfo;
|
|
118
|
+
}
|
|
119
|
+
export async function getUserInfo(apiUrl, token) {
|
|
120
|
+
const response = await fetch(`${apiUrl}/api/cli/user`, {
|
|
121
|
+
headers: {
|
|
122
|
+
Authorization: `Bearer ${token}`,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
throw new Error("Failed to get user info");
|
|
127
|
+
}
|
|
128
|
+
return (await response.json());
|
|
129
|
+
}
|
|
130
|
+
function displayError(message) {
|
|
131
|
+
console.error(chalk.red(`\n✗ Error: ${message}\n`));
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-login.d.ts","sourceRoot":"","sources":["../../../lib/commands/auth-login.ts"],"names":[],"mappings":"AAkBA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiGtD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { saveToken, pollForToken, getUserInfo } from "../auth.js";
|
|
4
|
+
import { displayError } from "../utils.js";
|
|
5
|
+
import { API_URL } from "../const.js";
|
|
6
|
+
export async function authLoginCommand() {
|
|
7
|
+
try {
|
|
8
|
+
const spinner = ora("Initiating authentication...").start();
|
|
9
|
+
const response = await fetch(`${API_URL}/api/cli/device/authorize`, {
|
|
10
|
+
method: "POST",
|
|
11
|
+
headers: {
|
|
12
|
+
"Content-Type": "application/json",
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
client_name: "flowershow-cli",
|
|
16
|
+
}),
|
|
17
|
+
});
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
throw new Error(`Failed to initiate authentication: ${response.statusText}`);
|
|
20
|
+
}
|
|
21
|
+
const data = (await response.json());
|
|
22
|
+
const { device_code, user_code, verification_uri, verification_uri_complete, expires_in, interval, } = data;
|
|
23
|
+
spinner.stop();
|
|
24
|
+
console.log(chalk.bold("\nPlease complete authentication in your browser:\n"));
|
|
25
|
+
console.log(chalk.cyan(` ${verification_uri_complete || verification_uri}\n`));
|
|
26
|
+
if (!verification_uri_complete) {
|
|
27
|
+
console.log(chalk.bold("Enter this code when prompted:\n"));
|
|
28
|
+
console.log(chalk.green.bold(` ${user_code}\n`));
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk.gray(`This code expires in ${Math.floor(expires_in / 60)} minutes\n`));
|
|
31
|
+
spinner.start("Waiting for authorization...");
|
|
32
|
+
const accessToken = await pollForToken(API_URL, device_code, interval, expires_in);
|
|
33
|
+
spinner.text = "Fetching user information...";
|
|
34
|
+
const userInfo = await getUserInfo(API_URL, accessToken);
|
|
35
|
+
saveToken(accessToken, userInfo.username || userInfo.email || "user");
|
|
36
|
+
spinner.succeed("Successfully authenticated!");
|
|
37
|
+
console.log(chalk.gray(`Logged in as: ${chalk.cyan(userInfo.username || userInfo.email || "user")}`));
|
|
38
|
+
console.log(chalk.gray("\nYou can now use the CLI to publish your sites.\n"));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof Error && error.message.includes("fetch")) {
|
|
42
|
+
displayError("Failed to connect to Flowershow API.\n" +
|
|
43
|
+
"Please check your internet connection and try again.");
|
|
44
|
+
}
|
|
45
|
+
else if (error instanceof Error) {
|
|
46
|
+
displayError(error.message);
|
|
47
|
+
console.error(chalk.gray(error.stack));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
displayError("An unknown error occurred");
|
|
51
|
+
}
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=auth-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-login.js","sourceRoot":"","sources":["../../../lib/commands/auth-login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AActC,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;QAG5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,2BAA2B,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,WAAW,EAAE,gBAAgB;aAC9B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,sCAAsC,QAAQ,CAAC,UAAU,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QAC3D,MAAM,EACJ,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,yBAAyB,EACzB,UAAU,EACV,QAAQ,GACT,GAAG,IAAI,CAAC;QAET,OAAO,CAAC,IAAI,EAAE,CAAC;QAGf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAClE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,KAAK,yBAAyB,IAAI,gBAAgB,IAAI,CAAC,CACnE,CAAC;QAEF,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,wBAAwB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,YAAY,CAChE,CACF,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAG9C,MAAM,WAAW,GAAG,MAAM,YAAY,CACpC,OAAO,EACP,WAAW,EACX,QAAQ,EACR,UAAU,CACX,CAAC;QAEF,OAAO,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAG9C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAGzD,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;QAEtE,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAG/C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,iBAAiB,KAAK,CAAC,IAAI,CACzB,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,MAAM,CAC9C,EAAE,CACJ,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CACjE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,YAAY,CACV,wCAAwC;gBACtC,sDAAsD,CACzD,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAClC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logout.d.ts","sourceRoot":"","sources":["../../../lib/commands/auth-logout.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBvD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { removeToken, getToken } from "../auth.js";
|
|
3
|
+
import { displayError } from "../utils.js";
|
|
4
|
+
export async function authLogoutCommand() {
|
|
5
|
+
try {
|
|
6
|
+
const tokenData = getToken();
|
|
7
|
+
if (!tokenData) {
|
|
8
|
+
console.log(chalk.yellow("\nYou are not currently logged in.\n"));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
await removeToken();
|
|
12
|
+
console.log(chalk.green("\n✓ Successfully logged out\n"));
|
|
13
|
+
console.log(chalk.gray("Your authentication token has been removed.\n"));
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof Error) {
|
|
17
|
+
displayError(error.message);
|
|
18
|
+
console.error(chalk.gray(error.stack));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
displayError("An unknown error occurred");
|
|
22
|
+
}
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=auth-logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-logout.js","sourceRoot":"","sources":["../../../lib/commands/auth-logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;QAE7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,MAAM,WAAW,EAAE,CAAC;QAEpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-status.d.ts","sourceRoot":"","sources":["../../../lib/commands/auth-status.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCvD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { getToken, getUserInfo } from "../auth.js";
|
|
4
|
+
import { displayError } from "../utils.js";
|
|
5
|
+
import { API_URL } from "../const.js";
|
|
6
|
+
export async function authStatusCommand() {
|
|
7
|
+
try {
|
|
8
|
+
const tokenData = getToken();
|
|
9
|
+
if (!tokenData) {
|
|
10
|
+
console.log(chalk.yellow("\n✗ Not authenticated\n"));
|
|
11
|
+
console.log(chalk.gray("Run `flowershow auth login` to authenticate.\n"));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const spinner = ora("Checking authentication status...").start();
|
|
15
|
+
try {
|
|
16
|
+
const userInfo = await getUserInfo(API_URL, tokenData.token);
|
|
17
|
+
spinner.succeed("Authenticated");
|
|
18
|
+
console.log(chalk.gray(`Logged in as: ${chalk.cyan(userInfo.username || userInfo.email || "user")}`));
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
spinner.fail(chalk.red("Authentication token is invalid or expired"));
|
|
22
|
+
console.log(chalk.gray("Run `flowershow auth login` to re-authenticate.\n"));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof Error) {
|
|
27
|
+
displayError(error.message);
|
|
28
|
+
console.error(chalk.gray(error.stack));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
displayError("An unknown error occurred");
|
|
32
|
+
}
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=auth-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-status.js","sourceRoot":"","sources":["../../../lib/commands/auth-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKtC,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;QAE7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjE,IAAI,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAE7D,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,iBAAiB,KAAK,CAAC,IAAI,CACzB,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,MAAM,CAC9C,EAAE,CACJ,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../lib/commands/delete.ts"],"names":[],"mappings":"AAqCA,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFtE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { confirm } from "@inquirer/prompts";
|
|
4
|
+
import { isAuthenticated, getUserInfo, getToken } from "../auth.js";
|
|
5
|
+
import { getSites, deleteSite } from "../api-client.js";
|
|
6
|
+
import { displayError, getSiteUrl, getDashboardUrl } from "../utils.js";
|
|
7
|
+
import { API_URL } from "../const.js";
|
|
8
|
+
function requireAuth() {
|
|
9
|
+
if (!isAuthenticated()) {
|
|
10
|
+
displayError("You must be authenticated to use this command.\n" +
|
|
11
|
+
"Run `flowershow auth login` to authenticate.");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function getAuthenticatedUser() {
|
|
16
|
+
const tokenData = getToken();
|
|
17
|
+
if (!tokenData) {
|
|
18
|
+
throw new Error("Not authenticated");
|
|
19
|
+
}
|
|
20
|
+
const userInfo = await getUserInfo(API_URL, tokenData.token);
|
|
21
|
+
return userInfo;
|
|
22
|
+
}
|
|
23
|
+
export async function deleteCommand(projectName) {
|
|
24
|
+
try {
|
|
25
|
+
if (!projectName) {
|
|
26
|
+
displayError("Project name is required.\nUsage: flowershow delete <project-name>");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
requireAuth();
|
|
30
|
+
const spinner = ora(`Looking for site '${projectName}'...`).start();
|
|
31
|
+
const user = await getAuthenticatedUser();
|
|
32
|
+
const sitesData = await getSites();
|
|
33
|
+
const sites = sitesData.sites || [];
|
|
34
|
+
const siteToDelete = sites.find((s) => s.projectName === projectName);
|
|
35
|
+
if (!siteToDelete) {
|
|
36
|
+
spinner.fail(`Site '${projectName}' not found`);
|
|
37
|
+
displayError(`Site '${projectName}' not found.\nUse 'flowershow list' to see all sites.`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const url = getSiteUrl(projectName, user.username || user.email || "user");
|
|
41
|
+
spinner.succeed(`Found site: ${projectName}`);
|
|
42
|
+
console.log(chalk.gray(`URL: ${url}`));
|
|
43
|
+
console.log();
|
|
44
|
+
if (siteToDelete.plan === "PREMIUM") {
|
|
45
|
+
const dashboardUrl = getDashboardUrl(siteToDelete.id);
|
|
46
|
+
displayError(`This site has an active premium subscription.\n` +
|
|
47
|
+
`You must cancel the subscription before deleting the site.\n` +
|
|
48
|
+
`Please visit your dashboard to manage your subscription:\n\n` +
|
|
49
|
+
`${dashboardUrl}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
console.log(chalk.yellow("⚠️ This will permanently delete the site and all its content."));
|
|
53
|
+
console.log();
|
|
54
|
+
const confirmed = await confirm({
|
|
55
|
+
message: "Are you sure you want to delete this site?",
|
|
56
|
+
default: false,
|
|
57
|
+
});
|
|
58
|
+
if (!confirmed) {
|
|
59
|
+
console.log(chalk.gray("Deletion cancelled."));
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
spinner.start("Deleting site...");
|
|
63
|
+
const result = await deleteSite(siteToDelete.id);
|
|
64
|
+
spinner.succeed(`Successfully deleted site '${projectName}'`);
|
|
65
|
+
if (result.deletedFiles) {
|
|
66
|
+
console.log(chalk.gray(` Deleted ${result.deletedFiles} file(s)\n`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof Error) {
|
|
71
|
+
displayError(error.message);
|
|
72
|
+
console.error(chalk.gray(error.stack));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
displayError("An unknown error occurred");
|
|
76
|
+
}
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../lib/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../lib/commands/list.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDjD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { getAuthenticatedUser, requireAuth } from "../auth.js";
|
|
4
|
+
import { getSites } from "../api-client.js";
|
|
5
|
+
import { displayError, formatDate, getSiteUrl } from "../utils.js";
|
|
6
|
+
import { API_URL } from "../const.js";
|
|
7
|
+
export async function listCommand() {
|
|
8
|
+
try {
|
|
9
|
+
requireAuth();
|
|
10
|
+
const spinner = ora("Fetching sites...").start();
|
|
11
|
+
const user = await getAuthenticatedUser();
|
|
12
|
+
const sitesData = await getSites();
|
|
13
|
+
const sites = sitesData.sites || [];
|
|
14
|
+
spinner.stop();
|
|
15
|
+
if (sites.length === 0) {
|
|
16
|
+
console.log(chalk.gray("\nNo sites found.\n"));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log(chalk.bold(`\nFound ${sites.length} site(s):\n`));
|
|
20
|
+
for (const site of sites) {
|
|
21
|
+
const url = getSiteUrl(site.projectName, user.username || user.email || "user");
|
|
22
|
+
const dashboardUrl = `${API_URL}/site/${site.id}/settings`;
|
|
23
|
+
console.log(chalk.cyan(` ${site.projectName}`));
|
|
24
|
+
console.log(chalk.gray(` URL: ${url}`));
|
|
25
|
+
console.log(chalk.gray(` Dashboard URL: ${dashboardUrl}`));
|
|
26
|
+
console.log(chalk.gray(` Created: ${formatDate(site.createdAt)}`));
|
|
27
|
+
console.log(chalk.gray(` Updated: ${formatDate(site.updatedAt || site.createdAt)}`));
|
|
28
|
+
console.log();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof Error) {
|
|
33
|
+
displayError(error.message);
|
|
34
|
+
console.error(chalk.gray(error.stack));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
displayError("An unknown error occurred");
|
|
38
|
+
}
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../lib/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKtC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QAEH,WAAW,EAAE,CAAC;QAEd,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAGjD,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAG1C,MAAM,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAEpC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;QAE9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,UAAU,CACpB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CACtC,CAAC;YACF,MAAM,YAAY,GAAG,GAAG,OAAO,SAAS,IAAI,CAAC,EAAE,WAAW,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,YAAY,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,gBAAgB,UAAU,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAC/D,CACF,CAAC;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../lib/commands/publish.ts"],"names":[],"mappings":"AA4FA,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAC7B,SAAS,GAAE,OAAe,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Jf"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import cliProgress from "cli-progress";
|
|
6
|
+
import { isAuthenticated, getUserInfo, getToken } from "../auth.js";
|
|
7
|
+
import { createSite, getUploadUrls, uploadToR2, getSiteByName, } from "../api-client.js";
|
|
8
|
+
import { discoverFiles, getProjectName, validateFiles } from "../files.js";
|
|
9
|
+
import { displayPublishSuccess, displayError, displayWarning, waitForSync, } from "../utils.js";
|
|
10
|
+
import { API_URL } from "../const.js";
|
|
11
|
+
function getContentType(extension) {
|
|
12
|
+
const contentTypes = {
|
|
13
|
+
md: "text/markdown",
|
|
14
|
+
mdx: "text/markdown",
|
|
15
|
+
csv: "text/csv",
|
|
16
|
+
geojson: "application/geo+json",
|
|
17
|
+
json: "application/json",
|
|
18
|
+
yaml: "application/yaml",
|
|
19
|
+
yml: "application/yaml",
|
|
20
|
+
base: "application/yaml",
|
|
21
|
+
css: "text/css",
|
|
22
|
+
jpeg: "image/jpeg",
|
|
23
|
+
jpg: "image/jpeg",
|
|
24
|
+
png: "image/png",
|
|
25
|
+
gif: "image/gif",
|
|
26
|
+
svg: "image/svg+xml",
|
|
27
|
+
ico: "image/x-icon",
|
|
28
|
+
webp: "image/webp",
|
|
29
|
+
avif: "image/avif",
|
|
30
|
+
pdf: "application/pdf",
|
|
31
|
+
mp4: "video/mp4",
|
|
32
|
+
webm: "video/webm",
|
|
33
|
+
aac: "audio/aac",
|
|
34
|
+
mp3: "audio/mpeg",
|
|
35
|
+
opus: "audio/opus",
|
|
36
|
+
};
|
|
37
|
+
return contentTypes[extension] || "application/octet-stream";
|
|
38
|
+
}
|
|
39
|
+
function requireAuth() {
|
|
40
|
+
if (!isAuthenticated()) {
|
|
41
|
+
displayError("You must be authenticated to use this command.\n" +
|
|
42
|
+
"Run `flowershow auth login` to authenticate.");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function getAuthenticatedUser() {
|
|
47
|
+
const tokenData = getToken();
|
|
48
|
+
if (!tokenData) {
|
|
49
|
+
throw new Error("Not authenticated");
|
|
50
|
+
}
|
|
51
|
+
const userInfo = await getUserInfo(API_URL, tokenData.token);
|
|
52
|
+
return userInfo;
|
|
53
|
+
}
|
|
54
|
+
export async function publishCommand(inputPaths, overwrite = false, siteName) {
|
|
55
|
+
try {
|
|
56
|
+
requireAuth();
|
|
57
|
+
const spinner = ora();
|
|
58
|
+
spinner.start("Authenticating...");
|
|
59
|
+
const user = await getAuthenticatedUser();
|
|
60
|
+
spinner.succeed(`Publishing as: ${user.username || user.email}`);
|
|
61
|
+
spinner.start("Discovering files...");
|
|
62
|
+
const paths = Array.isArray(inputPaths) ? inputPaths : [inputPaths];
|
|
63
|
+
const absolutePaths = [];
|
|
64
|
+
for (const inputPath of paths) {
|
|
65
|
+
const absolutePath = resolve(inputPath);
|
|
66
|
+
if (!existsSync(absolutePath)) {
|
|
67
|
+
displayError(`Path not found: ${inputPath}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
absolutePaths.push(absolutePath);
|
|
71
|
+
}
|
|
72
|
+
const files = discoverFiles(absolutePaths);
|
|
73
|
+
validateFiles(files);
|
|
74
|
+
const projectName = siteName || getProjectName(files);
|
|
75
|
+
spinner.succeed(`Found ${files.length} file(s) to publish.`);
|
|
76
|
+
const existingSite = await getSiteByName(projectName);
|
|
77
|
+
if (existingSite && !overwrite) {
|
|
78
|
+
displayError(`A site named '${projectName}' already exists.\n` +
|
|
79
|
+
`Please choose a different name or delete the existing site first.\n` +
|
|
80
|
+
`Use 'flowershow list' to see all sites.\n\n` +
|
|
81
|
+
`💡 Tip: Use the --overwrite flag to publish over an existing site.`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
spinner.start("Creating site...");
|
|
85
|
+
const siteData = await createSite(projectName, overwrite);
|
|
86
|
+
const site = siteData.site;
|
|
87
|
+
spinner.succeed(`Site created (ID: ${site.id})`);
|
|
88
|
+
const uploadBar = new cliProgress.SingleBar({
|
|
89
|
+
format: "Uploading |" +
|
|
90
|
+
chalk.cyan("{bar}") +
|
|
91
|
+
"| {percentage}% | {value}/{total} files",
|
|
92
|
+
barCompleteChar: "\u2588",
|
|
93
|
+
barIncompleteChar: "\u2591",
|
|
94
|
+
hideCursor: true,
|
|
95
|
+
}, cliProgress.Presets.shades_classic);
|
|
96
|
+
uploadBar.start(files.length, 0);
|
|
97
|
+
const fileMetadata = files.map((file) => ({
|
|
98
|
+
path: file.path,
|
|
99
|
+
size: file.size,
|
|
100
|
+
sha: file.sha,
|
|
101
|
+
}));
|
|
102
|
+
const uploadData = await getUploadUrls(site.id, fileMetadata);
|
|
103
|
+
const uploadResults = [];
|
|
104
|
+
for (let i = 0; i < files.length; i++) {
|
|
105
|
+
const file = files[i];
|
|
106
|
+
if (!file)
|
|
107
|
+
continue;
|
|
108
|
+
const uploadInfo = uploadData.uploadUrls.find((u) => u.path === file.path);
|
|
109
|
+
if (!uploadInfo) {
|
|
110
|
+
uploadResults.push({
|
|
111
|
+
path: file.path,
|
|
112
|
+
success: false,
|
|
113
|
+
error: "No upload URL received",
|
|
114
|
+
});
|
|
115
|
+
uploadBar.increment();
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const contentType = getContentType(file.extension);
|
|
120
|
+
await uploadToR2(uploadInfo.uploadUrl, file.content, contentType);
|
|
121
|
+
uploadResults.push({ path: file.path, success: true });
|
|
122
|
+
uploadBar.increment();
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
uploadResults.push({
|
|
126
|
+
path: file.path,
|
|
127
|
+
success: false,
|
|
128
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
129
|
+
});
|
|
130
|
+
uploadBar.increment();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
uploadBar.stop();
|
|
134
|
+
const failedUploads = uploadResults.filter((r) => !r.success);
|
|
135
|
+
if (failedUploads.length > 0) {
|
|
136
|
+
console.log(chalk.yellow(`⚠️ ${failedUploads.length} file(s) failed to upload`));
|
|
137
|
+
for (const result of failedUploads) {
|
|
138
|
+
console.log(chalk.yellow(` - ${result.path}: ${result.error}`));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log(chalk.green(`✓ Uploaded ${files.length} file(s)`));
|
|
143
|
+
}
|
|
144
|
+
const syncResult = await waitForSync(site.id, 30);
|
|
145
|
+
if (syncResult.timeout) {
|
|
146
|
+
displayWarning("Some files are still processing after 30 seconds.\n" +
|
|
147
|
+
"Your site is available but some pages may not be ready yet.\n" +
|
|
148
|
+
"Check back in a moment.");
|
|
149
|
+
}
|
|
150
|
+
else if (!syncResult.success && syncResult.errors) {
|
|
151
|
+
displayWarning("Some files had processing errors (see above).");
|
|
152
|
+
}
|
|
153
|
+
displayPublishSuccess(projectName, user.username || user.email || "user");
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (error instanceof Error) {
|
|
157
|
+
displayError(error.message);
|
|
158
|
+
console.error(chalk.gray(error.stack));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
displayError("An unknown error occurred");
|
|
162
|
+
}
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../lib/commands/publish.ts"],"names":[],"mappings":"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"}
|