flingit 0.0.12 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/cli/commands/db.d.ts +11 -0
- package/dist/cli/commands/db.d.ts.map +1 -1
- package/dist/cli/commands/db.js +60 -48
- package/dist/cli/commands/db.js.map +1 -1
- package/dist/cli/commands/dev.d.ts +9 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +96 -100
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/feedback.d.ts +23 -0
- package/dist/cli/commands/feedback.d.ts.map +1 -1
- package/dist/cli/commands/feedback.js +60 -73
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +96 -107
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/launch.d.ts +11 -1
- package/dist/cli/commands/launch.d.ts.map +1 -1
- package/dist/cli/commands/launch.js +32 -36
- package/dist/cli/commands/launch.js.map +1 -1
- package/dist/cli/commands/login.d.ts +30 -0
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +71 -58
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.js +1 -1
- package/dist/cli/commands/logs.d.ts +39 -0
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +121 -90
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/onboard.d.ts +1 -1
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/onboard.js +97 -42
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts +43 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -1
- package/dist/cli/commands/plugin.js +229 -211
- package/dist/cli/commands/plugin.js.map +1 -1
- package/dist/cli/commands/project.d.ts +27 -0
- package/dist/cli/commands/project.d.ts.map +1 -1
- package/dist/cli/commands/project.js +101 -85
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/push.d.ts +39 -0
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +152 -118
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/register.js +1 -1
- package/dist/cli/commands/storage.d.ts +32 -0
- package/dist/cli/commands/storage.d.ts.map +1 -1
- package/dist/cli/commands/storage.js +180 -140
- package/dist/cli/commands/storage.js.map +1 -1
- package/dist/cli/commands/tunnel.d.ts +41 -0
- package/dist/cli/commands/tunnel.d.ts.map +1 -0
- package/dist/cli/commands/tunnel.js +210 -0
- package/dist/cli/commands/tunnel.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +15 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +82 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/index.js +35 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/cli-io-impl.d.ts +64 -0
- package/dist/cli/utils/cli-io-impl.d.ts.map +1 -0
- package/dist/cli/utils/cli-io-impl.js +521 -0
- package/dist/cli/utils/cli-io-impl.js.map +1 -0
- package/dist/cli/utils/cli-io.d.ts +350 -0
- package/dist/cli/utils/cli-io.d.ts.map +1 -0
- package/dist/cli/utils/cli-io.js +13 -0
- package/dist/cli/utils/cli-io.js.map +1 -0
- package/dist/cli/utils/config.d.ts +60 -2
- package/dist/cli/utils/config.d.ts.map +1 -1
- package/dist/cli/utils/config.js +158 -37
- package/dist/cli/utils/config.js.map +1 -1
- package/dist/cli/utils/project.d.ts +60 -0
- package/dist/cli/utils/project.d.ts.map +1 -1
- package/dist/cli/utils/project.js +112 -2
- package/dist/cli/utils/project.js.map +1 -1
- package/dist/cli/utils/prompt-new-project.d.ts +1 -1
- package/dist/cli/utils/prompt-new-project.d.ts.map +1 -1
- package/dist/cli/utils/registry.d.ts +2 -2
- package/dist/cli/utils/registry.d.ts.map +1 -1
- package/dist/cli/utils/registry.js +13 -3
- package/dist/cli/utils/registry.js.map +1 -1
- package/dist/runtime/log.d.ts.map +1 -1
- package/dist/runtime/log.js +8 -4
- package/dist/runtime/log.js.map +1 -1
- package/dist/runtime/storage.js +1 -1
- package/dist/runtime/storage.js.map +1 -1
- package/package.json +3 -2
- package/templates/default/CLAUDE.md +1 -0
- package/templates/default/skills/fling/.hash +1 -0
- package/templates/default/skills/fling/SKILL.md +12 -4
- /package/templates/default/skills/{discord/SKILL.md → fling/DISCORD.md} +0 -0
package/dist/cli/commands/dev.js
CHANGED
|
@@ -11,75 +11,41 @@
|
|
|
11
11
|
* catching bundling issues (like WASM) early.
|
|
12
12
|
*/
|
|
13
13
|
import { Command } from "commander";
|
|
14
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
15
14
|
import { join, dirname } from "node:path";
|
|
16
|
-
import { spawn } from "node:child_process";
|
|
17
|
-
import { fileURLToPath } from "node:url";
|
|
18
|
-
import { createRequire } from "node:module";
|
|
19
|
-
import { context } from "esbuild";
|
|
20
|
-
import { hasWorkerEntry, getWorkerEntryPath } from "../utils/project.js";
|
|
21
15
|
import { wasmPlugin } from "../deploy/bundler.js";
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
return join(__dirname, "..", "..", "index.js");
|
|
30
|
-
}
|
|
31
|
-
export const devCommand = new Command("dev")
|
|
32
|
-
.description("Start the local development server")
|
|
33
|
-
.option("-p, --port <port>", "Port to run on", "3210")
|
|
34
|
-
.addHelpText("after", `
|
|
35
|
-
Prerequisites:
|
|
36
|
-
- Must have run 'fling init' first
|
|
37
|
-
- Must have run 'npm install' first
|
|
38
|
-
- Requires src/worker/index.ts
|
|
39
|
-
|
|
40
|
-
What it does:
|
|
41
|
-
- Bundles backend code with esbuild (same as production)
|
|
42
|
-
- Runs database migrations
|
|
43
|
-
- Starts cron jobs (if any are registered)
|
|
44
|
-
- Starts API server at http://localhost:PORT
|
|
45
|
-
- Starts Vite dev server at http://localhost:5173
|
|
46
|
-
- Proxies /api/* requests from Vite to the API server
|
|
47
|
-
- React HMR enabled for frontend development
|
|
48
|
-
- Backend: watches for changes and rebuilds/restarts
|
|
49
|
-
|
|
50
|
-
The servers run until you press Ctrl+C.
|
|
51
|
-
|
|
52
|
-
Examples:
|
|
53
|
-
fling dev Start on default port 3210
|
|
54
|
-
fling dev -p 8080 Start API on port 8080
|
|
55
|
-
`)
|
|
56
|
-
.action(async (options) => {
|
|
57
|
-
const cwd = process.cwd();
|
|
16
|
+
import { createDefaultDevIO } from "../utils/cli-io-impl.js";
|
|
17
|
+
/**
|
|
18
|
+
* Run the dev command logic.
|
|
19
|
+
* Extracted for testability via dependency injection.
|
|
20
|
+
*/
|
|
21
|
+
export async function runDev(options, io) {
|
|
22
|
+
const cwd = io.process.cwd();
|
|
58
23
|
const port = parseInt(options.port, 10);
|
|
59
24
|
// Check if project is initialized
|
|
60
|
-
if (!
|
|
61
|
-
console.error("Error: Not a Fling project. Run 'fling init' first.");
|
|
62
|
-
process.exit(1);
|
|
25
|
+
if (!io.file.exists(join(cwd, ".fling"))) {
|
|
26
|
+
io.console.error("Error: Not a Fling project. Run 'fling init' first.");
|
|
27
|
+
io.process.exit(1);
|
|
63
28
|
}
|
|
64
29
|
// Check for worker entry point
|
|
65
|
-
if (!hasWorkerEntry(cwd)) {
|
|
66
|
-
console.error("Error: src/worker/index.ts not found.\n");
|
|
67
|
-
console.error("This file is your backend API entry point.");
|
|
68
|
-
console.error("Run 'fling init' to create a new project with the correct structure.");
|
|
69
|
-
process.exit(1);
|
|
30
|
+
if (!io.project.hasWorkerEntry(cwd)) {
|
|
31
|
+
io.console.error("Error: src/worker/index.ts not found.\n");
|
|
32
|
+
io.console.error("This file is your backend API entry point.");
|
|
33
|
+
io.console.error("Run 'fling init' to create a new project with the correct structure.");
|
|
34
|
+
io.process.exit(1);
|
|
70
35
|
}
|
|
71
|
-
console.log("Starting Fling development server...\n");
|
|
36
|
+
io.console.log("Starting Fling development server...\n");
|
|
72
37
|
let workerProcess = null;
|
|
73
38
|
let viteProcess = null;
|
|
74
39
|
let buildContext = null;
|
|
75
40
|
let isShuttingDown = false;
|
|
76
41
|
// Create temp directory for bundled output and entry file
|
|
77
42
|
const tempDir = join(cwd, ".fling", ".dev-bundle");
|
|
78
|
-
|
|
43
|
+
io.file.mkdir(tempDir, { recursive: true });
|
|
79
44
|
const bundlePath = join(tempDir, "worker.mjs");
|
|
80
45
|
const entryPath = join(tempDir, "entry.ts");
|
|
81
|
-
const nodeRuntimePath =
|
|
82
|
-
const
|
|
46
|
+
const nodeRuntimePath = io.paths.nodeRuntimePath;
|
|
47
|
+
const honoNodeServerPath = io.paths.honoNodeServerPath;
|
|
48
|
+
const appPath = io.project.getWorkerEntryPath(cwd);
|
|
83
49
|
// Create the dev entry code - similar to production but for Node.js
|
|
84
50
|
// Use absolute paths for Fling's dependencies (marked external below)
|
|
85
51
|
const runtimeDir = dirname(nodeRuntimePath);
|
|
@@ -125,32 +91,32 @@ serve({
|
|
|
125
91
|
});
|
|
126
92
|
`;
|
|
127
93
|
// Write entry file (using a file instead of stdin enables proper watch mode)
|
|
128
|
-
|
|
94
|
+
io.file.writeFileString(entryPath, entryCode);
|
|
129
95
|
// Function to spawn the bundled worker
|
|
130
96
|
function spawnWorker() {
|
|
131
|
-
const worker = spawn(process.execPath, [bundlePath], {
|
|
97
|
+
const worker = io.spawn(io.process.execPath, [bundlePath], {
|
|
132
98
|
cwd,
|
|
133
99
|
stdio: ["inherit", "pipe", "pipe"],
|
|
134
100
|
env: {
|
|
135
|
-
...process.env,
|
|
101
|
+
...io.process.env,
|
|
136
102
|
PROJECT_DIR: cwd,
|
|
137
103
|
FORCE_COLOR: "1",
|
|
138
104
|
},
|
|
139
105
|
});
|
|
140
|
-
worker.stdout
|
|
106
|
+
worker.stdout?.on("data", (data) => {
|
|
141
107
|
const lines = data.toString().split("\n").filter(Boolean);
|
|
142
108
|
for (const line of lines) {
|
|
143
|
-
console.log(line);
|
|
109
|
+
io.console.log(line);
|
|
144
110
|
}
|
|
145
111
|
});
|
|
146
|
-
worker.stderr
|
|
112
|
+
worker.stderr?.on("data", (data) => {
|
|
147
113
|
const lines = data.toString().split("\n").filter(Boolean);
|
|
148
114
|
for (const line of lines) {
|
|
149
|
-
console.error(line);
|
|
115
|
+
io.console.error(line);
|
|
150
116
|
}
|
|
151
117
|
});
|
|
152
118
|
worker.on("error", (error) => {
|
|
153
|
-
console.error("\nError: Could not start backend worker:"
|
|
119
|
+
io.console.error("\nError: Could not start backend worker:" + error.message);
|
|
154
120
|
});
|
|
155
121
|
worker.on("close", (code) => {
|
|
156
122
|
// Only clear workerProcess if this is still the current worker
|
|
@@ -159,14 +125,14 @@ serve({
|
|
|
159
125
|
workerProcess = null;
|
|
160
126
|
}
|
|
161
127
|
if (!isShuttingDown && code !== 0 && code !== null) {
|
|
162
|
-
console.error(`\n[worker] Backend server exited with code ${code}`);
|
|
128
|
+
io.console.error(`\n[worker] Backend server exited with code ${code}`);
|
|
163
129
|
}
|
|
164
130
|
});
|
|
165
131
|
return worker;
|
|
166
132
|
}
|
|
167
133
|
// Function to rebuild and restart the worker
|
|
168
134
|
async function rebuildAndRestart() {
|
|
169
|
-
console.log("[worker] Rebuilding...");
|
|
135
|
+
io.console.log("[worker] Rebuilding...");
|
|
170
136
|
// Kill existing worker and wait for it to exit
|
|
171
137
|
if (workerProcess && !workerProcess.killed) {
|
|
172
138
|
const oldProcess = workerProcess;
|
|
@@ -182,16 +148,17 @@ serve({
|
|
|
182
148
|
await buildContext.rebuild();
|
|
183
149
|
}
|
|
184
150
|
// Start new worker
|
|
185
|
-
console.log("[worker] Starting...");
|
|
151
|
+
io.console.log("[worker] Starting...");
|
|
186
152
|
workerProcess = spawnWorker();
|
|
187
153
|
}
|
|
188
154
|
catch (error) {
|
|
189
|
-
console.error("[worker] Build failed:"
|
|
155
|
+
io.console.error("[worker] Build failed:" +
|
|
156
|
+
(error instanceof Error ? error.message : String(error)));
|
|
190
157
|
}
|
|
191
158
|
}
|
|
192
159
|
// Create esbuild context with watch mode
|
|
193
160
|
try {
|
|
194
|
-
buildContext = await context({
|
|
161
|
+
buildContext = await io.esbuild.context({
|
|
195
162
|
entryPoints: [entryPath],
|
|
196
163
|
outfile: bundlePath,
|
|
197
164
|
bundle: true,
|
|
@@ -224,9 +191,9 @@ serve({
|
|
|
224
191
|
let buildCount = 0;
|
|
225
192
|
build.onEnd((result) => {
|
|
226
193
|
buildCount++;
|
|
227
|
-
console.log(`[worker] Build #${buildCount} completed`);
|
|
194
|
+
io.console.log(`[worker] Build #${buildCount} completed`);
|
|
228
195
|
if (result.errors.length > 0) {
|
|
229
|
-
console.error("[worker] Build errors:"
|
|
196
|
+
io.console.error("[worker] Build errors:" + JSON.stringify(result.errors));
|
|
230
197
|
return;
|
|
231
198
|
}
|
|
232
199
|
// Skip restart on initial build (worker started separately below)
|
|
@@ -234,7 +201,7 @@ serve({
|
|
|
234
201
|
return;
|
|
235
202
|
}
|
|
236
203
|
// Restart worker with new code
|
|
237
|
-
console.log("[worker] Files changed, restarting...");
|
|
204
|
+
io.console.log("[worker] Files changed, restarting...");
|
|
238
205
|
if (workerProcess && !workerProcess.killed) {
|
|
239
206
|
const oldProcess = workerProcess;
|
|
240
207
|
workerProcess = null;
|
|
@@ -253,54 +220,55 @@ serve({
|
|
|
253
220
|
],
|
|
254
221
|
});
|
|
255
222
|
// Initial build
|
|
256
|
-
console.log("[worker] Initial build...");
|
|
223
|
+
io.console.log("[worker] Initial build...");
|
|
257
224
|
await buildContext.rebuild();
|
|
258
225
|
// Start watching for file changes
|
|
259
|
-
console.log("[worker] Starting file watcher...");
|
|
226
|
+
io.console.log("[worker] Starting file watcher...");
|
|
260
227
|
await buildContext.watch();
|
|
261
|
-
console.log("[worker] File watcher active");
|
|
228
|
+
io.console.log("[worker] File watcher active");
|
|
262
229
|
// Start the worker
|
|
263
|
-
console.log("[worker] Starting...");
|
|
230
|
+
io.console.log("[worker] Starting...");
|
|
264
231
|
workerProcess = spawnWorker();
|
|
265
232
|
}
|
|
266
233
|
catch (error) {
|
|
267
|
-
console.error("Failed to setup build:"
|
|
268
|
-
|
|
234
|
+
io.console.error("Failed to setup build:" +
|
|
235
|
+
(error instanceof Error ? error.message : String(error)));
|
|
236
|
+
io.process.exit(1);
|
|
269
237
|
}
|
|
270
238
|
// Function to spawn Vite dev server
|
|
271
239
|
function spawnViteDevServer() {
|
|
272
|
-
const vite = spawn("npm", ["exec", "vite"], {
|
|
240
|
+
const vite = io.spawn("npm", ["exec", "vite"], {
|
|
273
241
|
cwd,
|
|
274
242
|
stdio: ["ignore", "pipe", "pipe"],
|
|
275
|
-
env: { ...process.env, FORCE_COLOR: "1" },
|
|
243
|
+
env: { ...io.process.env, FORCE_COLOR: "1" },
|
|
276
244
|
});
|
|
277
|
-
vite.stdout
|
|
245
|
+
vite.stdout?.on("data", (data) => {
|
|
278
246
|
const lines = data.toString().split("\n").filter(Boolean);
|
|
279
247
|
for (const line of lines) {
|
|
280
|
-
console.log(`[vite] ${line}`);
|
|
248
|
+
io.console.log(`[vite] ${line}`);
|
|
281
249
|
}
|
|
282
250
|
});
|
|
283
|
-
vite.stderr
|
|
251
|
+
vite.stderr?.on("data", (data) => {
|
|
284
252
|
const lines = data.toString().split("\n").filter(Boolean);
|
|
285
253
|
for (const line of lines) {
|
|
286
|
-
console.error(`[vite] ${line}`);
|
|
254
|
+
io.console.error(`[vite] ${line}`);
|
|
287
255
|
}
|
|
288
256
|
});
|
|
289
257
|
vite.on("error", (error) => {
|
|
290
258
|
if (error.code === "ENOENT") {
|
|
291
|
-
console.error("\nError: Could not start Vite dev server.\n");
|
|
292
|
-
console.error("npm is not found in PATH. Ensure Node.js is properly installed.");
|
|
259
|
+
io.console.error("\nError: Could not start Vite dev server.\n");
|
|
260
|
+
io.console.error("npm is not found in PATH. Ensure Node.js is properly installed.");
|
|
293
261
|
}
|
|
294
262
|
else {
|
|
295
|
-
console.error("\nError starting Vite dev server:"
|
|
263
|
+
io.console.error("\nError starting Vite dev server:" + error.message);
|
|
296
264
|
}
|
|
297
|
-
console.error(`\nThe API server is still running at http://localhost:${port}`);
|
|
298
|
-
console.error("To fix Vite, ensure dependencies are installed: npm install");
|
|
265
|
+
io.console.error(`\nThe API server is still running at http://localhost:${port}`);
|
|
266
|
+
io.console.error("To fix Vite, ensure dependencies are installed: npm install");
|
|
299
267
|
});
|
|
300
268
|
vite.on("close", (code) => {
|
|
301
269
|
if (!isShuttingDown && code !== 0 && code !== null) {
|
|
302
|
-
console.error(`\n[vite] Process exited with code ${code}`);
|
|
303
|
-
console.error("[vite] Check if vite is installed: npm install");
|
|
270
|
+
io.console.error(`\n[vite] Process exited with code ${code}`);
|
|
271
|
+
io.console.error("[vite] Check if vite is installed: npm install");
|
|
304
272
|
}
|
|
305
273
|
viteProcess = null;
|
|
306
274
|
});
|
|
@@ -311,7 +279,7 @@ serve({
|
|
|
311
279
|
if (isShuttingDown)
|
|
312
280
|
return;
|
|
313
281
|
isShuttingDown = true;
|
|
314
|
-
console.log("\nShutting down...");
|
|
282
|
+
io.console.log("\nShutting down...");
|
|
315
283
|
// buildContext is guaranteed to be set before shutdown can be called
|
|
316
284
|
await buildContext.dispose();
|
|
317
285
|
if (workerProcess && !workerProcess.killed) {
|
|
@@ -322,21 +290,21 @@ serve({
|
|
|
322
290
|
}
|
|
323
291
|
// Give processes time to clean up, then force exit
|
|
324
292
|
setTimeout(() => {
|
|
325
|
-
process.exit(0);
|
|
293
|
+
io.process.exit(0);
|
|
326
294
|
}, 2000);
|
|
327
295
|
};
|
|
328
|
-
process.on("SIGINT", () => void shutdown());
|
|
329
|
-
process.on("SIGTERM", () => void shutdown());
|
|
296
|
+
io.process.on("SIGINT", () => void shutdown());
|
|
297
|
+
io.process.on("SIGTERM", () => void shutdown());
|
|
330
298
|
// Start Vite
|
|
331
299
|
viteProcess = spawnViteDevServer();
|
|
332
|
-
console.log(`\nFrontend: http://localhost:5173`);
|
|
333
|
-
console.log(`API proxy: /api/* -> http://localhost:${port}`);
|
|
334
|
-
console.log("\nPress Ctrl+C to stop\n");
|
|
300
|
+
io.console.log(`\nFrontend: http://localhost:5173`);
|
|
301
|
+
io.console.log(`API proxy: /api/* -> http://localhost:${port}`);
|
|
302
|
+
io.console.log("\nPress Ctrl+C to stop\n");
|
|
335
303
|
// Handle stdin for manual restart
|
|
336
|
-
if (process.stdin.isTTY) {
|
|
337
|
-
process.stdin.setRawMode(true);
|
|
338
|
-
process.stdin.resume();
|
|
339
|
-
process.stdin.on("data", (key) => {
|
|
304
|
+
if (io.process.stdin.isTTY) {
|
|
305
|
+
io.process.stdin.setRawMode(true);
|
|
306
|
+
io.process.stdin.resume();
|
|
307
|
+
io.process.stdin.on("data", (key) => {
|
|
340
308
|
// Ctrl+C
|
|
341
309
|
if (key[0] === 3) {
|
|
342
310
|
void shutdown();
|
|
@@ -348,5 +316,33 @@ serve({
|
|
|
348
316
|
}
|
|
349
317
|
});
|
|
350
318
|
}
|
|
319
|
+
}
|
|
320
|
+
export const devCommand = new Command("dev")
|
|
321
|
+
.description("Start the local development server")
|
|
322
|
+
.option("-p, --port <port>", "Port to run on", "3210")
|
|
323
|
+
.addHelpText("after", `
|
|
324
|
+
Prerequisites:
|
|
325
|
+
- Must have run 'fling init' first
|
|
326
|
+
- Must have run 'npm install' first
|
|
327
|
+
- Requires src/worker/index.ts
|
|
328
|
+
|
|
329
|
+
What it does:
|
|
330
|
+
- Bundles backend code with esbuild (same as production)
|
|
331
|
+
- Runs database migrations
|
|
332
|
+
- Starts cron jobs (if any are registered)
|
|
333
|
+
- Starts API server at http://localhost:PORT
|
|
334
|
+
- Starts Vite dev server at http://localhost:5173
|
|
335
|
+
- Proxies /api/* requests from Vite to the API server
|
|
336
|
+
- React HMR enabled for frontend development
|
|
337
|
+
- Backend: watches for changes and rebuilds/restarts
|
|
338
|
+
|
|
339
|
+
The servers run until you press Ctrl+C.
|
|
340
|
+
|
|
341
|
+
Examples:
|
|
342
|
+
fling dev Start on default port 3210
|
|
343
|
+
fling dev -p 8080 Start API on port 8080
|
|
344
|
+
`)
|
|
345
|
+
.action(async (options) => {
|
|
346
|
+
await runDev(options, createDefaultDevIO());
|
|
351
347
|
});
|
|
352
348
|
//# sourceMappingURL=dev.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,28 @@
|
|
|
2
2
|
* fling feedback - Submit feedback to the Fling team
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
+
import { type PlatformFetchFn } from "../utils/config.js";
|
|
6
|
+
import { type ConsoleIO, type ProcessIOWithStdio, type SimplePromptIOWithMultiline } from "../utils/cli-io.js";
|
|
7
|
+
/**
|
|
8
|
+
* Combined dependencies for feedback command.
|
|
9
|
+
*/
|
|
10
|
+
export interface FeedbackDeps {
|
|
11
|
+
console: ConsoleIO;
|
|
12
|
+
process: ProcessIOWithStdio;
|
|
13
|
+
user: SimplePromptIOWithMultiline;
|
|
14
|
+
isLoggedIn: () => boolean;
|
|
15
|
+
platformFetch: PlatformFetchFn;
|
|
16
|
+
findEnclosingProject: (startDir: string) => string | null;
|
|
17
|
+
getProjectName: (cwd?: string) => string;
|
|
18
|
+
}
|
|
19
|
+
export declare function createDefaultFeedbackDeps(): FeedbackDeps;
|
|
20
|
+
export declare const defaultFeedbackDeps: FeedbackDeps;
|
|
21
|
+
/**
|
|
22
|
+
* Run the feedback command.
|
|
23
|
+
* Exported for testing with injected dependencies.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runFeedback(messageArg: string | undefined, options: {
|
|
26
|
+
interactive?: boolean;
|
|
27
|
+
}, deps?: FeedbackDeps): Promise<void>;
|
|
5
28
|
export declare const feedbackCommand: Command;
|
|
6
29
|
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrF,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,kBAAkB,EAAE,KAAK,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAU/G;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,EAAE,2BAA2B,CAAC;IAClC,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,aAAa,EAAE,eAAe,CAAC;IAC/B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1D,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1C;AAMD,wBAAgB,yBAAyB,IAAI,YAAY,CAUxD;AAED,eAAO,MAAM,mBAAmB,cAA8B,CAAC;AAM/D;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EAClC,IAAI,GAAE,YAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CAmEf;AAED,eAAO,MAAM,eAAe,SAkBxB,CAAC"}
|
|
@@ -2,71 +2,39 @@
|
|
|
2
2
|
* fling feedback - Submit feedback to the Fling team
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
-
import { createInterface } from "node:readline";
|
|
6
5
|
import { isLoggedIn, platformFetch } from "../utils/config.js";
|
|
7
6
|
import { findEnclosingProject } from "../utils/project.js";
|
|
8
7
|
import { getProjectName } from "../utils/project-name.js";
|
|
8
|
+
import { consoleIO, processIO, createSimplePromptIOWithMultiline } from "../utils/cli-io-impl.js";
|
|
9
9
|
const MIN_LENGTH = 10;
|
|
10
10
|
const MAX_LENGTH = 5000;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
});
|
|
11
|
+
// ═══════════════════════════════════════════════════════
|
|
12
|
+
// DEFAULT IMPLEMENTATIONS
|
|
13
|
+
// ═══════════════════════════════════════════════════════
|
|
14
|
+
export function createDefaultFeedbackDeps() {
|
|
15
|
+
return {
|
|
16
|
+
console: consoleIO,
|
|
17
|
+
process: processIO,
|
|
18
|
+
user: createSimplePromptIOWithMultiline(consoleIO, processIO),
|
|
19
|
+
isLoggedIn,
|
|
20
|
+
platformFetch,
|
|
21
|
+
findEnclosingProject,
|
|
22
|
+
getProjectName,
|
|
23
|
+
};
|
|
25
24
|
}
|
|
25
|
+
export const defaultFeedbackDeps = createDefaultFeedbackDeps();
|
|
26
|
+
// ═══════════════════════════════════════════════════════
|
|
27
|
+
// CORE FUNCTIONS (with DI)
|
|
28
|
+
// ═══════════════════════════════════════════════════════
|
|
26
29
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
30
|
+
* Run the feedback command.
|
|
31
|
+
* Exported for testing with injected dependencies.
|
|
29
32
|
*/
|
|
30
|
-
async function
|
|
31
|
-
console.log("Enter your feedback (press Ctrl+D when done):");
|
|
32
|
-
console.log("---");
|
|
33
|
-
const rl = createInterface({
|
|
34
|
-
input: process.stdin,
|
|
35
|
-
output: process.stdout,
|
|
36
|
-
terminal: false,
|
|
37
|
-
});
|
|
38
|
-
const lines = [];
|
|
39
|
-
return new Promise((resolve) => {
|
|
40
|
-
rl.on("line", (line) => {
|
|
41
|
-
lines.push(line);
|
|
42
|
-
});
|
|
43
|
-
rl.on("close", () => {
|
|
44
|
-
console.log("---");
|
|
45
|
-
resolve(lines.join("\n"));
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
export const feedbackCommand = new Command("feedback")
|
|
50
|
-
.description("Submit feedback, bug reports, or feature requests to the Fling team")
|
|
51
|
-
.argument("[message]", "Feedback message, 10-5000 chars (will prompt if not provided)")
|
|
52
|
-
.option("-i, --interactive", "Multi-line input mode (end with Ctrl+D)")
|
|
53
|
-
.addHelpText("after", `
|
|
54
|
-
Where feedback goes:
|
|
55
|
-
Feedback is sent directly to the Fling development team for review.
|
|
56
|
-
Include details about bugs, feature requests, or general feedback.
|
|
57
|
-
|
|
58
|
-
Requires login (run 'fling login' first).
|
|
59
|
-
|
|
60
|
-
Examples:
|
|
61
|
-
fling feedback "Love the new logs command!"
|
|
62
|
-
fling feedback "Bug: push fails when bundle > 1MB"
|
|
63
|
-
fling feedback -i Multi-line mode for detailed feedback
|
|
64
|
-
`)
|
|
65
|
-
.action(async (messageArg, options) => {
|
|
33
|
+
export async function runFeedback(messageArg, options, deps = defaultFeedbackDeps) {
|
|
66
34
|
// Check if logged in
|
|
67
|
-
if (!isLoggedIn()) {
|
|
68
|
-
console.error("Not logged in. Run 'fling login' first.");
|
|
69
|
-
process.exit(1);
|
|
35
|
+
if (!deps.isLoggedIn()) {
|
|
36
|
+
deps.console.error("Not logged in. Run 'fling login' first.");
|
|
37
|
+
deps.process.exit(1);
|
|
70
38
|
}
|
|
71
39
|
// Get feedback message
|
|
72
40
|
let message;
|
|
@@ -74,32 +42,32 @@ Examples:
|
|
|
74
42
|
message = messageArg;
|
|
75
43
|
}
|
|
76
44
|
else if (options.interactive) {
|
|
77
|
-
message = await promptMultiline();
|
|
45
|
+
message = await deps.user.promptMultiline();
|
|
78
46
|
}
|
|
79
47
|
else {
|
|
80
|
-
message = await prompt("Feedback: ");
|
|
48
|
+
message = await deps.user.prompt("Feedback: ");
|
|
81
49
|
}
|
|
82
50
|
// Trim and validate
|
|
83
51
|
message = message.trim();
|
|
84
52
|
if (!message) {
|
|
85
|
-
console.error("Feedback message is required.");
|
|
86
|
-
process.exit(1);
|
|
53
|
+
deps.console.error("Feedback message is required.");
|
|
54
|
+
deps.process.exit(1);
|
|
87
55
|
}
|
|
88
56
|
if (message.length < MIN_LENGTH) {
|
|
89
|
-
console.error(`Feedback must be at least ${MIN_LENGTH} characters.`);
|
|
90
|
-
process.exit(1);
|
|
57
|
+
deps.console.error(`Feedback must be at least ${MIN_LENGTH} characters.`);
|
|
58
|
+
deps.process.exit(1);
|
|
91
59
|
}
|
|
92
60
|
if (message.length > MAX_LENGTH) {
|
|
93
|
-
console.error(`Feedback must be less than ${MAX_LENGTH} characters.`);
|
|
94
|
-
process.exit(1);
|
|
61
|
+
deps.console.error(`Feedback must be less than ${MAX_LENGTH} characters.`);
|
|
62
|
+
deps.process.exit(1);
|
|
95
63
|
}
|
|
96
64
|
// Detect if we're in a Fling project and get the project name
|
|
97
|
-
const projectRoot = findEnclosingProject(process.cwd());
|
|
98
|
-
const projectName = projectRoot ? getProjectName(projectRoot) : undefined;
|
|
65
|
+
const projectRoot = deps.findEnclosingProject(deps.process.cwd());
|
|
66
|
+
const projectName = projectRoot ? deps.getProjectName(projectRoot) : undefined;
|
|
99
67
|
// Submit feedback
|
|
100
|
-
console.log("Submitting feedback...");
|
|
68
|
+
deps.console.log("Submitting feedback...");
|
|
101
69
|
try {
|
|
102
|
-
const response = await platformFetch("/feedback", {
|
|
70
|
+
const response = await deps.platformFetch("/feedback", {
|
|
103
71
|
method: "POST",
|
|
104
72
|
headers: {
|
|
105
73
|
"Content-Type": "application/json",
|
|
@@ -108,14 +76,33 @@ Examples:
|
|
|
108
76
|
});
|
|
109
77
|
const data = (await response.json());
|
|
110
78
|
if (!response.ok) {
|
|
111
|
-
console.error(`Failed to submit feedback: ${data.error ?? "Unknown error"}`);
|
|
112
|
-
process.exit(1);
|
|
79
|
+
deps.console.error(`Failed to submit feedback: ${data.error ?? "Unknown error"}`);
|
|
80
|
+
deps.process.exit(1);
|
|
113
81
|
}
|
|
114
|
-
console.log("Thank you! Your feedback has been submitted.");
|
|
82
|
+
deps.console.log("Thank you! Your feedback has been submitted.");
|
|
115
83
|
}
|
|
116
84
|
catch (error) {
|
|
117
|
-
console.error(`Failed to submit feedback: ${error instanceof Error ? error.message : "Network error"}`);
|
|
118
|
-
process.exit(1);
|
|
85
|
+
deps.console.error(`Failed to submit feedback: ${error instanceof Error ? error.message : "Network error"}`);
|
|
86
|
+
deps.process.exit(1);
|
|
119
87
|
}
|
|
88
|
+
}
|
|
89
|
+
export const feedbackCommand = new Command("feedback")
|
|
90
|
+
.description("Submit feedback, bug reports, or feature requests to the Fling team")
|
|
91
|
+
.argument("[message]", "Feedback message, 10-5000 chars (will prompt if not provided)")
|
|
92
|
+
.option("-i, --interactive", "Multi-line input mode (end with Ctrl+D)")
|
|
93
|
+
.addHelpText("after", `
|
|
94
|
+
Where feedback goes:
|
|
95
|
+
Feedback is sent directly to the Fling development team for review.
|
|
96
|
+
Include details about bugs, feature requests, or general feedback.
|
|
97
|
+
|
|
98
|
+
Requires login (run 'fling login' first).
|
|
99
|
+
|
|
100
|
+
Examples:
|
|
101
|
+
fling feedback "Love the new logs command!"
|
|
102
|
+
fling feedback "Bug: push fails when bundle > 1MB"
|
|
103
|
+
fling feedback -i Multi-line mode for detailed feedback
|
|
104
|
+
`)
|
|
105
|
+
.action(async (messageArg, options) => {
|
|
106
|
+
await runFeedback(messageArg, options);
|
|
120
107
|
});
|
|
121
108
|
//# sourceMappingURL=feedback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/cli/commands/feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAElG,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,IAAI,CAAC;AAmBxB,0DAA0D;AAC1D,0BAA0B;AAC1B,0DAA0D;AAE1D,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,iCAAiC,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7D,UAAU;QACV,aAAa;QACb,oBAAoB;QACpB,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,EAAE,CAAC;AAE/D,0DAA0D;AAC1D,2BAA2B;AAC3B,0DAA0D;AAE1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAA8B,EAC9B,OAAkC,EAClC,OAAqB,mBAAmB;IAExC,qBAAqB;IACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAe,CAAC;IACpB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,oBAAoB;IACpB,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,cAAc,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,UAAU,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/E,kBAAkB;IAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACzF,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,qEAAqE,CAAC;KAClF,QAAQ,CAAC,WAAW,EAAE,+DAA+D,CAAC;KACtF,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KACtE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;CAWvB,CAAC;KACC,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,OAAkC,EAAE,EAAE;IACnF,MAAM,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
|
|
@@ -2,5 +2,14 @@
|
|
|
2
2
|
* fling init - Scaffold a new project in the current directory
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
+
import type { InitIO } from "../utils/cli-io.js";
|
|
6
|
+
export interface InitOptions {
|
|
7
|
+
local?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Run the init command logic.
|
|
11
|
+
* Extracted for testability via dependency injection.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runInit(options: InitOptions, io: InitIO): void;
|
|
5
14
|
export declare const initCommand: Command;
|
|
6
15
|
//# sourceMappingURL=init.d.ts.map
|