flowershow 0.1.10 → 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.
Files changed (81) hide show
  1. package/README.md +246 -10
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +70 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/lib/api-client.d.ts +68 -0
  7. package/dist/lib/api-client.d.ts.map +1 -0
  8. package/dist/lib/api-client.js +104 -0
  9. package/dist/lib/api-client.js.map +1 -0
  10. package/dist/lib/auth.d.ts +21 -0
  11. package/dist/lib/auth.d.ts.map +1 -0
  12. package/dist/lib/auth.js +133 -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 +55 -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 +36 -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 +80 -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 +42 -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 +166 -0
  37. package/dist/lib/commands/publish.js.map +1 -0
  38. package/dist/lib/const.d.ts +4 -0
  39. package/dist/lib/const.d.ts.map +1 -0
  40. package/dist/lib/const.js +4 -1
  41. package/dist/lib/const.js.map +1 -0
  42. package/dist/lib/files.d.ts +13 -0
  43. package/dist/lib/files.d.ts.map +1 -0
  44. package/dist/lib/files.js +156 -0
  45. package/dist/lib/files.js.map +1 -0
  46. package/dist/lib/utils.d.ts +22 -0
  47. package/dist/lib/utils.d.ts.map +1 -0
  48. package/dist/lib/utils.js +90 -0
  49. package/dist/lib/utils.js.map +1 -0
  50. package/package.json +37 -37
  51. package/dist/bin/cli.js +0 -97
  52. package/dist/index.js +0 -1
  53. package/dist/lib/Installer.js +0 -185
  54. package/dist/lib/build.js +0 -18
  55. package/dist/lib/buildExport.js +0 -11
  56. package/dist/lib/install.js +0 -28
  57. package/dist/lib/preview.js +0 -18
  58. package/dist/lib/publish.js +0 -8
  59. package/dist/lib/upgrade.js +0 -8
  60. package/dist/lib/utils/exit.js +0 -3
  61. package/dist/lib/utils/index.js +0 -5
  62. package/dist/lib/utils/isSubdir.js +0 -6
  63. package/dist/lib/utils/logger.js +0 -19
  64. package/dist/lib/utils/sendEvent.js +0 -5
  65. package/dist/lib/utils/spinner.js +0 -49
  66. package/dist/src/bin/cli.js +0 -97
  67. package/dist/src/index.js +0 -1
  68. package/dist/src/lib/Installer.js +0 -185
  69. package/dist/src/lib/build.js +0 -18
  70. package/dist/src/lib/buildExport.js +0 -11
  71. package/dist/src/lib/const.js +0 -1
  72. package/dist/src/lib/install.js +0 -28
  73. package/dist/src/lib/preview.js +0 -18
  74. package/dist/src/lib/publish.js +0 -8
  75. package/dist/src/lib/upgrade.js +0 -8
  76. package/dist/src/lib/utils/exit.js +0 -3
  77. package/dist/src/lib/utils/index.js +0 -5
  78. package/dist/src/lib/utils/isSubdir.js +0 -6
  79. package/dist/src/lib/utils/logger.js +0 -19
  80. package/dist/src/lib/utils/sendEvent.js +0 -5
  81. package/dist/src/lib/utils/spinner.js +0 -49
package/README.md CHANGED
@@ -1,27 +1,263 @@
1
- # Flowershow CLI
1
+ # FlowerShow CLI (Alpha 🚧)
2
2
 
3
- ## CLI commands
3
+ A CLI tool for publishing Markdown files and folders directly to FlowerShow with OAuth authentication.
4
4
 
5
- Install Flowershow:
5
+ ## Installation
6
6
 
7
+ ```bash
8
+ npm install -g flowershow
9
+ ```
10
+
11
+ Then use the `flowershow` command anywhere:
12
+
13
+ ```bash
14
+ flowershow auth login
15
+ flowershow publish ./my-notes
16
+ ```
17
+
18
+ ## Quick Start
19
+
20
+ ### 1. Authenticate
21
+
22
+ Before using any commands, you must authenticate:
23
+
24
+ ```bash
25
+ flowershow auth login
26
+ ```
27
+
28
+ This will:
29
+
30
+ 1. Display a URL and verification code
31
+ 2. Open your browser to authorize the CLI
32
+ 3. Store your authentication token locally
33
+
34
+ See [Authentication Documentation](docs/authentication.md) for details.
35
+
36
+ ### 2. Publish Your Content
37
+
38
+ ```bash
39
+ # Publish a folder
40
+ flowershow publish ./my-notes
41
+
42
+ # Publish a single file
43
+ flowershow publish ./my-note.md
7
44
  ```
8
- npx flowershow@latest install
45
+
46
+ ## Commands
47
+
48
+ ### Authentication
49
+
50
+ #### `flowershow auth login`
51
+
52
+ Authenticate with FlowerShow via browser OAuth flow.
53
+
54
+ ```bash
55
+ flowershow auth login
9
56
  ```
10
57
 
11
- Preview your Flowershow website:
58
+ #### `flowershow auth status`
59
+
60
+ Check your current authentication status.
61
+
62
+ ```bash
63
+ flowershow auth status
64
+ ```
65
+
66
+ #### `flowershow auth logout`
67
+
68
+ Remove your stored authentication token.
69
+
70
+ ```bash
71
+ flowershow auth logout
72
+ ```
73
+
74
+ See [Authentication Documentation](docs/authentication.md) for detailed information.
75
+
76
+ ### Publishing
77
+
78
+ #### `flowershow publish <path> [morePaths...] [options]`
79
+
80
+ Publish files or folders to FlowerShow.
81
+
82
+ **Options:**
83
+
84
+ - `--overwrite` - Overwrite existing site if it already exists
85
+ - `--name <siteName>` - Custom name for the site (defaults to file/folder name)
86
+
87
+ **Examples:**
88
+
89
+ ```bash
90
+ # Publish a single markdown file
91
+ flowershow publish ./my-note.md
92
+
93
+ # Publish multiple files
94
+ flowershow publish ./intro.md ./chapter1.md ./chapter2.md
95
+
96
+ # Publish a folder
97
+ flowershow publish ./my-notes
98
+
99
+ # Overwrite an existing site
100
+ flowershow publish ./my-notes --overwrite
101
+
102
+ # Publish with a custom site name
103
+ flowershow publish ./my-notes --name my-custom-site
104
+
105
+ # Combine options
106
+ flowershow publish ./my-notes --name my-custom-site --overwrite
107
+ ```
108
+
109
+ **What happens:**
110
+
111
+ 1. Files are discovered and filtered (ignores `.git`, `node_modules`, etc.)
112
+ 2. Project name is derived from the first file/folder name
113
+ 3. Site is created via the FlowerShow API
114
+ 4. Presigned URLs are obtained for secure file uploads
115
+ 5. Files are uploaded directly to Cloudflare R2 storage
116
+ 6. CLI waits for markdown files to be processed
117
+ 7. Site URL is displayed
118
+
119
+ **Single file behavior:**
120
+
121
+ - Filename becomes the project name
122
+ - File is saved as `README.md` (or `README.mdx`)
123
+ - Accessible at `/@{username}/{filename}`
124
+
125
+ **Multiple files behavior:**
126
+
127
+ - First filename becomes the project name
128
+ - First file is saved as `README.md` (or `README.mdx`)
129
+ - Subsequent files keep their original names
130
+ - Accessible at `/@{username}/{first-filename}`
131
+
132
+ **Folder behavior:**
133
+
134
+ - Folder name becomes the project name
135
+ - All files maintain their relative paths
136
+ - Accessible at `/@{username}/{foldername}`
137
+
138
+ ### Site Management
139
+
140
+ #### `flowershow list`
141
+
142
+ List all sites published by your authenticated user.
143
+
144
+ ```bash
145
+ flowershow list
146
+ ```
147
+
148
+ Shows site names, URLs, and timestamps.
149
+
150
+ #### `flowershow delete <project-name>`
151
+
152
+ Delete a site and all its files.
153
+
154
+ ```bash
155
+ flowershow delete my-notes
156
+ ```
157
+
158
+ Removes the site and all its files via the FlowerShow API.
159
+
160
+ ## File Filtering
161
+
162
+ The CLI automatically ignores common non-content files and directories:
163
+
164
+ - `.git/`, `node_modules/`, `.cache/`, `dist/`, `build/`
165
+ - `.DS_Store`, `Thumbs.db`
166
+ - `.env*`, `*.log`
167
+ - `.next/`, `.vercel/`, `.turbo/`
168
+
169
+ If `.gitignore` file is present in the published folder, it will also ignore files matched by it.
170
+
171
+ ## Site URLs
172
+
173
+ All CLI-published sites are accessible at:
174
+
175
+ ```
176
+ https://my.flowershow.app/@{username}/{project-name}
177
+ ```
178
+
179
+ Where `{username}` is your authenticated username.
180
+
181
+ ## Troubleshooting
182
+
183
+ ### "You must be authenticated to use this command"
184
+
185
+ Run `flowershow auth login` to authenticate.
186
+
187
+ ### "Authentication token is invalid or expired"
188
+
189
+ Your token may have been revoked. Re-authenticate:
190
+
191
+ ```bash
192
+ flowershow auth login
193
+ ```
194
+
195
+ ### "Site already exists"
196
+
197
+ A site with that name already exists. You can:
198
+
199
+ - Use the `--overwrite` flag: `flowershow publish <path> --overwrite`
200
+ - Delete it first: `flowershow delete <name>`
201
+ - Rename your file/folder
202
+ - Use `flowershow list` to see all existing sites
203
+
204
+ ### Files still processing after timeout
205
+
206
+ The site is live, but some pages may not be ready yet. The Cloudflare worker processes files asynchronously. Check your site again in a moment.
207
+
208
+ ## Architecture
209
+
210
+ All CLI commands communicate with the FlowerShow API:
211
+
212
+ - **Authentication**: OAuth device flow endpoints
213
+ - **Site Management**: Create, list, and delete sites
214
+ - **File Upload**: Presigned URL generation and status polling
215
+ - **User Info**: Retrieve authenticated user details
216
+
217
+ ### Security
218
+
219
+ - **Token Storage**: Authentication tokens are stored in `~/.flowershow/token.json`
220
+ - **Token Format**: CLI tokens use the `fs_cli_` prefix
221
+ - **Token Expiration**: Tokens do not expire by default
222
+ - **Token Revocation**: Revoke tokens from the FlowerShow dashboard or via `flowershow auth logout`
223
+ - **Secure Uploads**: Files are uploaded using time-limited presigned URLs
224
+ - **No Credentials**: CLI never stores database or storage credentials
225
+
226
+ ## Development
227
+
228
+ ### Setup
229
+
230
+ 1. **Clone and install dependencies:**
231
+
232
+ ```bash
233
+ cd cli
234
+ pnpm install
235
+ ```
236
+
237
+ 2. **Configure environment:**
238
+
239
+ Use local or other non-production API and publish URLs.
240
+
241
+ ```bash
242
+ cp .env.example .env
243
+ ```
12
244
 
13
245
  ```bash
14
- npx flowershow@latest preview
246
+ API_URL="http://cloud.localhost:3000"
247
+ APP_URL="http://my.localhost:3000"
15
248
  ```
16
249
 
17
- Static build your website:
250
+ 3. **Run commands:**
18
251
 
19
252
  ```bash
20
- npx flowershow@latest export
253
+ pnpm dev auth login
254
+ pnpm dev publish ...
21
255
  ```
22
256
 
23
- See all available commands:
257
+ You can also build the project, link it globally and use it as you normally would the npm-installed version:
24
258
 
25
259
  ```bash
26
- npx flowershow@latest --help
260
+ pnpm build
261
+ npm link
262
+ flowershow ...
27
263
  ```
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import chalk from "chalk";
4
+ import { publishCommand } from "./lib/commands/publish.js";
5
+ import { listCommand } from "./lib/commands/list.js";
6
+ import { deleteCommand } from "./lib/commands/delete.js";
7
+ import { authLoginCommand } from "./lib/commands/auth-login.js";
8
+ import { authLogoutCommand } from "./lib/commands/auth-logout.js";
9
+ import { authStatusCommand } from "./lib/commands/auth-status.js";
10
+ const program = new Command();
11
+ program
12
+ .name("flowershow")
13
+ .description("CLI tool for publishing to FlowerShow")
14
+ .version("0.1.0");
15
+ const auth = program
16
+ .command("auth")
17
+ .description("Manage authentication")
18
+ .action(() => {
19
+ auth.help();
20
+ });
21
+ auth
22
+ .command("login")
23
+ .description("Authenticate with FlowerShow via browser")
24
+ .action(async () => {
25
+ console.log(chalk.bold("\n💐 FlowerShow CLI - Authentication\n"));
26
+ await authLoginCommand();
27
+ });
28
+ auth
29
+ .command("logout")
30
+ .description("Remove stored authentication token")
31
+ .action(async () => {
32
+ console.log(chalk.bold("\n💐 FlowerShow CLI - Logout\n"));
33
+ await authLogoutCommand();
34
+ });
35
+ auth
36
+ .command("status")
37
+ .description("Check authentication status")
38
+ .action(async () => {
39
+ console.log(chalk.bold("\n💐 FlowerShow CLI - Auth Status\n"));
40
+ await authStatusCommand();
41
+ });
42
+ program
43
+ .command("publish <path> [morePaths...]")
44
+ .description("Publish file(s) or folder to FlowerShow")
45
+ .option("--overwrite", "Overwrite existing site if it already exists")
46
+ .option("--name <siteName>", "Custom name for the site")
47
+ .action(async (path, morePaths, options) => {
48
+ console.log(chalk.bold("\n💐 FlowerShow CLI - Publish\n"));
49
+ const paths = [path, ...morePaths];
50
+ await publishCommand(paths, options.overwrite || false, options.name);
51
+ });
52
+ program
53
+ .command("list")
54
+ .description("List all published sites")
55
+ .action(async () => {
56
+ console.log(chalk.bold("\n💐 FlowerShow CLI - List Sites\n"));
57
+ await listCommand();
58
+ });
59
+ program
60
+ .command("delete <project-name>")
61
+ .description("Delete a published site")
62
+ .action(async (projectName) => {
63
+ console.log(chalk.bold("\n💐 FlowerShow CLI - Delete Site\n"));
64
+ await deleteCommand(projectName);
65
+ });
66
+ if (process.argv.length === 2) {
67
+ program.help();
68
+ }
69
+ program.parse();
70
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ interface Site {
2
+ id: string;
3
+ projectName: string;
4
+ url: string;
5
+ userId: string;
6
+ createdAt: string;
7
+ updatedAt?: string;
8
+ fileCount?: number;
9
+ totalSize?: number;
10
+ plan?: "FREE" | "PREMIUM";
11
+ }
12
+ interface CreateSiteResponse {
13
+ site: Site;
14
+ }
15
+ interface GetSitesResponse {
16
+ sites: Site[];
17
+ total: number;
18
+ }
19
+ interface GetSiteResponse {
20
+ site: Site;
21
+ }
22
+ interface DeleteSiteResponse {
23
+ success: boolean;
24
+ message: string;
25
+ deletedFiles: number;
26
+ }
27
+ interface FileMetadata {
28
+ path: string;
29
+ size: number;
30
+ sha: string;
31
+ }
32
+ interface UploadUrl {
33
+ path: string;
34
+ uploadUrl: string;
35
+ blobId: string;
36
+ }
37
+ interface GetUploadUrlsResponse {
38
+ uploadUrls: UploadUrl[];
39
+ expiresIn: number;
40
+ }
41
+ interface BlobStatus {
42
+ path: string;
43
+ syncStatus: "PENDING" | "SUCCESS" | "ERROR";
44
+ syncError?: string;
45
+ }
46
+ interface SiteStatusResponse {
47
+ siteId: string;
48
+ status: string;
49
+ files: {
50
+ total: number;
51
+ pending: number;
52
+ success: number;
53
+ failed: number;
54
+ };
55
+ blobs: BlobStatus[];
56
+ }
57
+ export declare function apiRequest(endpoint: string, options?: RequestInit): Promise<Response>;
58
+ export declare function createSite(projectName: string, overwrite?: boolean): Promise<CreateSiteResponse>;
59
+ export declare function getSites(): Promise<GetSitesResponse>;
60
+ export declare function getSiteById(siteId: string): Promise<GetSiteResponse>;
61
+ export declare function getSiteByName(siteName: string): Promise<GetSiteResponse | null>;
62
+ export declare function deleteSite(siteId: string): Promise<DeleteSiteResponse>;
63
+ export declare function getUploadUrls(siteId: string, files: FileMetadata[]): Promise<GetUploadUrlsResponse>;
64
+ export declare function uploadToR2(uploadUrl: string, content: Buffer, contentType: string): Promise<boolean>;
65
+ export declare function getSiteStatus(siteId: string): Promise<SiteStatusResponse>;
66
+ export declare function hasValidAuth(): boolean;
67
+ export {};
68
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../lib/api-client.ts"],"names":[],"mappings":"AAGA,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,qBAAqB;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAQD,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAQD,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAMD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAW1D;AAOD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAW1E;AAOD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAejC;AAOD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAa5E;AAQD,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,EAAE,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAiBhC;AASD,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAclB;AAOD,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW/E;AAMD,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
@@ -0,0 +1,104 @@
1
+ import { getAuthHeaders, isAuthenticated } from "./auth.js";
2
+ import { API_URL } from "./const.js";
3
+ export async function apiRequest(endpoint, options = {}) {
4
+ const authHeaders = getAuthHeaders();
5
+ const url = `${API_URL}${endpoint}`;
6
+ const headers = {
7
+ ...options.headers,
8
+ ...(authHeaders || {}),
9
+ };
10
+ return fetch(url, {
11
+ ...options,
12
+ headers,
13
+ });
14
+ }
15
+ export async function createSite(projectName, overwrite = false) {
16
+ const response = await apiRequest("/api/cli/site", {
17
+ method: "POST",
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ },
21
+ body: JSON.stringify({ projectName, overwrite }),
22
+ });
23
+ if (!response.ok) {
24
+ const error = await response.json().catch(() => ({}));
25
+ throw new Error(error.message || `Failed to create site: ${response.statusText}`);
26
+ }
27
+ return (await response.json());
28
+ }
29
+ export async function getSites() {
30
+ const response = await apiRequest("/api/cli/site/get-all");
31
+ if (!response.ok) {
32
+ const error = await response.json().catch(() => ({}));
33
+ throw new Error(error.message || `Failed to fetch sites: ${response.statusText}`);
34
+ }
35
+ return (await response.json());
36
+ }
37
+ export async function getSiteById(siteId) {
38
+ const response = await apiRequest(`/api/cli/site/${siteId}`);
39
+ if (!response.ok) {
40
+ const error = await response.json().catch(() => ({}));
41
+ throw new Error(error.message || `Failed to fetch site: ${response.statusText}`);
42
+ }
43
+ return (await response.json());
44
+ }
45
+ export async function getSiteByName(siteName) {
46
+ const response = await apiRequest(`/api/cli/site/by-name/${siteName}`);
47
+ if (!response.ok) {
48
+ if (response.status === 404) {
49
+ return null;
50
+ }
51
+ const error = await response.json().catch(() => ({}));
52
+ throw new Error(error.message || `Failed to fetch site: ${response.statusText}`);
53
+ }
54
+ return (await response.json());
55
+ }
56
+ export async function deleteSite(siteId) {
57
+ const response = await apiRequest(`/api/cli/site/${siteId}`, {
58
+ method: "DELETE",
59
+ });
60
+ if (!response.ok) {
61
+ const error = await response.json().catch(() => ({}));
62
+ throw new Error(error.message || `Failed to delete site: ${response.statusText}`);
63
+ }
64
+ return (await response.json());
65
+ }
66
+ export async function getUploadUrls(siteId, files) {
67
+ const response = await apiRequest(`/api/cli/site/${siteId}/upload-urls`, {
68
+ method: "POST",
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ },
72
+ body: JSON.stringify({ files }),
73
+ });
74
+ if (!response.ok) {
75
+ const error = await response.json().catch(() => ({}));
76
+ throw new Error(error.message || `Failed to get upload URLs: ${response.statusText}`);
77
+ }
78
+ return (await response.json());
79
+ }
80
+ export async function uploadToR2(uploadUrl, content, contentType) {
81
+ const response = await fetch(uploadUrl, {
82
+ method: "PUT",
83
+ body: content,
84
+ headers: {
85
+ "Content-Type": contentType,
86
+ },
87
+ });
88
+ if (!response.ok) {
89
+ throw new Error(`Failed to upload file: ${response.statusText}`);
90
+ }
91
+ return true;
92
+ }
93
+ export async function getSiteStatus(siteId) {
94
+ const response = await apiRequest(`/api/cli/site/${siteId}/status`);
95
+ if (!response.ok) {
96
+ const error = await response.json().catch(() => ({}));
97
+ throw new Error(error.message || `Failed to get site status: ${response.statusText}`);
98
+ }
99
+ return (await response.json());
100
+ }
101
+ export function hasValidAuth() {
102
+ return isAuthenticated();
103
+ }
104
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ interface TokenData {
2
+ token: string;
3
+ username: string;
4
+ savedAt: string;
5
+ }
6
+ interface UserInfo {
7
+ username?: string;
8
+ email?: string;
9
+ id?: string;
10
+ }
11
+ export declare function saveToken(token: string, username: string): void;
12
+ export declare function getToken(): TokenData | null;
13
+ export declare function removeToken(): Promise<void>;
14
+ export declare function isAuthenticated(): boolean;
15
+ export declare function getAuthHeaders(): Record<string, string> | null;
16
+ export declare function pollForToken(apiUrl: string, deviceCode: string, interval: number, expiresIn: number): Promise<string>;
17
+ export declare function requireAuth(): void;
18
+ export declare function getAuthenticatedUser(): Promise<UserInfo>;
19
+ export declare function getUserInfo(apiUrl: string, token: string): Promise<UserInfo>;
20
+ export {};
21
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../lib/auth.ts"],"names":[],"mappings":"AASA,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,QAAQ;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAaD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAY/D;AAMD,wBAAgB,QAAQ,IAAI,SAAS,GAAG,IAAI,CAY3C;AAKD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAYjD;AAMD,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAMD,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAU9D;AAUD,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA8DjB;AAKD,wBAAgB,WAAW,IAAI,IAAI,CAQlC;AAKD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAQ9D;AAQD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CAYnB"}