@flowershow/publish 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.
Files changed (55) hide show
  1. package/README.md +332 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +86 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/lib/api-client.d.ts +76 -0
  7. package/dist/lib/api-client.d.ts.map +1 -0
  8. package/dist/lib/api-client.js +102 -0
  9. package/dist/lib/api-client.js.map +1 -0
  10. package/dist/lib/auth.d.ts +19 -0
  11. package/dist/lib/auth.d.ts.map +1 -0
  12. package/dist/lib/auth.js +128 -0
  13. package/dist/lib/auth.js.map +1 -0
  14. package/dist/lib/commands/auth-login.d.ts +2 -0
  15. package/dist/lib/commands/auth-login.d.ts.map +1 -0
  16. package/dist/lib/commands/auth-login.js +54 -0
  17. package/dist/lib/commands/auth-login.js.map +1 -0
  18. package/dist/lib/commands/auth-logout.d.ts +2 -0
  19. package/dist/lib/commands/auth-logout.d.ts.map +1 -0
  20. package/dist/lib/commands/auth-logout.js +26 -0
  21. package/dist/lib/commands/auth-logout.js.map +1 -0
  22. package/dist/lib/commands/auth-status.d.ts +2 -0
  23. package/dist/lib/commands/auth-status.d.ts.map +1 -0
  24. package/dist/lib/commands/auth-status.js +35 -0
  25. package/dist/lib/commands/auth-status.js.map +1 -0
  26. package/dist/lib/commands/delete.d.ts +2 -0
  27. package/dist/lib/commands/delete.d.ts.map +1 -0
  28. package/dist/lib/commands/delete.js +63 -0
  29. package/dist/lib/commands/delete.js.map +1 -0
  30. package/dist/lib/commands/list.d.ts +2 -0
  31. package/dist/lib/commands/list.d.ts.map +1 -0
  32. package/dist/lib/commands/list.js +41 -0
  33. package/dist/lib/commands/list.js.map +1 -0
  34. package/dist/lib/commands/publish.d.ts +2 -0
  35. package/dist/lib/commands/publish.d.ts.map +1 -0
  36. package/dist/lib/commands/publish.js +128 -0
  37. package/dist/lib/commands/publish.js.map +1 -0
  38. package/dist/lib/commands/sync.d.ts +6 -0
  39. package/dist/lib/commands/sync.d.ts.map +1 -0
  40. package/dist/lib/commands/sync.js +162 -0
  41. package/dist/lib/commands/sync.js.map +1 -0
  42. package/dist/lib/const.d.ts +4 -0
  43. package/dist/lib/const.d.ts.map +1 -0
  44. package/dist/lib/const.js +4 -0
  45. package/dist/lib/const.js.map +1 -0
  46. package/dist/lib/files.d.ts +13 -0
  47. package/dist/lib/files.d.ts.map +1 -0
  48. package/dist/lib/files.js +159 -0
  49. package/dist/lib/files.js.map +1 -0
  50. package/dist/lib/utils.d.ts +22 -0
  51. package/dist/lib/utils.d.ts.map +1 -0
  52. package/dist/lib/utils.js +90 -0
  53. package/dist/lib/utils.js.map +1 -0
  54. package/dist/package.json +55 -0
  55. package/package.json +54 -0
@@ -0,0 +1,162 @@
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 { requireAuth } from "../auth.js";
7
+ import { syncFiles, uploadToR2, getSiteByName } from "../api-client.js";
8
+ import { discoverFiles, getProjectName, validateFiles } from "../files.js";
9
+ import { displayError, displayWarning, waitForSync } from "../utils.js";
10
+ function displaySyncSummary(syncPlan, projectName, verbose = false) {
11
+ console.log(chalk.bold(`\nSync Summary for '${projectName}':`));
12
+ if (syncPlan.summary.toUpload > 0) {
13
+ console.log(chalk.cyan(` šŸ“ Files to upload: ${syncPlan.summary.toUpload}`));
14
+ for (const uploadUrl of syncPlan.uploadUrls) {
15
+ console.log(chalk.cyan(` + ${uploadUrl.path}`));
16
+ }
17
+ }
18
+ if (syncPlan.summary.toDelete > 0) {
19
+ console.log(chalk.yellow(` šŸ—‘ļø Files to delete: ${syncPlan.summary.toDelete}`));
20
+ for (const deletedPath of syncPlan.deleted) {
21
+ console.log(chalk.yellow(` - ${deletedPath}`));
22
+ }
23
+ }
24
+ if (syncPlan.summary.unchanged > 0) {
25
+ if (verbose) {
26
+ console.log(chalk.green(` āœ… Files unchanged: ${syncPlan.summary.unchanged}`));
27
+ for (const unchangedPath of syncPlan.unchanged) {
28
+ console.log(chalk.gray(` • ${unchangedPath}`));
29
+ }
30
+ }
31
+ else {
32
+ console.log(chalk.green(` āœ“ Files unchanged: ${syncPlan.summary.unchanged}`));
33
+ console.log(chalk.gray(`\nNote: Use --verbose to see all unchanged files`));
34
+ }
35
+ }
36
+ }
37
+ function hasChanges(syncPlan) {
38
+ return syncPlan.summary.toUpload > 0 || syncPlan.summary.toDelete > 0;
39
+ }
40
+ function displaySyncSuccess(projectName, username, summary) {
41
+ console.log(chalk.green.bold("\nāœ… Sync complete!"));
42
+ console.log(chalk.cyan(` Site: https://my.flowershow.app/@${username}/${projectName}`));
43
+ console.log(chalk.gray(` Uploaded: ${summary.toUpload} | Deleted: ${summary.toDelete} | Unchanged: ${summary.unchanged}`));
44
+ }
45
+ export async function syncCommand(inputPath, options = {}) {
46
+ try {
47
+ const spinner = ora();
48
+ const user = await requireAuth();
49
+ spinner.succeed(`Syncing as: ${user.username || user.email}`);
50
+ spinner.start("Discovering files...");
51
+ const absolutePath = resolve(inputPath);
52
+ if (!existsSync(absolutePath)) {
53
+ displayError(`Path not found: ${inputPath}`);
54
+ process.exit(1);
55
+ }
56
+ const files = discoverFiles(absolutePath);
57
+ validateFiles(files);
58
+ const projectName = options.name || getProjectName(files);
59
+ spinner.succeed(`Found ${files.length} file(s) in ${inputPath}`);
60
+ const existingSite = await getSiteByName(projectName);
61
+ if (!existingSite) {
62
+ displayError(`Site '${projectName}' not found.\n` +
63
+ `Use 'flowershow publish' to create it first, or specify a different site name with --name.`);
64
+ process.exit(1);
65
+ }
66
+ const fileMetadata = files.map((file) => ({
67
+ path: file.path,
68
+ size: file.size,
69
+ sha: file.sha,
70
+ }));
71
+ spinner.start("Analyzing changes...");
72
+ const syncPlan = await syncFiles(existingSite.site.id, fileMetadata, options.dryRun || false);
73
+ spinner.stop();
74
+ if (!hasChanges(syncPlan)) {
75
+ console.log(chalk.green.bold("\nāœ… Already in sync!"));
76
+ console.log(chalk.gray(` All ${files.length} file(s) are up to date.`));
77
+ console.log(chalk.cyan(` Site: https://my.flowershow.app/@${user.username || user.email}/${projectName}`));
78
+ return;
79
+ }
80
+ displaySyncSummary(syncPlan, projectName, options.verbose || false);
81
+ if (options.dryRun || syncPlan.dryRun) {
82
+ console.log(chalk.yellow("\nšŸ” Dry run complete - no changes were made to your site"));
83
+ console.log(chalk.gray(" Run without --dry-run to apply these changes"));
84
+ return;
85
+ }
86
+ if (syncPlan.uploadUrls.length > 0) {
87
+ const uploadBar = new cliProgress.SingleBar({
88
+ format: "Uploading |" +
89
+ chalk.cyan("{bar}") +
90
+ "| {percentage}% | {value}/{total} files",
91
+ barCompleteChar: "\u2588",
92
+ barIncompleteChar: "\u2591",
93
+ hideCursor: true,
94
+ }, cliProgress.Presets.shades_classic);
95
+ uploadBar.start(syncPlan.uploadUrls.length, 0);
96
+ const uploadResults = [];
97
+ for (let i = 0; i < syncPlan.uploadUrls.length; i++) {
98
+ const uploadInfo = syncPlan.uploadUrls[i];
99
+ if (!uploadInfo)
100
+ continue;
101
+ const file = files.find((f) => f.path === uploadInfo.path);
102
+ if (!file) {
103
+ uploadResults.push({
104
+ path: uploadInfo.path,
105
+ success: false,
106
+ error: "File not found in local files",
107
+ });
108
+ uploadBar.increment();
109
+ continue;
110
+ }
111
+ try {
112
+ await uploadToR2(uploadInfo.uploadUrl, file.content, uploadInfo.contentType);
113
+ uploadResults.push({ path: file.path, success: true });
114
+ uploadBar.increment();
115
+ }
116
+ catch (error) {
117
+ uploadResults.push({
118
+ path: file.path,
119
+ success: false,
120
+ error: error instanceof Error ? error.message : "Unknown error",
121
+ });
122
+ uploadBar.increment();
123
+ }
124
+ }
125
+ uploadBar.stop();
126
+ const failedUploads = uploadResults.filter((r) => !r.success);
127
+ if (failedUploads.length > 0) {
128
+ console.log(chalk.yellow(`āš ļø ${failedUploads.length} file(s) failed to upload`));
129
+ for (const result of failedUploads) {
130
+ console.log(chalk.yellow(` - ${result.path}: ${result.error}`));
131
+ }
132
+ }
133
+ else {
134
+ console.log(chalk.green(`āœ“ Uploaded ${syncPlan.uploadUrls.length} file(s)`));
135
+ }
136
+ }
137
+ if (syncPlan.deleted.length > 0) {
138
+ console.log(chalk.green(`āœ“ Deleted ${syncPlan.deleted.length} file(s)`));
139
+ }
140
+ const syncResult = await waitForSync(existingSite.site.id, 30);
141
+ if (syncResult.timeout) {
142
+ displayWarning("Some files are still processing after 30 seconds.\n" +
143
+ "Your site is available but some pages may not be ready yet.\n" +
144
+ "Check back in a moment.");
145
+ }
146
+ else if (!syncResult.success && syncResult.errors) {
147
+ displayWarning("Some files had processing errors (see above).");
148
+ }
149
+ displaySyncSuccess(projectName, user.username || user.email || "user", syncPlan.summary);
150
+ }
151
+ catch (error) {
152
+ if (error instanceof Error) {
153
+ displayError(error.message);
154
+ console.error(chalk.gray(error.stack));
155
+ }
156
+ else {
157
+ displayError("An unknown error occurred");
158
+ }
159
+ process.exit(1);
160
+ }
161
+ }
162
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../lib/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAWxE,SAAS,kBAAkB,CACzB,QAKC,EACD,WAAmB,EACnB,UAAmB,KAAK;IAExB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,IAAI,CAAC,CAAC,CAAC;IAGhE,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CACjE,CAAC;QACF,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAGD,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,2BAA2B,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CACrE,CAAC;QACF,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAGD,IAAI,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,wBAAwB,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAClE,CAAC;YACF,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,wBAAwB,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAClE,CAAC;YACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAKD,SAAS,UAAU,CAAC,QAEnB;IACC,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACxE,CAAC;AAKD,SAAS,kBAAkB,CACzB,WAAmB,EACnB,QAAgB,EAChB,OAAkE;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,uCAAuC,QAAQ,IAAI,WAAW,EAAE,CAAC,CAC7E,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,gBAAgB,OAAO,CAAC,QAAQ,eAAe,OAAO,CAAC,QAAQ,iBAAiB,OAAO,CAAC,SAAS,EAAE,CACpG,CACF,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,UAII,EAAE;IAEN,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QAGtB,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9D,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAGtC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,YAAY,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAGD,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC1C,aAAa,CAAC,KAAK,CAAC,CAAC;QAGrB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1D,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,MAAM,eAAe,SAAS,EAAE,CAAC,CAAC;QAGjE,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,CACV,SAAS,WAAW,gBAAgB;gBAClC,4FAA4F,CAC/F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAGD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC,CAAC;QAGJ,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,YAAY,CAAC,IAAI,CAAC,EAAE,EACpB,YAAY,EACZ,OAAO,CAAC,MAAM,IAAI,KAAK,CACxB,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;QAGf,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,uCACE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KACxB,IAAI,WAAW,EAAE,CAClB,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAGD,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;QAGpE,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,2DAA2D,CAC5D,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAC9D,CAAC;YACF,OAAO;QACT,CAAC;QAGD,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,SAAS,CACzC;gBACE,MAAM,EACJ,aAAa;oBACb,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;oBACnB,yCAAyC;gBAC3C,eAAe,EAAE,QAAQ;gBACzB,iBAAiB,EAAE,QAAQ;gBAC3B,UAAU,EAAE,IAAI;aACjB,EACD,WAAW,CAAC,OAAO,CAAC,cAAc,CACnC,CAAC;YAEF,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE/C,MAAM,aAAa,GAAmB,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAE1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,aAAa,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,+BAA+B;qBACvC,CAAC,CAAC;oBACH,SAAS,CAAC,SAAS,EAAE,CAAC;oBACtB,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,UAAU,CACd,UAAU,CAAC,SAAS,EACpB,IAAI,CAAC,OAAO,EACZ,UAAU,CAAC,WAAW,CACvB,CAAC;oBACF,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBACvD,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,aAAa,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAChE,CAAC,CAAC;oBACH,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,SAAS,CAAC,IAAI,EAAE,CAAC;YAEjB,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,OAAO,aAAa,CAAC,MAAM,2BAA2B,CAAC,CACrE,CAAC;gBACF,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,cAAc,QAAQ,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAChE,CAAC;YACJ,CAAC;QACH,CAAC;QAID,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC;QAC3E,CAAC;QAGD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE/D,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,cAAc,CACZ,qDAAqD;gBACnD,+DAA+D;gBAC/D,yBAAyB,CAC5B,CAAC;QACJ,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACpD,cAAc,CAAC,+CAA+C,CAAC,CAAC;QAClE,CAAC;QAGD,kBAAkB,CAChB,WAAW,EACX,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,EACrC,QAAQ,CAAC,OAAO,CACjB,CAAC;IACJ,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,4 @@
1
+ import "dotenv/config";
2
+ export declare const API_URL: string;
3
+ export declare const APP_URL: string;
4
+ //# sourceMappingURL=const.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../lib/const.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,eAAO,MAAM,OAAO,QAAwD,CAAC;AAC7E,eAAO,MAAM,OAAO,QAAqD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import "dotenv/config";
2
+ export const API_URL = process.env.API_URL || "https://cloud.flowershow.app";
3
+ export const APP_URL = process.env.APP_URL || "https://my.flowershow.app";
4
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../lib/const.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,8BAA8B,CAAC;AAC7E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,2BAA2B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface FileInfo {
2
+ originalPath: string;
3
+ path: string;
4
+ size: number;
5
+ sha: string;
6
+ extension: string;
7
+ content: Buffer;
8
+ projectName?: string;
9
+ }
10
+ export declare function discoverFiles(inputPaths: string | string[]): FileInfo[];
11
+ export declare function getProjectName(files: FileInfo[]): string;
12
+ export declare function validateFiles(files: FileInfo[]): boolean;
13
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../lib/files.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8FD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE,CAmFvE;AAKD,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CASxD;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAWxD"}
@@ -0,0 +1,159 @@
1
+ import { readFileSync, statSync, readdirSync, existsSync } from "fs";
2
+ import { join, basename, extname, relative, sep } from "path";
3
+ import { createHash } from "crypto";
4
+ import ignore from "ignore";
5
+ const DEFAULT_IGNORE_PATTERNS = [
6
+ ".git/",
7
+ ".gitignore",
8
+ "node_modules/",
9
+ ".DS_Store",
10
+ "Thumbs.db",
11
+ ".env",
12
+ ".env.*",
13
+ "!.env.example",
14
+ "*.log",
15
+ ".cache/",
16
+ "dist/",
17
+ "build/",
18
+ ".next/",
19
+ ".vercel/",
20
+ ".turbo/",
21
+ "coverage/",
22
+ ".nyc_output/",
23
+ ];
24
+ function loadGitignore(baseDir) {
25
+ const ig = ignore();
26
+ ig.add(DEFAULT_IGNORE_PATTERNS);
27
+ const gitignorePath = join(baseDir, ".gitignore");
28
+ if (existsSync(gitignorePath)) {
29
+ try {
30
+ const gitignoreContent = readFileSync(gitignorePath, "utf-8");
31
+ ig.add(gitignoreContent);
32
+ }
33
+ catch (error) {
34
+ console.warn(`Warning: Could not read .gitignore file: ${error}`);
35
+ }
36
+ }
37
+ return ig;
38
+ }
39
+ function shouldIncludeFile(filePath, ig) {
40
+ const normalizedPath = filePath.split(sep).join("/");
41
+ return !ig.ignores(normalizedPath);
42
+ }
43
+ function calculateSha(content) {
44
+ return createHash("sha1").update(content).digest("hex");
45
+ }
46
+ function getExtension(filePath) {
47
+ const ext = extname(filePath);
48
+ return ext ? ext.slice(1).toLowerCase() : "";
49
+ }
50
+ function normalizePath(path) {
51
+ return path.split(sep).join("/");
52
+ }
53
+ function scanDirectory(dirPath, baseDir = dirPath) {
54
+ const files = [];
55
+ const ig = loadGitignore(baseDir);
56
+ function scan(currentPath) {
57
+ const entries = readdirSync(currentPath, { withFileTypes: true });
58
+ for (const entry of entries) {
59
+ const fullPath = join(currentPath, entry.name);
60
+ const relativePath = relative(baseDir, fullPath);
61
+ if (!shouldIncludeFile(relativePath, ig)) {
62
+ continue;
63
+ }
64
+ if (entry.isDirectory()) {
65
+ scan(fullPath);
66
+ }
67
+ else if (entry.isFile()) {
68
+ files.push(fullPath);
69
+ }
70
+ }
71
+ }
72
+ scan(dirPath);
73
+ return files;
74
+ }
75
+ export function discoverFiles(inputPaths) {
76
+ const paths = Array.isArray(inputPaths) ? inputPaths : [inputPaths];
77
+ if (paths.length === 0) {
78
+ throw new Error("No paths provided");
79
+ }
80
+ const allFiles = [];
81
+ let projectName = null;
82
+ for (let i = 0; i < paths.length; i++) {
83
+ const inputPath = paths[i];
84
+ if (!inputPath)
85
+ continue;
86
+ const stats = statSync(inputPath);
87
+ const isFirstPath = i === 0;
88
+ if (stats.isFile()) {
89
+ const extension = getExtension(inputPath);
90
+ const fileName = basename(inputPath, extname(inputPath));
91
+ const content = readFileSync(inputPath);
92
+ let targetPath;
93
+ if (isFirstPath) {
94
+ targetPath = extension === "mdx" ? "README.mdx" : "README.md";
95
+ projectName = fileName;
96
+ }
97
+ else {
98
+ targetPath = basename(inputPath);
99
+ }
100
+ allFiles.push({
101
+ originalPath: inputPath,
102
+ path: normalizePath(targetPath),
103
+ size: stats.size,
104
+ sha: calculateSha(content),
105
+ extension,
106
+ content,
107
+ });
108
+ }
109
+ else if (stats.isDirectory()) {
110
+ const dirName = basename(inputPath);
111
+ const dirFiles = scanDirectory(inputPath);
112
+ if (isFirstPath && !projectName) {
113
+ projectName = dirName;
114
+ }
115
+ for (const filePath of dirFiles) {
116
+ const content = readFileSync(filePath);
117
+ const extension = getExtension(filePath);
118
+ const relativePath = relative(inputPath, filePath);
119
+ const fileStats = statSync(filePath);
120
+ allFiles.push({
121
+ originalPath: filePath,
122
+ path: normalizePath(relativePath),
123
+ size: fileStats.size,
124
+ sha: calculateSha(content),
125
+ extension,
126
+ content,
127
+ });
128
+ }
129
+ }
130
+ else {
131
+ throw new Error(`Invalid path: ${inputPath} is neither a file nor a directory`);
132
+ }
133
+ }
134
+ if (allFiles.length > 0 && projectName) {
135
+ allFiles[0].projectName = projectName;
136
+ }
137
+ return allFiles;
138
+ }
139
+ export function getProjectName(files) {
140
+ if (files.length === 0) {
141
+ throw new Error("No files discovered");
142
+ }
143
+ const projectName = files[0]?.projectName;
144
+ if (!projectName) {
145
+ throw new Error("Project name not found in files");
146
+ }
147
+ return projectName;
148
+ }
149
+ export function validateFiles(files) {
150
+ if (files.length === 0) {
151
+ throw new Error("No files found to publish");
152
+ }
153
+ const hasMarkdown = files.some((f) => ["md", "mdx"].includes(f.extension));
154
+ if (!hasMarkdown) {
155
+ console.warn("Warning: No markdown files found. The site will be empty.");
156
+ }
157
+ return true;
158
+ }
159
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../lib/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ interface BlobStatus {
2
+ path: string;
3
+ syncStatus: "PENDING" | "SUCCESS" | "ERROR";
4
+ syncError?: string;
5
+ }
6
+ interface SyncResult {
7
+ success: boolean;
8
+ blobs: BlobStatus[];
9
+ errors?: BlobStatus[];
10
+ timeout?: boolean;
11
+ }
12
+ export declare function sleep(ms: number): Promise<void>;
13
+ export declare function formatDate(date: string | Date): string;
14
+ export declare function getSiteUrl(projectName: string, username: string): string;
15
+ export declare function getDashboardUrl(siteId: string): string;
16
+ export declare function waitForSync(siteId: string, maxWaitSeconds?: number): Promise<SyncResult>;
17
+ export declare function displayPublishSuccess(projectName: string, username: string): void;
18
+ export declare function displayError(message: string): void;
19
+ export declare function displayWarning(message: string): void;
20
+ export declare function displayInfo(message: string): void;
21
+ export {};
22
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAKD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEtD;AAKD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,MAAY,GAC3B,OAAO,CAAC,UAAU,CAAC,CAwFrB;AAKD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAKD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAKD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAKD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
@@ -0,0 +1,90 @@
1
+ import chalk from "chalk";
2
+ import cliProgress from "cli-progress";
3
+ import { getSiteStatus } from "./api-client.js";
4
+ import { API_URL, APP_URL } from "./const.js";
5
+ export function sleep(ms) {
6
+ return new Promise((resolve) => setTimeout(resolve, ms));
7
+ }
8
+ export function formatDate(date) {
9
+ return new Date(date).toLocaleString();
10
+ }
11
+ export function getSiteUrl(projectName, username) {
12
+ return `${APP_URL}/@${username}/${projectName}`;
13
+ }
14
+ export function getDashboardUrl(siteId) {
15
+ return `${API_URL}/site/${siteId}/settings`;
16
+ }
17
+ export async function waitForSync(siteId, maxWaitSeconds = 180) {
18
+ const startTime = Date.now();
19
+ const maxWaitMs = maxWaitSeconds * 1000;
20
+ let progressBar = null;
21
+ let totalFiles = 0;
22
+ while (Date.now() - startTime < maxWaitMs) {
23
+ const statusData = await getSiteStatus(siteId);
24
+ const blobs = statusData.blobs || [];
25
+ if (blobs.length === 0) {
26
+ if (progressBar) {
27
+ progressBar.stop();
28
+ }
29
+ return { success: true, blobs: [] };
30
+ }
31
+ const pending = blobs.filter((b) => b.syncStatus === "PENDING");
32
+ const errors = blobs.filter((b) => b.syncStatus === "ERROR");
33
+ const success = blobs.filter((b) => b.syncStatus === "SUCCESS");
34
+ if (!progressBar && blobs.length > 0) {
35
+ totalFiles = blobs.length;
36
+ progressBar = new cliProgress.SingleBar({
37
+ format: "Processing |" +
38
+ chalk.cyan("{bar}") +
39
+ "| {percentage}% | {value}/{total} files",
40
+ barCompleteChar: "\u2588",
41
+ barIncompleteChar: "\u2591",
42
+ hideCursor: true,
43
+ }, cliProgress.Presets.shades_classic);
44
+ progressBar.start(totalFiles, success.length);
45
+ }
46
+ if (progressBar) {
47
+ progressBar.update(success.length + errors.length);
48
+ }
49
+ if (pending.length === 0) {
50
+ if (progressBar) {
51
+ progressBar.stop();
52
+ }
53
+ if (errors.length > 0) {
54
+ console.log(chalk.yellow(`\nāš ļø ${errors.length} file(s) had errors:`));
55
+ for (const blob of errors) {
56
+ console.log(chalk.yellow(` - ${blob.path}: ${blob.syncError || "Unknown error"}`));
57
+ }
58
+ return { success: false, blobs, errors };
59
+ }
60
+ console.log(chalk.green(`āœ“ All files processed successfully`));
61
+ return { success: true, blobs };
62
+ }
63
+ await sleep(500);
64
+ }
65
+ if (progressBar) {
66
+ progressBar.stop();
67
+ }
68
+ const statusData = await getSiteStatus(siteId);
69
+ const blobs = statusData.blobs || [];
70
+ const pending = blobs.filter((b) => b.syncStatus === "PENDING");
71
+ console.log(chalk.yellow(`\nāš ļø Timeout: ${pending.length} file(s) still processing`));
72
+ for (const blob of pending) {
73
+ console.log(chalk.yellow(` - ${blob.path}`));
74
+ }
75
+ return { success: false, blobs, timeout: true };
76
+ }
77
+ export function displayPublishSuccess(projectName, username) {
78
+ const url = getSiteUrl(projectName, username);
79
+ console.log(chalk.cyan(`\nšŸ’ Visit your site at: ${url}\n`));
80
+ }
81
+ export function displayError(message) {
82
+ console.error(chalk.red(`\nāœ— Error: ${message}\n`));
83
+ }
84
+ export function displayWarning(message) {
85
+ console.warn(chalk.yellow(`\nāš ļø Warning: ${message}\n`));
86
+ }
87
+ export function displayInfo(message) {
88
+ console.log(chalk.blue(`ℹ ${message}`));
89
+ }
90
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@flowershow/publish",
3
+ "version": "0.4.0",
4
+ "description": "CLI tool for publishing to FlowerShow",
5
+ "type": "module",
6
+ "main": "./dist/cli.js",
7
+ "bin": {
8
+ "publish": "./dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc && cp package.json dist/",
12
+ "dev": "tsx cli.ts",
13
+ "prepublishOnly": "pnpm run build",
14
+ "release": "changeset publish"
15
+ },
16
+ "keywords": [
17
+ "flowershow",
18
+ "cli",
19
+ "publish",
20
+ "markdown"
21
+ ],
22
+ "author": "Flowershow",
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/flowershow/cli"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/flowershow/flowershow/issues"
30
+ },
31
+ "homepage": "https://flowershow.app",
32
+ "dependencies": {
33
+ "@inquirer/prompts": "^8.1.0",
34
+ "@types/cli-progress": "^3.11.6",
35
+ "chalk": "^5.3.0",
36
+ "cli-progress": "^3.12.0",
37
+ "commander": "^11.0.0",
38
+ "dotenv": "^16.6.1",
39
+ "ignore": "^7.0.5",
40
+ "ora": "^9.0.0"
41
+ },
42
+ "engines": {
43
+ "node": ">=18.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@changesets/cli": "^2.29.8",
47
+ "@types/node": "^25.0.3",
48
+ "tsx": "^4.21.0",
49
+ "typescript": "^5.9.3"
50
+ },
51
+ "files": [
52
+ "dist",
53
+ "README.md"
54
+ ]
55
+ }
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@flowershow/publish",
3
+ "version": "0.4.0",
4
+ "description": "CLI tool for publishing to FlowerShow",
5
+ "type": "module",
6
+ "main": "./dist/cli.js",
7
+ "bin": {
8
+ "publish": "./dist/cli.js"
9
+ },
10
+ "keywords": [
11
+ "flowershow",
12
+ "cli",
13
+ "publish",
14
+ "markdown"
15
+ ],
16
+ "author": "Flowershow",
17
+ "license": "MIT",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/flowershow/cli"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/flowershow/flowershow/issues"
24
+ },
25
+ "homepage": "https://flowershow.app",
26
+ "dependencies": {
27
+ "@inquirer/prompts": "^8.1.0",
28
+ "@types/cli-progress": "^3.11.6",
29
+ "chalk": "^5.3.0",
30
+ "cli-progress": "^3.12.0",
31
+ "commander": "^11.0.0",
32
+ "dotenv": "^16.6.1",
33
+ "ignore": "^7.0.5",
34
+ "ora": "^9.0.0"
35
+ },
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "@changesets/cli": "^2.29.8",
41
+ "@types/node": "^25.0.3",
42
+ "tsx": "^4.21.0",
43
+ "typescript": "^5.9.3"
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "README.md"
48
+ ],
49
+ "scripts": {
50
+ "build": "tsc && cp package.json dist/",
51
+ "dev": "tsx cli.ts",
52
+ "release": "changeset publish"
53
+ }
54
+ }