@nocoo/otter 1.0.1 → 1.0.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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +59 -57
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.d.ts +15 -10
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +23 -23
- package/dist/commands/login.js.map +1 -1
- package/dist/config/manager.d.ts +4 -2
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +8 -3
- package/dist/config/manager.js.map +1 -1
- package/dist/uploader/icons-server.d.ts +38 -0
- package/dist/uploader/icons-server.d.ts.map +1 -0
- package/dist/uploader/icons-server.js +76 -0
- package/dist/uploader/icons-server.js.map +1 -0
- package/package.json +1 -2
- package/dist/uploader/icons.d.ts +0 -41
- package/dist/uploader/icons.d.ts.map +0 -1
- package/dist/uploader/icons.js +0 -80
- package/dist/uploader/icons.js.map +0 -1
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA4cA,eAAO,MAAM,IAAI,qDAef,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -6,16 +6,26 @@ import { join } from "node:path";
|
|
|
6
6
|
import { createDefaultCollectors } from "./collectors/index.js";
|
|
7
7
|
import { executeScan } from "./commands/scan.js";
|
|
8
8
|
import { executeConfig } from "./commands/config.js";
|
|
9
|
-
import { executeLogin } from "./commands/login.js";
|
|
9
|
+
import { executeLogin, resolveHost, buildWebhookUrl } from "./commands/login.js";
|
|
10
10
|
import { formatSnapshotList, formatSnapshotDetail, diffSnapshots, formatSnapshotDiff } from "./commands/snapshot.js";
|
|
11
11
|
import { ConfigManager } from "./config/manager.js";
|
|
12
12
|
import { SnapshotStore } from "./storage/local.js";
|
|
13
13
|
import { uploadSnapshot } from "./uploader/webhook.js";
|
|
14
|
-
import {
|
|
14
|
+
import { uploadIconsToServer } from "./uploader/icons-server.js";
|
|
15
15
|
import { exportIcons } from "./utils/icons.js";
|
|
16
16
|
const otterConfigDir = join(homedir(), ".config", "otter");
|
|
17
|
-
const configManager = new ConfigManager(otterConfigDir);
|
|
18
17
|
const snapshotStore = new SnapshotStore(join(otterConfigDir, "snapshots"));
|
|
18
|
+
/**
|
|
19
|
+
* Detect whether --dev is set from process.argv.
|
|
20
|
+
* citty doesn't provide a global args mechanism, so we parse manually.
|
|
21
|
+
*/
|
|
22
|
+
function isDevMode() {
|
|
23
|
+
return process.argv.includes("--dev");
|
|
24
|
+
}
|
|
25
|
+
/** Lazily create ConfigManager based on dev flag. */
|
|
26
|
+
function getConfigManager() {
|
|
27
|
+
return new ConfigManager(otterConfigDir, isDevMode());
|
|
28
|
+
}
|
|
19
29
|
const scanCommand = defineCommand({
|
|
20
30
|
meta: {
|
|
21
31
|
name: "scan",
|
|
@@ -78,6 +88,11 @@ const backupCommand = defineCommand({
|
|
|
78
88
|
description: "Scan, build snapshot, and upload to webhook",
|
|
79
89
|
},
|
|
80
90
|
args: {
|
|
91
|
+
dev: {
|
|
92
|
+
type: "boolean",
|
|
93
|
+
description: "Use the dev host (otter.dev.hexly.ai)",
|
|
94
|
+
default: false,
|
|
95
|
+
},
|
|
81
96
|
slim: {
|
|
82
97
|
type: "boolean",
|
|
83
98
|
description: "Exclude behavior data (history.jsonl, session summaries) for a smaller snapshot",
|
|
@@ -85,14 +100,17 @@ const backupCommand = defineCommand({
|
|
|
85
100
|
},
|
|
86
101
|
},
|
|
87
102
|
async run({ args }) {
|
|
103
|
+
const configManager = getConfigManager();
|
|
88
104
|
const config = await configManager.load();
|
|
89
|
-
if (!config.
|
|
90
|
-
consola.error("
|
|
91
|
-
pc.bold("otter
|
|
105
|
+
if (!config.token) {
|
|
106
|
+
consola.error("Not logged in. Run " +
|
|
107
|
+
pc.bold("otter login") +
|
|
92
108
|
" first.");
|
|
93
109
|
process.exitCode = 1;
|
|
94
110
|
return;
|
|
95
111
|
}
|
|
112
|
+
const host = resolveHost({ dev: args.dev });
|
|
113
|
+
const webhookUrl = buildWebhookUrl(host, config.token);
|
|
96
114
|
consola.start("Scanning your Mac environment...\n");
|
|
97
115
|
const collectors = createDefaultCollectors(homedir(), {
|
|
98
116
|
slim: args.slim,
|
|
@@ -104,15 +122,40 @@ const backupCommand = defineCommand({
|
|
|
104
122
|
},
|
|
105
123
|
});
|
|
106
124
|
consola.start("\nUploading snapshot...");
|
|
107
|
-
const uploadResult = await uploadSnapshot(snapshot, {
|
|
108
|
-
webhookUrl: config.webhookUrl,
|
|
109
|
-
});
|
|
125
|
+
const uploadResult = await uploadSnapshot(snapshot, { webhookUrl });
|
|
110
126
|
if (uploadResult.success) {
|
|
111
127
|
consola.success(`Backup uploaded successfully ${pc.dim(`(${uploadResult.durationMs}ms)`)}`);
|
|
112
128
|
// Auto-save locally after successful upload
|
|
113
129
|
const filename = await snapshotStore.save(snapshot);
|
|
114
130
|
consola.success(`Snapshot saved locally: ${pc.dim(filename)}`);
|
|
115
131
|
consola.info(`Snapshot ID: ${pc.dim(snapshot.id)}`);
|
|
132
|
+
// Export and upload app icons via server endpoint
|
|
133
|
+
consola.start("\nExporting app icons...");
|
|
134
|
+
const iconDir = join(otterConfigDir, "icons");
|
|
135
|
+
const iconResults = await exportIcons({ outputDir: iconDir, size: 128 });
|
|
136
|
+
const exported = iconResults.filter((r) => r.success && r.outputPath);
|
|
137
|
+
if (exported.length > 0) {
|
|
138
|
+
consola.success(`Exported ${pc.bold(String(exported.length))} icons`);
|
|
139
|
+
const iconsUrl = `${webhookUrl}/icons`;
|
|
140
|
+
const icons = exported.map((r) => ({
|
|
141
|
+
appName: r.appName,
|
|
142
|
+
pngPath: r.outputPath,
|
|
143
|
+
}));
|
|
144
|
+
consola.start("Uploading icons to server...");
|
|
145
|
+
const iconUpload = await uploadIconsToServer(icons, { iconsUrl });
|
|
146
|
+
if (iconUpload.success) {
|
|
147
|
+
consola.success(`Icons uploaded: ${pc.bold(String(iconUpload.stored))} stored ${pc.dim(`(${iconUpload.durationMs}ms)`)}`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
consola.warn(`Icon upload issue: ${iconUpload.error ?? "partial failure"}` +
|
|
151
|
+
(iconUpload.stored > 0
|
|
152
|
+
? ` (${iconUpload.stored}/${iconUpload.total} stored)`
|
|
153
|
+
: ""));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
consola.info("No app icons found to upload");
|
|
158
|
+
}
|
|
116
159
|
}
|
|
117
160
|
else {
|
|
118
161
|
consola.error(`Upload failed: ${uploadResult.error}`);
|
|
@@ -133,7 +176,7 @@ const configCommand = defineCommand({
|
|
|
133
176
|
},
|
|
134
177
|
key: {
|
|
135
178
|
type: "positional",
|
|
136
|
-
description: "Config key (e.g.,
|
|
179
|
+
description: "Config key (e.g., token)",
|
|
137
180
|
required: false,
|
|
138
181
|
},
|
|
139
182
|
value: {
|
|
@@ -143,6 +186,7 @@ const configCommand = defineCommand({
|
|
|
143
186
|
},
|
|
144
187
|
},
|
|
145
188
|
async run({ args }) {
|
|
189
|
+
const configManager = getConfigManager();
|
|
146
190
|
const action = args.action || "show";
|
|
147
191
|
if (action === "show") {
|
|
148
192
|
const result = await executeConfig(configManager, { action: "show" });
|
|
@@ -282,12 +326,6 @@ const exportIconsCommand = defineCommand({
|
|
|
282
326
|
alias: "s",
|
|
283
327
|
required: false,
|
|
284
328
|
},
|
|
285
|
-
upload: {
|
|
286
|
-
type: "boolean",
|
|
287
|
-
description: "Upload icons to R2 after export",
|
|
288
|
-
alias: "u",
|
|
289
|
-
required: false,
|
|
290
|
-
},
|
|
291
329
|
},
|
|
292
330
|
async run({ args }) {
|
|
293
331
|
const outputDir = args.output || join(homedir(), ".otter", "icons");
|
|
@@ -310,43 +348,6 @@ const exportIconsCommand = defineCommand({
|
|
|
310
348
|
consola.success(`\nExported ${pc.bold(String(succeeded))} icons` +
|
|
311
349
|
(failed > 0 ? ` (${pc.yellow(String(failed))} skipped)` : ""));
|
|
312
350
|
consola.info(`Output: ${pc.dim(outputDir)}`);
|
|
313
|
-
// Upload to R2 if requested
|
|
314
|
-
if (args.upload) {
|
|
315
|
-
const config = await configManager.load();
|
|
316
|
-
const r2Endpoint = config.iconR2Endpoint;
|
|
317
|
-
const r2AccessKeyId = config.iconR2AccessKeyId;
|
|
318
|
-
const r2SecretAccessKey = config.iconR2SecretAccessKey;
|
|
319
|
-
const r2Bucket = config.iconR2Bucket;
|
|
320
|
-
const r2PublicDomain = config.iconR2PublicDomain;
|
|
321
|
-
if (!r2Endpoint || !r2AccessKeyId || !r2SecretAccessKey || !r2Bucket || !r2PublicDomain) {
|
|
322
|
-
consola.error("R2 icon upload config not set. Run:\n" +
|
|
323
|
-
` otter config set iconR2Endpoint <endpoint>\n` +
|
|
324
|
-
` otter config set iconR2AccessKeyId <key>\n` +
|
|
325
|
-
` otter config set iconR2SecretAccessKey <secret>\n` +
|
|
326
|
-
` otter config set iconR2Bucket <bucket>\n` +
|
|
327
|
-
` otter config set iconR2PublicDomain <domain>`);
|
|
328
|
-
process.exit(1);
|
|
329
|
-
}
|
|
330
|
-
const uploadConfig = {
|
|
331
|
-
r2Endpoint,
|
|
332
|
-
r2AccessKeyId,
|
|
333
|
-
r2SecretAccessKey,
|
|
334
|
-
r2Bucket,
|
|
335
|
-
r2PublicDomain,
|
|
336
|
-
};
|
|
337
|
-
const exportedIcons = results
|
|
338
|
-
.filter((r) => r.success && r.outputPath)
|
|
339
|
-
.map((r) => ({ appName: r.appName, pngPath: r.outputPath }));
|
|
340
|
-
consola.start(`\nUploading ${pc.bold(String(exportedIcons.length))} icons to R2...\n`);
|
|
341
|
-
const uploadResults = await uploadIcons(exportedIcons, uploadConfig, (result) => {
|
|
342
|
-
const status = result.uploaded ? pc.green("↑") : pc.dim("=");
|
|
343
|
-
consola.log(` ${status} ${result.appName} ${pc.dim(result.publicUrl)}`);
|
|
344
|
-
});
|
|
345
|
-
const uploaded = uploadResults.filter((r) => r.uploaded).length;
|
|
346
|
-
const skipped = uploadResults.filter((r) => !r.uploaded).length;
|
|
347
|
-
consola.success(`Uploaded ${pc.bold(String(uploaded))} icons` +
|
|
348
|
-
(skipped > 0 ? ` (${pc.dim(String(skipped))} unchanged)` : ""));
|
|
349
|
-
}
|
|
350
351
|
},
|
|
351
352
|
});
|
|
352
353
|
const loginCommand = defineCommand({
|
|
@@ -362,6 +363,7 @@ const loginCommand = defineCommand({
|
|
|
362
363
|
},
|
|
363
364
|
},
|
|
364
365
|
async run({ args }) {
|
|
366
|
+
const configManager = getConfigManager();
|
|
365
367
|
consola.start("Starting login flow...\n");
|
|
366
368
|
const result = await executeLogin(configManager, { dev: args.dev }, {
|
|
367
369
|
onPortReady: (port) => {
|
|
@@ -371,9 +373,9 @@ const loginCommand = defineCommand({
|
|
|
371
373
|
consola.info(`Opening browser: ${pc.dim(url)}`);
|
|
372
374
|
consola.info(pc.dim("Waiting for you to connect in the browser (30s timeout)..."));
|
|
373
375
|
},
|
|
374
|
-
onSuccess: (
|
|
375
|
-
consola.success(`\nConnected!
|
|
376
|
-
consola.info(`
|
|
376
|
+
onSuccess: (token) => {
|
|
377
|
+
consola.success(`\nConnected! Token saved.`);
|
|
378
|
+
consola.info(`Token: ${pc.dim(token.slice(0, 8))}...`);
|
|
377
379
|
consola.info(`\nRun ${pc.bold("otter backup")} to create your first backup.`);
|
|
378
380
|
},
|
|
379
381
|
onError: (error) => {
|
|
@@ -391,7 +393,7 @@ const loginCommand = defineCommand({
|
|
|
391
393
|
export const main = defineCommand({
|
|
392
394
|
meta: {
|
|
393
395
|
name: "otter",
|
|
394
|
-
version: "1.0.
|
|
396
|
+
version: "1.0.3",
|
|
395
397
|
description: "Backup and restore your Mac development environment configuration",
|
|
396
398
|
},
|
|
397
399
|
subCommands: {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { OtterConfig } from "@otter/core";
|
|
2
1
|
import type { ConfigManager } from "../config/manager.js";
|
|
2
|
+
export declare const DEFAULT_HOST = "https://otter.hexly.ai";
|
|
3
|
+
export declare const DEV_HOST = "https://otter.dev.hexly.ai";
|
|
3
4
|
export interface LoginOptions {
|
|
4
5
|
/** Use the dev host instead of production */
|
|
5
6
|
dev?: boolean;
|
|
@@ -8,8 +9,8 @@ export interface LoginResult {
|
|
|
8
9
|
success: boolean;
|
|
9
10
|
/** The host that was used */
|
|
10
11
|
host?: string;
|
|
11
|
-
/** The
|
|
12
|
-
|
|
12
|
+
/** The token obtained from the dashboard */
|
|
13
|
+
token?: string;
|
|
13
14
|
/** Error message if failed */
|
|
14
15
|
error?: string;
|
|
15
16
|
}
|
|
@@ -24,29 +25,33 @@ export declare function checkPortAvailable(port: number): Promise<boolean>;
|
|
|
24
25
|
export declare function findAvailablePort(): Promise<number>;
|
|
25
26
|
/**
|
|
26
27
|
* Parse callback query parameters from the URL.
|
|
27
|
-
* Expected: /callback?token=<uuid
|
|
28
|
+
* Expected: /callback?token=<uuid>
|
|
28
29
|
*/
|
|
29
30
|
export declare function parseCallbackParams(url: string): {
|
|
30
31
|
token: string;
|
|
31
|
-
webhookUrl: string;
|
|
32
32
|
} | {
|
|
33
33
|
error: string;
|
|
34
34
|
};
|
|
35
35
|
/**
|
|
36
|
-
* Determine the host URL based on
|
|
36
|
+
* Determine the host URL based on the --dev flag.
|
|
37
|
+
* No longer reads from config — host is purely determined at runtime.
|
|
37
38
|
*/
|
|
38
|
-
export declare function resolveHost(
|
|
39
|
+
export declare function resolveHost(options: LoginOptions): string;
|
|
40
|
+
/**
|
|
41
|
+
* Build a webhook URL from host and token.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildWebhookUrl(host: string, token: string): string;
|
|
39
44
|
/**
|
|
40
45
|
* Execute the login flow:
|
|
41
46
|
* 1. Start local HTTP server on a random available port
|
|
42
47
|
* 2. Open browser to the connect page
|
|
43
|
-
* 3. Wait for callback with token
|
|
44
|
-
* 4. Save config and close server
|
|
48
|
+
* 3. Wait for callback with token
|
|
49
|
+
* 4. Save token to config and close server
|
|
45
50
|
*/
|
|
46
51
|
export declare function executeLogin(configManager: ConfigManager, options: LoginOptions, callbacks?: {
|
|
47
52
|
onPortReady?: (port: number) => void;
|
|
48
53
|
onBrowserOpen?: (url: string) => void;
|
|
49
|
-
onSuccess?: (
|
|
54
|
+
onSuccess?: (token: string) => void;
|
|
50
55
|
onError?: (error: string) => void;
|
|
51
56
|
onTimeout?: () => void;
|
|
52
57
|
openBrowser?: (url: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,eAAO,MAAM,YAAY,2BAA2B,CAAC;AACrD,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AAKrD,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYjE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAUzD;AASD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAgBvC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE;IACV,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GACA,OAAO,CAAC,WAAW,CAAC,CAkFtB"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
2
|
import { exec } from "node:child_process";
|
|
3
3
|
import { createConnection } from "node:net";
|
|
4
|
-
const DEFAULT_HOST = "https://otter.hexly.ai";
|
|
5
|
-
const DEV_HOST = "https://otter.dev.hexly.ai";
|
|
4
|
+
export const DEFAULT_HOST = "https://otter.hexly.ai";
|
|
5
|
+
export const DEV_HOST = "https://otter.dev.hexly.ai";
|
|
6
6
|
const TIMEOUT_MS = 30_000;
|
|
7
7
|
const PORT_RANGE_START = 49152;
|
|
8
8
|
const PORT_RANGE_END = 65535;
|
|
@@ -44,46 +44,47 @@ function openBrowser(url) {
|
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* Parse callback query parameters from the URL.
|
|
47
|
-
* Expected: /callback?token=<uuid
|
|
47
|
+
* Expected: /callback?token=<uuid>
|
|
48
48
|
*/
|
|
49
49
|
export function parseCallbackParams(url) {
|
|
50
50
|
try {
|
|
51
51
|
const parsed = new URL(url, "http://localhost");
|
|
52
52
|
const token = parsed.searchParams.get("token");
|
|
53
|
-
const webhookUrl = parsed.searchParams.get("webhookUrl");
|
|
54
53
|
const error = parsed.searchParams.get("error");
|
|
55
54
|
if (error) {
|
|
56
55
|
return { error };
|
|
57
56
|
}
|
|
58
|
-
if (!token
|
|
59
|
-
return { error: "Missing token
|
|
57
|
+
if (!token) {
|
|
58
|
+
return { error: "Missing token in callback" };
|
|
60
59
|
}
|
|
61
|
-
return { token
|
|
60
|
+
return { token };
|
|
62
61
|
}
|
|
63
62
|
catch {
|
|
64
63
|
return { error: `Invalid callback URL: ${url}` };
|
|
65
64
|
}
|
|
66
65
|
}
|
|
67
66
|
/**
|
|
68
|
-
* Determine the host URL based on
|
|
67
|
+
* Determine the host URL based on the --dev flag.
|
|
68
|
+
* No longer reads from config — host is purely determined at runtime.
|
|
69
69
|
*/
|
|
70
|
-
export function resolveHost(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
export function resolveHost(options) {
|
|
71
|
+
return options.dev ? DEV_HOST : DEFAULT_HOST;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Build a webhook URL from host and token.
|
|
75
|
+
*/
|
|
76
|
+
export function buildWebhookUrl(host, token) {
|
|
77
|
+
return `${host}/api/webhook/${token}`;
|
|
76
78
|
}
|
|
77
79
|
/**
|
|
78
80
|
* Execute the login flow:
|
|
79
81
|
* 1. Start local HTTP server on a random available port
|
|
80
82
|
* 2. Open browser to the connect page
|
|
81
|
-
* 3. Wait for callback with token
|
|
82
|
-
* 4. Save config and close server
|
|
83
|
+
* 3. Wait for callback with token
|
|
84
|
+
* 4. Save token to config and close server
|
|
83
85
|
*/
|
|
84
86
|
export async function executeLogin(configManager, options, callbacks) {
|
|
85
|
-
const
|
|
86
|
-
const host = resolveHost(config, options);
|
|
87
|
+
const host = resolveHost(options);
|
|
87
88
|
const port = await findAvailablePort();
|
|
88
89
|
const callbackBase = `http://localhost:${port}`;
|
|
89
90
|
callbacks?.onPortReady?.(port);
|
|
@@ -110,22 +111,21 @@ export async function executeLogin(configManager, options, callbacks) {
|
|
|
110
111
|
}
|
|
111
112
|
return;
|
|
112
113
|
}
|
|
113
|
-
// Save the
|
|
114
|
+
// Save the token to config
|
|
114
115
|
const updatedConfig = await configManager.load();
|
|
115
|
-
updatedConfig.
|
|
116
|
-
updatedConfig.host = host;
|
|
116
|
+
updatedConfig.token = params.token;
|
|
117
117
|
await configManager.save(updatedConfig);
|
|
118
118
|
// Return success page
|
|
119
119
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
120
120
|
res.end(successHtml());
|
|
121
121
|
if (!settled) {
|
|
122
122
|
settled = true;
|
|
123
|
-
callbacks?.onSuccess?.(params.
|
|
123
|
+
callbacks?.onSuccess?.(params.token);
|
|
124
124
|
server.close();
|
|
125
125
|
resolve({
|
|
126
126
|
success: true,
|
|
127
127
|
host,
|
|
128
|
-
|
|
128
|
+
token: params.token,
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/config/manager.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { OtterConfig } from "@otter/core";
|
|
2
2
|
/**
|
|
3
|
-
* Manages the CLI configuration file
|
|
3
|
+
* Manages the CLI configuration file.
|
|
4
|
+
* - Production: ~/.config/otter/config.json
|
|
5
|
+
* - Dev: ~/.config/otter/config.dev.json
|
|
4
6
|
*/
|
|
5
7
|
export declare class ConfigManager {
|
|
6
8
|
readonly configPath: string;
|
|
7
|
-
constructor(configDir: string);
|
|
9
|
+
constructor(configDir: string, dev?: boolean);
|
|
8
10
|
/** Load config from disk. Returns empty config if file doesn't exist or is corrupted. */
|
|
9
11
|
load(): Promise<OtterConfig>;
|
|
10
12
|
/** Save config to disk, creating the directory if needed. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C;;;;GAIG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,SAAS,EAAE,MAAM,EAAE,GAAG,UAAQ;IAK1C,yFAAyF;IACnF,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IASlC,6DAA6D;IACvD,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK/C"}
|
package/dist/config/manager.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
2
|
import { join, dirname } from "node:path";
|
|
3
|
+
const PROD_CONFIG = "config.json";
|
|
4
|
+
const DEV_CONFIG = "config.dev.json";
|
|
3
5
|
/**
|
|
4
|
-
* Manages the CLI configuration file
|
|
6
|
+
* Manages the CLI configuration file.
|
|
7
|
+
* - Production: ~/.config/otter/config.json
|
|
8
|
+
* - Dev: ~/.config/otter/config.dev.json
|
|
5
9
|
*/
|
|
6
10
|
export class ConfigManager {
|
|
7
11
|
configPath;
|
|
8
|
-
constructor(configDir) {
|
|
9
|
-
|
|
12
|
+
constructor(configDir, dev = false) {
|
|
13
|
+
const filename = dev ? DEV_CONFIG : PROD_CONFIG;
|
|
14
|
+
this.configPath = join(configDir, filename);
|
|
10
15
|
}
|
|
11
16
|
/** Load config from disk. Returns empty config if file doesn't exist or is corrupted. */
|
|
12
17
|
async load() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACf,UAAU,CAAS;IAE5B,YAAY,SAAiB,EAAE,GAAG,GAAG,KAAK;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Configuration for server-side icon upload */
|
|
2
|
+
export interface IconUploadConfig {
|
|
3
|
+
/** Full URL to the icon upload endpoint, e.g. https://otter.hexly.ai/api/webhook/{token}/icons */
|
|
4
|
+
iconsUrl: string;
|
|
5
|
+
/** Optional timeout in milliseconds (default: 60000) */
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Result of an icon upload batch */
|
|
9
|
+
export interface IconUploadResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
/** Number of icons stored by server */
|
|
12
|
+
stored: number;
|
|
13
|
+
/** Total icons sent */
|
|
14
|
+
total: number;
|
|
15
|
+
/** Duration in milliseconds */
|
|
16
|
+
durationMs: number;
|
|
17
|
+
/** Error message if failed */
|
|
18
|
+
error?: string;
|
|
19
|
+
/** Hashes of icons that failed server-side */
|
|
20
|
+
errors?: string[];
|
|
21
|
+
}
|
|
22
|
+
/** A single icon to upload */
|
|
23
|
+
export interface IconEntry {
|
|
24
|
+
appName: string;
|
|
25
|
+
pngPath: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generate a deterministic hash from an app name.
|
|
29
|
+
* Returns the first 12 hex chars of SHA-256(appName).
|
|
30
|
+
*/
|
|
31
|
+
export declare function hashAppName(appName: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Upload app icons to the server endpoint.
|
|
34
|
+
* Reads each PNG file, base64-encodes it, and POSTs
|
|
35
|
+
* the batch to /api/webhook/[token]/icons.
|
|
36
|
+
*/
|
|
37
|
+
export declare function uploadIconsToServer(icons: IconEntry[], config: IconUploadConfig): Promise<IconUploadResult>;
|
|
38
|
+
//# sourceMappingURL=icons-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-server.d.ts","sourceRoot":"","sources":["../../src/uploader/icons-server.ts"],"names":[],"mappings":"AAGA,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAsE3B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
4
|
+
/**
|
|
5
|
+
* Generate a deterministic hash from an app name.
|
|
6
|
+
* Returns the first 12 hex chars of SHA-256(appName).
|
|
7
|
+
*/
|
|
8
|
+
export function hashAppName(appName) {
|
|
9
|
+
return createHash("sha256").update(appName).digest("hex").slice(0, 12);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Upload app icons to the server endpoint.
|
|
13
|
+
* Reads each PNG file, base64-encodes it, and POSTs
|
|
14
|
+
* the batch to /api/webhook/[token]/icons.
|
|
15
|
+
*/
|
|
16
|
+
export async function uploadIconsToServer(icons, config) {
|
|
17
|
+
if (icons.length === 0) {
|
|
18
|
+
return { success: true, stored: 0, total: 0, durationMs: 0 };
|
|
19
|
+
}
|
|
20
|
+
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
21
|
+
const controller = new AbortController();
|
|
22
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
23
|
+
const start = performance.now();
|
|
24
|
+
try {
|
|
25
|
+
// Read and encode all icons
|
|
26
|
+
const payload = [];
|
|
27
|
+
for (const icon of icons) {
|
|
28
|
+
const buffer = await readFile(icon.pngPath);
|
|
29
|
+
payload.push({
|
|
30
|
+
hash: hashAppName(icon.appName),
|
|
31
|
+
data: buffer.toString("base64"),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const response = await fetch(config.iconsUrl, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: { "Content-Type": "application/json" },
|
|
37
|
+
body: JSON.stringify({ icons: payload }),
|
|
38
|
+
signal: controller.signal,
|
|
39
|
+
});
|
|
40
|
+
const durationMs = Math.round(performance.now() - start);
|
|
41
|
+
const body = (await response.json());
|
|
42
|
+
if (response.ok || response.status === 207) {
|
|
43
|
+
return {
|
|
44
|
+
success: response.ok,
|
|
45
|
+
stored: body.stored ?? 0,
|
|
46
|
+
total: icons.length,
|
|
47
|
+
durationMs,
|
|
48
|
+
...(body.errors ? { errors: body.errors } : {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
stored: 0,
|
|
54
|
+
total: icons.length,
|
|
55
|
+
error: body.error ?? `Server returned ${response.status}`,
|
|
56
|
+
durationMs,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const durationMs = Math.round(performance.now() - start);
|
|
61
|
+
const message = err instanceof DOMException && err.name === "AbortError"
|
|
62
|
+
? `Icon upload timed out after ${timeoutMs}ms`
|
|
63
|
+
: err.message;
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
stored: 0,
|
|
67
|
+
total: icons.length,
|
|
68
|
+
error: message,
|
|
69
|
+
durationMs,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=icons-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-server.js","sourceRoot":"","sources":["../../src/uploader/icons-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocoo/otter",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Backup and restore your Mac development environment configuration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
],
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@aws-sdk/client-s3": "^3.1004.0",
|
|
37
36
|
"citty": "^0.1.0",
|
|
38
37
|
"consola": "^3.4.0",
|
|
39
38
|
"picocolors": "^1.1.0"
|
package/dist/uploader/icons.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/** Configuration for icon uploads to R2 */
|
|
2
|
-
export interface IconUploadConfig {
|
|
3
|
-
r2Endpoint: string;
|
|
4
|
-
r2AccessKeyId: string;
|
|
5
|
-
r2SecretAccessKey: string;
|
|
6
|
-
r2Bucket: string;
|
|
7
|
-
/** Public domain for the R2 bucket (e.g. "https://s.zhe.to") */
|
|
8
|
-
r2PublicDomain: string;
|
|
9
|
-
/** R2 key prefix (default: "apps/otter") */
|
|
10
|
-
prefix?: string;
|
|
11
|
-
}
|
|
12
|
-
/** Result of uploading a single icon */
|
|
13
|
-
export interface IconUploadResult {
|
|
14
|
-
appName: string;
|
|
15
|
-
key: string;
|
|
16
|
-
publicUrl: string;
|
|
17
|
-
/** Whether the file was actually uploaded (false = already existed) */
|
|
18
|
-
uploaded: boolean;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Generate a deterministic hash from an app name.
|
|
22
|
-
* Returns the first 12 hex chars of SHA-256(appName).
|
|
23
|
-
*/
|
|
24
|
-
export declare function hashAppName(appName: string): string;
|
|
25
|
-
/** Reset the cached S3 client (for testing). */
|
|
26
|
-
export declare function resetIconUploadClient(): void;
|
|
27
|
-
/**
|
|
28
|
-
* Upload a single icon PNG to R2.
|
|
29
|
-
* Key format: {prefix}/{hash}.png
|
|
30
|
-
* Skips upload if the object already exists (same app name = same key).
|
|
31
|
-
*/
|
|
32
|
-
export declare function uploadIcon(pngPath: string, appName: string, config: IconUploadConfig): Promise<IconUploadResult>;
|
|
33
|
-
/**
|
|
34
|
-
* Upload multiple icon PNGs to R2 in sequence.
|
|
35
|
-
* Returns results for all successful exports.
|
|
36
|
-
*/
|
|
37
|
-
export declare function uploadIcons(icons: Array<{
|
|
38
|
-
appName: string;
|
|
39
|
-
pngPath: string;
|
|
40
|
-
}>, config: IconUploadConfig, onProgress?: (result: IconUploadResult) => void): Promise<IconUploadResult[]>;
|
|
41
|
-
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/uploader/icons.ts"],"names":[],"mappings":"AAIA,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAiBD,gDAAgD;AAChD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAkBD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA2B3B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,MAAM,EAAE,gBAAgB,EACxB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAC9C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAU7B"}
|
package/dist/uploader/icons.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
-
import { S3Client, PutObjectCommand, HeadObjectCommand } from "@aws-sdk/client-s3";
|
|
4
|
-
/**
|
|
5
|
-
* Generate a deterministic hash from an app name.
|
|
6
|
-
* Returns the first 12 hex chars of SHA-256(appName).
|
|
7
|
-
*/
|
|
8
|
-
export function hashAppName(appName) {
|
|
9
|
-
return createHash("sha256").update(appName).digest("hex").slice(0, 12);
|
|
10
|
-
}
|
|
11
|
-
let _client = null;
|
|
12
|
-
function getClient(config) {
|
|
13
|
-
if (_client)
|
|
14
|
-
return _client;
|
|
15
|
-
_client = new S3Client({
|
|
16
|
-
region: "auto",
|
|
17
|
-
endpoint: config.r2Endpoint,
|
|
18
|
-
credentials: {
|
|
19
|
-
accessKeyId: config.r2AccessKeyId,
|
|
20
|
-
secretAccessKey: config.r2SecretAccessKey,
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
return _client;
|
|
24
|
-
}
|
|
25
|
-
/** Reset the cached S3 client (for testing). */
|
|
26
|
-
export function resetIconUploadClient() {
|
|
27
|
-
_client = null;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Check if an object already exists in R2.
|
|
31
|
-
*/
|
|
32
|
-
async function objectExists(client, bucket, key) {
|
|
33
|
-
try {
|
|
34
|
-
await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Upload a single icon PNG to R2.
|
|
43
|
-
* Key format: {prefix}/{hash}.png
|
|
44
|
-
* Skips upload if the object already exists (same app name = same key).
|
|
45
|
-
*/
|
|
46
|
-
export async function uploadIcon(pngPath, appName, config) {
|
|
47
|
-
const prefix = config.prefix ?? "apps/otter";
|
|
48
|
-
const hash = hashAppName(appName);
|
|
49
|
-
const key = `${prefix}/${hash}.png`;
|
|
50
|
-
const publicUrl = `${config.r2PublicDomain}/${key}`;
|
|
51
|
-
const client = getClient(config);
|
|
52
|
-
// Skip if already uploaded (same app name = same hash = same key)
|
|
53
|
-
const exists = await objectExists(client, config.r2Bucket, key);
|
|
54
|
-
if (exists) {
|
|
55
|
-
return { appName, key, publicUrl, uploaded: false };
|
|
56
|
-
}
|
|
57
|
-
const body = await readFile(pngPath);
|
|
58
|
-
await client.send(new PutObjectCommand({
|
|
59
|
-
Bucket: config.r2Bucket,
|
|
60
|
-
Key: key,
|
|
61
|
-
Body: body,
|
|
62
|
-
ContentType: "image/png",
|
|
63
|
-
CacheControl: "public, max-age=31536000, immutable",
|
|
64
|
-
}));
|
|
65
|
-
return { appName, key, publicUrl, uploaded: true };
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Upload multiple icon PNGs to R2 in sequence.
|
|
69
|
-
* Returns results for all successful exports.
|
|
70
|
-
*/
|
|
71
|
-
export async function uploadIcons(icons, config, onProgress) {
|
|
72
|
-
const results = [];
|
|
73
|
-
for (const { appName, pngPath } of icons) {
|
|
74
|
-
const result = await uploadIcon(pngPath, appName, config);
|
|
75
|
-
results.push(result);
|
|
76
|
-
onProgress?.(result);
|
|
77
|
-
}
|
|
78
|
-
return results;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=icons.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/uploader/icons.ts"],"names":[],"mappings":"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"}
|