flingit 0.0.40 → 0.0.42
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/commands/auth-shared.d.ts +63 -0
- package/dist/cli/commands/auth-shared.d.ts.map +1 -0
- package/dist/cli/commands/auth-shared.js +60 -0
- package/dist/cli/commands/auth-shared.js.map +1 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -1
- package/dist/cli/commands/feedback.js +2 -1
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +13 -10
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/login.d.ts +59 -16
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +191 -58
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/onboard.js +4 -4
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts.map +1 -1
- package/dist/cli/commands/plugin.js +2 -1
- package/dist/cli/commands/plugin.js.map +1 -1
- package/dist/cli/commands/project.d.ts.map +1 -1
- package/dist/cli/commands/project.js +4 -3
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +2 -4
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/signup.d.ts +59 -0
- package/dist/cli/commands/signup.d.ts.map +1 -0
- package/dist/cli/commands/signup.js +140 -0
- package/dist/cli/commands/signup.js.map +1 -0
- package/dist/cli/commands/tunnel.d.ts.map +1 -1
- package/dist/cli/commands/tunnel.js +2 -1
- package/dist/cli/commands/tunnel.js.map +1 -1
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +3 -2
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +2 -1
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/config.d.ts.map +1 -1
- package/dist/cli/utils/config.js +12 -3
- package/dist/cli/utils/config.js.map +1 -1
- package/dist/cli/utils/environment.d.ts.map +1 -1
- package/dist/cli/utils/environment.js +3 -2
- package/dist/cli/utils/environment.js.map +1 -1
- package/dist/cli/utils/retry.d.ts +16 -1
- package/dist/cli/utils/retry.d.ts.map +1 -1
- package/dist/cli/utils/retry.js +62 -3
- package/dist/cli/utils/retry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +5 -4
- package/templates/default/CLAUDE.md +1 -1
- package/templates/default/dot-claude/skills/fling/.hash +1 -1
- package/templates/default/dot-claude/skills/fling/SKILL.md +22 -3
- package/dist/cli/commands/register.d.ts +0 -68
- package/dist/cli/commands/register.d.ts.map +0 -1
- package/dist/cli/commands/register.js +0 -157
- package/dist/cli/commands/register.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AA4BzC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|
|
@@ -16,8 +16,9 @@ function defaultGetTargetEnv(command) {
|
|
|
16
16
|
function defaultRequireProdAuth(env) {
|
|
17
17
|
if (env === "prod" && !isLoggedIn()) {
|
|
18
18
|
console.error("Error: Not logged in - cannot access production environment.\n");
|
|
19
|
-
console.error("To
|
|
20
|
-
console.error(" fling login
|
|
19
|
+
console.error("To authenticate, run:");
|
|
20
|
+
console.error(" fling login Log in with an existing account");
|
|
21
|
+
console.error(" fling signup Create a new account\n");
|
|
21
22
|
console.error("To work with local environment instead, remove the --prod flag.");
|
|
22
23
|
process.exit(1);
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/cli/utils/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,GAAc;IAC5C,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/cli/utils/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,GAAc;IAC5C,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,IAAI,iBAAiB,GAAoC,mBAAmB,CAAC;AAC7E,IAAI,oBAAoB,GAA6B,sBAAsB,CAAC;AAE5E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAc;IAC5C,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAmC;IACjE,iBAAiB,GAAG,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAA4B;IAC7D,oBAAoB,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,iBAAiB,GAAG,mBAAmB,CAAC;IACxC,oBAAoB,GAAG,sBAAsB,CAAC;AAChD,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Retry
|
|
2
|
+
* Retry utilities with exponential backoff.
|
|
3
3
|
*/
|
|
4
4
|
export interface RetryOptions {
|
|
5
5
|
/** Maximum number of attempts (default: 5) */
|
|
@@ -12,6 +12,8 @@ export interface RetryOptions {
|
|
|
12
12
|
label?: string;
|
|
13
13
|
/** Whether to log retry attempts (default: true) */
|
|
14
14
|
verbose?: boolean;
|
|
15
|
+
/** Optional predicate to determine if an error is retryable. If provided and returns false, the error is thrown immediately without retrying. */
|
|
16
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Retry an async operation with exponential backoff.
|
|
@@ -22,4 +24,17 @@ export interface RetryOptions {
|
|
|
22
24
|
* @throws The last error if all attempts fail
|
|
23
25
|
*/
|
|
24
26
|
export declare function withRetry<T>(operation: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
27
|
+
export interface FetchRetryOptions {
|
|
28
|
+
/** Maximum number of attempts (default: 3) */
|
|
29
|
+
maxAttempts?: number;
|
|
30
|
+
/** Initial delay in ms (default: 1000) */
|
|
31
|
+
initialDelayMs?: number;
|
|
32
|
+
/** Called on retry with attempt info. */
|
|
33
|
+
onRetry?: (url: string, attempt: number, maxAttempts: number, reason: string, delayMs: number) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wrap a fetch function with retry logic for transient errors.
|
|
37
|
+
* Retries on network errors (fetch throws) and transient HTTP status codes (502/503/504).
|
|
38
|
+
*/
|
|
39
|
+
export declare function fetchWithRetry(fetchFn: typeof globalThis.fetch, options?: FetchRetryOptions): typeof globalThis.fetch;
|
|
25
40
|
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iJAAiJ;IACjJ,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA2CZ;AAMD,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxG;AAQD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,EAChC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,UAAU,CAAC,KAAK,CAkDzB"}
|
package/dist/cli/utils/retry.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Retry
|
|
2
|
+
* Retry utilities with exponential backoff.
|
|
3
3
|
*/
|
|
4
|
+
/** HTTP status codes that indicate transient server errors worth retrying. */
|
|
5
|
+
const RETRYABLE_STATUS_CODES = new Set([502, 503, 504]);
|
|
4
6
|
/**
|
|
5
7
|
* Retry an async operation with exponential backoff.
|
|
6
8
|
*
|
|
@@ -10,9 +12,11 @@
|
|
|
10
12
|
* @throws The last error if all attempts fail
|
|
11
13
|
*/
|
|
12
14
|
export async function withRetry(operation, options = {}) {
|
|
13
|
-
const { maxAttempts = 5, initialDelayMs = 1000, maxDelayMs = 10000, label = "Operation", verbose = true, } = options;
|
|
15
|
+
const { maxAttempts = 5, initialDelayMs = 1000, maxDelayMs = 10000, label = "Operation", verbose = true, shouldRetry, } = options;
|
|
14
16
|
let lastError;
|
|
17
|
+
let actualAttempts = 0;
|
|
15
18
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
19
|
+
actualAttempts = attempt;
|
|
16
20
|
try {
|
|
17
21
|
return await operation();
|
|
18
22
|
}
|
|
@@ -21,6 +25,10 @@ export async function withRetry(operation, options = {}) {
|
|
|
21
25
|
if (attempt === maxAttempts) {
|
|
22
26
|
break;
|
|
23
27
|
}
|
|
28
|
+
// If shouldRetry is provided and says no, fail immediately
|
|
29
|
+
if (shouldRetry && !shouldRetry(error)) {
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
24
32
|
// Exponential backoff: 1s, 2s, 4s, 8s, ... capped at maxDelayMs
|
|
25
33
|
const delay = Math.min(initialDelayMs * Math.pow(2, attempt - 1), maxDelayMs);
|
|
26
34
|
if (verbose) {
|
|
@@ -29,6 +37,57 @@ export async function withRetry(operation, options = {}) {
|
|
|
29
37
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
30
38
|
}
|
|
31
39
|
}
|
|
32
|
-
throw new Error(`${label} failed after ${
|
|
40
|
+
throw new Error(`${label} failed after ${actualAttempts} attempts: ${lastError?.message}`);
|
|
41
|
+
}
|
|
42
|
+
function extractUrl(input) {
|
|
43
|
+
if (typeof input === "string")
|
|
44
|
+
return input;
|
|
45
|
+
if (input instanceof URL)
|
|
46
|
+
return input.href;
|
|
47
|
+
return input.url;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Wrap a fetch function with retry logic for transient errors.
|
|
51
|
+
* Retries on network errors (fetch throws) and transient HTTP status codes (502/503/504).
|
|
52
|
+
*/
|
|
53
|
+
export function fetchWithRetry(fetchFn, options = {}) {
|
|
54
|
+
const { maxAttempts = 3, initialDelayMs = 1000, onRetry, } = options;
|
|
55
|
+
return async (input, init) => {
|
|
56
|
+
let lastError;
|
|
57
|
+
const url = extractUrl(input);
|
|
58
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetchFn(input, init);
|
|
61
|
+
if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxAttempts) {
|
|
62
|
+
// ReadableStream bodies can only be consumed once — don't retry here,
|
|
63
|
+
// let the caller's outer retry logic recreate the stream.
|
|
64
|
+
if (init?.body instanceof ReadableStream) {
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
67
|
+
const delay = initialDelayMs * Math.pow(2, attempt - 1);
|
|
68
|
+
onRetry?.(url, attempt, maxAttempts, `HTTP ${response.status}`, delay);
|
|
69
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
return response;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
76
|
+
if (attempt === maxAttempts) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
// ReadableStream bodies can only be consumed once — don't retry,
|
|
80
|
+
// let the caller's outer retry logic recreate the stream.
|
|
81
|
+
if (init?.body instanceof ReadableStream) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
const delay = initialDelayMs * Math.pow(2, attempt - 1);
|
|
85
|
+
onRetry?.(url, attempt, maxAttempts, lastError.message, delay);
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// lastError is always set when we reach here (loop ran at least once)
|
|
90
|
+
throw lastError;
|
|
91
|
+
};
|
|
33
92
|
}
|
|
34
93
|
//# sourceMappingURL=retry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/cli/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/cli/utils/retry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flingit",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.42",
|
|
4
|
+
"description": "Small Software Platform - Build and deploy personal tools through conversation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=22.0.0"
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"croner": "^9.1.0",
|
|
77
77
|
"dotenv": "^17.2.3",
|
|
78
78
|
"esbuild": "^0.27.2",
|
|
79
|
-
"hono": "^4.
|
|
79
|
+
"hono": "^4.12.1",
|
|
80
80
|
"postal-mime": "^2.7.3",
|
|
81
81
|
"tsx": "^4.19.0",
|
|
82
82
|
"zod": "^3.25.76"
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
"@eslint/js": "^9.39.2",
|
|
87
87
|
"@types/better-sqlite3": "^7.6.12",
|
|
88
88
|
"@types/node": "^24.10.9",
|
|
89
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
89
90
|
"eslint": "^9.39.2",
|
|
90
91
|
"eslint-plugin-import-x": "^4.16.1",
|
|
91
92
|
"husky": "^9.1.7",
|
|
@@ -96,7 +97,7 @@
|
|
|
96
97
|
},
|
|
97
98
|
"keywords": [
|
|
98
99
|
"fling",
|
|
99
|
-
"
|
|
100
|
+
"small-software",
|
|
100
101
|
"platform",
|
|
101
102
|
"cloudflare",
|
|
102
103
|
"workers"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Fling Project
|
|
2
2
|
|
|
3
|
-
This is a Fling project - a
|
|
3
|
+
This is a Fling project - a Small Software platform for building and deploying personal tools with a React frontend, API backend, SQL database, storage, and more.
|
|
4
4
|
|
|
5
5
|
Read the `fling` skill in detail!
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
a5c510aa9c9c55f3cc1185b32e2f3894
|
|
@@ -5,7 +5,7 @@ description: Building and deploying this app easily to the internet. Use when th
|
|
|
5
5
|
|
|
6
6
|
# Fling
|
|
7
7
|
|
|
8
|
-
You are working on a Fling project - a
|
|
8
|
+
You are working on a Fling project - a Small Software platform for building and deploying personal tools with a React frontend and Hono API backend.
|
|
9
9
|
|
|
10
10
|
## IMPORTANT: Do NOT ask about deployment, hosting, or technology choices!
|
|
11
11
|
|
|
@@ -238,9 +238,27 @@ Slugs must be:
|
|
|
238
238
|
- Lowercase alphanumeric with optional hyphens
|
|
239
239
|
- Globally unique across all Fling projects
|
|
240
240
|
|
|
241
|
+
### Authentication
|
|
242
|
+
|
|
243
|
+
If the user isn't logged in (no token stored), help them authenticate:
|
|
244
|
+
|
|
245
|
+
**New user:** Sign up with email and name:
|
|
246
|
+
```bash
|
|
247
|
+
npm exec fling -- --cli signup --email user@example.com --name "User Name"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Existing user:** Log in via magic link email:
|
|
251
|
+
```bash
|
|
252
|
+
npm exec fling -- --cli login --email user@example.com
|
|
253
|
+
```
|
|
254
|
+
After running login, tell the user to check their email and click the login link.
|
|
255
|
+
The CLI will wait until the link is clicked, then complete login automatically.
|
|
256
|
+
|
|
257
|
+
If the user prefers, they can run `fling signup` or `fling login` interactively themselves.
|
|
258
|
+
|
|
241
259
|
### Email Verification
|
|
242
260
|
|
|
243
|
-
After
|
|
261
|
+
After signing up, you must verify your email to deploy.
|
|
244
262
|
If `fling push` fails with "Email verification required":
|
|
245
263
|
|
|
246
264
|
1. Run `fling verify` to check verification status
|
|
@@ -374,5 +392,6 @@ When the fling CLI mentions that there is a new version available, strongly sugg
|
|
|
374
392
|
|
|
375
393
|
```bash
|
|
376
394
|
npm install flingit@latest
|
|
377
|
-
npm exec upgrade
|
|
395
|
+
npm exec fling upgrade # to upgrade this skill if needed
|
|
396
|
+
|
|
378
397
|
```
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling register - Create a new account using an invite token
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from "commander";
|
|
5
|
-
import type { ConsoleIO, ProcessIO, SimplePromptIO } from "../utils/cli-io.js";
|
|
6
|
-
interface RegisterOptions {
|
|
7
|
-
apiUrl?: string;
|
|
8
|
-
email?: string;
|
|
9
|
-
name?: string;
|
|
10
|
-
}
|
|
11
|
-
interface RegisterResult {
|
|
12
|
-
id?: string;
|
|
13
|
-
name?: string;
|
|
14
|
-
email?: string;
|
|
15
|
-
token?: string;
|
|
16
|
-
project?: {
|
|
17
|
-
slug: string;
|
|
18
|
-
url: string;
|
|
19
|
-
};
|
|
20
|
-
error?: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Combined dependencies for register command.
|
|
24
|
-
*/
|
|
25
|
-
export interface RegisterDeps {
|
|
26
|
-
console: ConsoleIO;
|
|
27
|
-
process: ProcessIO;
|
|
28
|
-
user: SimplePromptIO;
|
|
29
|
-
isLoggedIn: () => boolean;
|
|
30
|
-
getApiUrl: () => string;
|
|
31
|
-
setApiUrl: (url: string) => void;
|
|
32
|
-
setToken: (token: string) => void;
|
|
33
|
-
normalizeInviteToken: (token: string) => string;
|
|
34
|
-
validateEmail: (raw: string) => {
|
|
35
|
-
valid: true;
|
|
36
|
-
email: string;
|
|
37
|
-
} | {
|
|
38
|
-
valid: false;
|
|
39
|
-
error: string;
|
|
40
|
-
};
|
|
41
|
-
registerUser: (apiUrl: string, inviteToken: string, email: string, name: string) => Promise<{
|
|
42
|
-
ok: boolean;
|
|
43
|
-
data: RegisterResult;
|
|
44
|
-
}>;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Register a new user account.
|
|
48
|
-
*
|
|
49
|
-
* @param apiUrl - API base URL
|
|
50
|
-
* @param inviteToken - Invite token with inv_ prefix
|
|
51
|
-
* @param email - User's email address
|
|
52
|
-
* @param name - User's display name
|
|
53
|
-
* @param fetchFn - Optional fetch function for dependency injection (defaults to global fetch)
|
|
54
|
-
*/
|
|
55
|
-
export declare function registerUser(apiUrl: string, inviteToken: string, email: string, name: string, fetchFn?: typeof fetch): Promise<{
|
|
56
|
-
ok: boolean;
|
|
57
|
-
data: RegisterResult;
|
|
58
|
-
}>;
|
|
59
|
-
export declare function createDefaultRegisterDeps(): RegisterDeps;
|
|
60
|
-
export declare const defaultRegisterDeps: RegisterDeps;
|
|
61
|
-
/**
|
|
62
|
-
* Run the register command.
|
|
63
|
-
* Exported for testing with injected dependencies.
|
|
64
|
-
*/
|
|
65
|
-
export declare function runRegister(inviteTokenArg: string | undefined, options: RegisterOptions, deps?: RegisterDeps): Promise<void>;
|
|
66
|
-
export declare const registerCommand: Command;
|
|
67
|
-
export {};
|
|
68
|
-
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAO/E,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjG,YAAY,EAAE,CACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;CACrD;AAMD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,CAYhD;AAMD,wBAAgB,yBAAyB,IAAI,YAAY,CAaxD;AAED,eAAO,MAAM,mBAAmB,cAA8B,CAAC;AAM/D;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,eAAe,EACxB,IAAI,GAAE,YAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CA4Ef;AAMD,eAAO,MAAM,eAAe,SA8BxB,CAAC"}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling register - Create a new account using an invite token
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from "commander";
|
|
5
|
-
import { setToken, isLoggedIn, getApiUrl, setApiUrl } from "../utils/config.js";
|
|
6
|
-
import { normalizeInviteToken } from "../utils/token.js";
|
|
7
|
-
import { validateEmail } from "../utils/email.js";
|
|
8
|
-
import { consoleIO, processIO, createSimplePromptIO } from "../utils/cli-io-impl.js";
|
|
9
|
-
// ═══════════════════════════════════════════════════════
|
|
10
|
-
// CORE FUNCTIONS
|
|
11
|
-
// ═══════════════════════════════════════════════════════
|
|
12
|
-
/**
|
|
13
|
-
* Register a new user account.
|
|
14
|
-
*
|
|
15
|
-
* @param apiUrl - API base URL
|
|
16
|
-
* @param inviteToken - Invite token with inv_ prefix
|
|
17
|
-
* @param email - User's email address
|
|
18
|
-
* @param name - User's display name
|
|
19
|
-
* @param fetchFn - Optional fetch function for dependency injection (defaults to global fetch)
|
|
20
|
-
*/
|
|
21
|
-
export async function registerUser(apiUrl, inviteToken, email, name, fetchFn = fetch) {
|
|
22
|
-
const response = await fetchFn(`${apiUrl}/me`, {
|
|
23
|
-
method: "POST",
|
|
24
|
-
headers: {
|
|
25
|
-
"Authorization": `Bearer ${inviteToken}`,
|
|
26
|
-
"Content-Type": "application/json",
|
|
27
|
-
},
|
|
28
|
-
body: JSON.stringify({ email, name }),
|
|
29
|
-
});
|
|
30
|
-
const data = (await response.json());
|
|
31
|
-
return { ok: response.ok, data };
|
|
32
|
-
}
|
|
33
|
-
// ═══════════════════════════════════════════════════════
|
|
34
|
-
// DEFAULT IMPLEMENTATIONS
|
|
35
|
-
// ═══════════════════════════════════════════════════════
|
|
36
|
-
export function createDefaultRegisterDeps() {
|
|
37
|
-
return {
|
|
38
|
-
console: consoleIO,
|
|
39
|
-
process: processIO,
|
|
40
|
-
user: createSimplePromptIO(processIO),
|
|
41
|
-
isLoggedIn,
|
|
42
|
-
getApiUrl,
|
|
43
|
-
setApiUrl,
|
|
44
|
-
setToken,
|
|
45
|
-
normalizeInviteToken,
|
|
46
|
-
validateEmail,
|
|
47
|
-
registerUser,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
export const defaultRegisterDeps = createDefaultRegisterDeps();
|
|
51
|
-
// ═══════════════════════════════════════════════════════
|
|
52
|
-
// RUN FUNCTION (with DI)
|
|
53
|
-
// ═══════════════════════════════════════════════════════
|
|
54
|
-
/**
|
|
55
|
-
* Run the register command.
|
|
56
|
-
* Exported for testing with injected dependencies.
|
|
57
|
-
*/
|
|
58
|
-
export async function runRegister(inviteTokenArg, options, deps = defaultRegisterDeps) {
|
|
59
|
-
// Check if already logged in
|
|
60
|
-
if (deps.isLoggedIn()) {
|
|
61
|
-
deps.console.error("Already logged in. Use 'fling logout' first.");
|
|
62
|
-
deps.process.exit(1);
|
|
63
|
-
}
|
|
64
|
-
// Set API URL if provided
|
|
65
|
-
if (options.apiUrl) {
|
|
66
|
-
deps.setApiUrl(options.apiUrl);
|
|
67
|
-
}
|
|
68
|
-
// Get invite token
|
|
69
|
-
const inviteToken = inviteTokenArg ?? (await deps.user.prompt("Invite token: "));
|
|
70
|
-
if (!inviteToken) {
|
|
71
|
-
deps.console.error("Invite token is required.");
|
|
72
|
-
deps.process.exit(1);
|
|
73
|
-
}
|
|
74
|
-
// Normalize token format - auto-prepend inv_ if missing
|
|
75
|
-
const normalizedToken = deps.normalizeInviteToken(inviteToken);
|
|
76
|
-
// Get user details (from options or interactive prompt)
|
|
77
|
-
const rawEmail = options.email ?? (await deps.user.prompt("Email: "));
|
|
78
|
-
const emailResult = deps.validateEmail(rawEmail);
|
|
79
|
-
if (!emailResult.valid) {
|
|
80
|
-
deps.console.error(emailResult.error);
|
|
81
|
-
deps.process.exit(1);
|
|
82
|
-
}
|
|
83
|
-
const email = emailResult.email;
|
|
84
|
-
const name = options.name ?? (await deps.user.prompt("Name: "));
|
|
85
|
-
if (!name) {
|
|
86
|
-
deps.console.error("Name is required.");
|
|
87
|
-
deps.process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
// Register via API (slug is auto-generated by the server)
|
|
90
|
-
deps.console.log("\nRegistering...");
|
|
91
|
-
try {
|
|
92
|
-
const { ok, data } = await deps.registerUser(deps.getApiUrl(), normalizedToken, email, name);
|
|
93
|
-
if (!ok) {
|
|
94
|
-
deps.console.error(`Registration failed: ${data.error ?? "Unknown error"}`);
|
|
95
|
-
deps.process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
if (!data.token) {
|
|
98
|
-
deps.console.error("Registration failed: No token returned");
|
|
99
|
-
deps.process.exit(1);
|
|
100
|
-
}
|
|
101
|
-
// Store the user token
|
|
102
|
-
deps.setToken(data.token);
|
|
103
|
-
// Welcome message
|
|
104
|
-
deps.console.log(`\nWelcome to Fling, ${data.name}!`);
|
|
105
|
-
deps.console.log(`Email: ${data.email}`);
|
|
106
|
-
if (data.project) {
|
|
107
|
-
deps.console.log(`Project: ${data.project.slug}`);
|
|
108
|
-
deps.console.log(`URL: ${data.project.url}`);
|
|
109
|
-
}
|
|
110
|
-
deps.console.log("");
|
|
111
|
-
deps.console.log(`A verification email has been sent to ${data.email}.`);
|
|
112
|
-
deps.console.log(`Please click the link to verify your account within 24 hours.`);
|
|
113
|
-
deps.console.log(`\nRun 'fling init' to create your first app.`);
|
|
114
|
-
if (data.project) {
|
|
115
|
-
deps.console.log(`\nTip: To customize your URL, run: fling project slug:set my-custom-slug`);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
deps.console.error(`Registration failed: ${error instanceof Error ? error.message : "Network error"}`);
|
|
120
|
-
deps.process.exit(1);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// ═══════════════════════════════════════════════════════
|
|
124
|
-
// COMMAND
|
|
125
|
-
// ═══════════════════════════════════════════════════════
|
|
126
|
-
export const registerCommand = new Command("register")
|
|
127
|
-
.description("Create a new Fling account using an invite token")
|
|
128
|
-
.argument("[invite-token]", "Invite token (inv_ prefix optional, will prompt if not provided)")
|
|
129
|
-
.option("--api-url <url>", "Override API endpoint (internal/testing use only)")
|
|
130
|
-
.option("--email <email>", "Email address (for CI/scripts, skips prompt)")
|
|
131
|
-
.option("--name <name>", "Display name (for CI/scripts, skips prompt)")
|
|
132
|
-
.addHelpText("after", `
|
|
133
|
-
Getting an invite token:
|
|
134
|
-
Invite tokens are distributed by Fling administrators.
|
|
135
|
-
The 'inv_' prefix is optional - you can enter just the token value.
|
|
136
|
-
|
|
137
|
-
What it does:
|
|
138
|
-
- Creates a new Fling account with your email and name
|
|
139
|
-
- Creates your first project with an auto-generated slug (e.g. proj-abc123)
|
|
140
|
-
- Logs you in automatically (stores token in ~/.config/fling/token)
|
|
141
|
-
|
|
142
|
-
Non-interactive mode (for CI/scripts):
|
|
143
|
-
Provide --email and --name to skip all prompts.
|
|
144
|
-
|
|
145
|
-
Customizing your project URL:
|
|
146
|
-
Your project gets an auto-generated slug like proj-abc123.
|
|
147
|
-
To change it after registration: fling project slug:set my-custom-slug
|
|
148
|
-
|
|
149
|
-
Examples:
|
|
150
|
-
fling register Interactive registration
|
|
151
|
-
fling register xyz789... Provide invite token (inv_ prefix optional)
|
|
152
|
-
fling register xyz789... --email me@example.com --name "My Name"
|
|
153
|
-
`)
|
|
154
|
-
.action(async (inviteTokenArg, options) => {
|
|
155
|
-
await runRegister(inviteTokenArg, options);
|
|
156
|
-
});
|
|
157
|
-
//# sourceMappingURL=register.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/cli/commands/register.ts"],"names":[],"mappings":"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"}
|