flingit 0.0.14 → 0.0.18
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 +2 -1
- package/dist/cli/commands/cron.d.ts +29 -0
- package/dist/cli/commands/cron.d.ts.map +1 -1
- package/dist/cli/commands/cron.js +54 -37
- package/dist/cli/commands/cron.js.map +1 -1
- package/dist/cli/commands/db.d.ts.map +1 -1
- package/dist/cli/commands/db.js +15 -19
- package/dist/cli/commands/db.js.map +1 -1
- package/dist/cli/commands/dev.d.ts +1 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +344 -86
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/feedback.js +3 -3
- package/dist/cli/commands/feedback.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +9 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/launch.d.ts +45 -3
- package/dist/cli/commands/launch.d.ts.map +1 -1
- package/dist/cli/commands/launch.js +39 -17
- package/dist/cli/commands/launch.js.map +1 -1
- package/dist/cli/commands/logout.d.ts +18 -0
- package/dist/cli/commands/logout.d.ts.map +1 -1
- package/dist/cli/commands/logout.js +40 -14
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +3 -2
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +26 -43
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/onboard.js +3 -3
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/project.d.ts.map +1 -1
- package/dist/cli/commands/project.js +44 -23
- 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 +6 -4
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/register.d.ts +37 -0
- package/dist/cli/commands/register.d.ts.map +1 -1
- package/dist/cli/commands/register.js +96 -74
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/tunnel.js +2 -2
- package/dist/cli/commands/tunnel.js.map +1 -1
- package/dist/cli/commands/whoami.d.ts +18 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +54 -28
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/index.js +10 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/cli-io-impl.d.ts +33 -2
- package/dist/cli/utils/cli-io-impl.d.ts.map +1 -1
- package/dist/cli/utils/cli-io-impl.js +99 -14
- package/dist/cli/utils/cli-io-impl.js.map +1 -1
- package/dist/cli/utils/cli-io.d.ts +27 -9
- package/dist/cli/utils/cli-io.d.ts.map +1 -1
- package/dist/cli/utils/config.d.ts.map +1 -1
- package/dist/cli/utils/config.js +2 -2
- package/dist/cli/utils/config.js.map +1 -1
- package/dist/cli/utils/db-adapter.d.ts +59 -0
- package/dist/cli/utils/db-adapter.d.ts.map +1 -0
- package/dist/cli/utils/db-adapter.js +74 -0
- package/dist/cli/utils/db-adapter.js.map +1 -0
- package/dist/cli/utils/email.d.ts +15 -0
- package/dist/cli/utils/email.d.ts.map +1 -0
- package/dist/cli/utils/email.js +31 -0
- package/dist/cli/utils/email.js.map +1 -0
- package/dist/cli/utils/project-name.d.ts +10 -2
- package/dist/cli/utils/project-name.d.ts.map +1 -1
- package/dist/cli/utils/project-name.js +12 -6
- package/dist/cli/utils/project-name.js.map +1 -1
- package/dist/cli/utils/project.d.ts +17 -6
- package/dist/cli/utils/project.d.ts.map +1 -1
- package/dist/cli/utils/project.js +30 -36
- package/dist/cli/utils/project.js.map +1 -1
- package/dist/cli/utils/registry.d.ts +8 -6
- package/dist/cli/utils/registry.d.ts.map +1 -1
- package/dist/cli/utils/registry.js +32 -30
- package/dist/cli/utils/registry.js.map +1 -1
- package/dist/shared/constants.d.ts +16 -3
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +16 -3
- package/dist/shared/constants.js.map +1 -1
- package/dist/worker-runtime/discord.js +1 -1
- package/dist/worker-runtime/discord.js.map +1 -1
- package/dist/worker-runtime/index.d.ts +2 -1
- package/dist/worker-runtime/index.d.ts.map +1 -1
- package/dist/worker-runtime/index.js +19 -6
- package/dist/worker-runtime/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/default/.claude/settings.local.json +1 -0
- package/templates/default/CLAUDE.md +2 -314
- package/templates/default/skills/fling/.hash +1 -1
- package/templates/default/skills/fling/API.md +45 -4
- package/templates/default/skills/fling/SKILL.md +92 -1
- package/dist/cli/commands/admin.d.ts +0 -8
- package/dist/cli/commands/admin.d.ts.map +0 -1
- package/dist/cli/commands/admin.js +0 -244
- package/dist/cli/commands/admin.js.map +0 -1
- package/dist/cli/commands/dev-worker.d.ts +0 -12
- package/dist/cli/commands/dev-worker.d.ts.map +0 -1
- package/dist/cli/commands/dev-worker.js +0 -66
- package/dist/cli/commands/dev-worker.js.map +0 -1
- package/dist/cli/commands/tun.d.ts +0 -13
- package/dist/cli/commands/tun.d.ts.map +0 -1
- package/dist/cli/commands/tun.js +0 -189
- package/dist/cli/commands/tun.js.map +0 -1
- package/dist/cli/utils/launch-io-impl.d.ts +0 -13
- package/dist/cli/utils/launch-io-impl.d.ts.map +0 -1
- package/dist/cli/utils/launch-io-impl.js +0 -51
- package/dist/cli/utils/launch-io-impl.js.map +0 -1
- package/dist/cli/utils/launch-io.d.ts +0 -42
- package/dist/cli/utils/launch-io.d.ts.map +0 -1
- package/dist/cli/utils/launch-io.js +0 -8
- package/dist/cli/utils/launch-io.js.map +0 -1
- package/dist/cli/utils/onboarding-io-impl.d.ts +0 -12
- package/dist/cli/utils/onboarding-io-impl.d.ts.map +0 -1
- package/dist/cli/utils/onboarding-io-impl.js +0 -85
- package/dist/cli/utils/onboarding-io-impl.js.map +0 -1
- package/dist/cli/utils/onboarding-io.d.ts +0 -60
- package/dist/cli/utils/onboarding-io.d.ts.map +0 -1
- package/dist/cli/utils/onboarding-io.js +0 -9
- package/dist/cli/utils/onboarding-io.js.map +0 -1
- package/dist/client/assets/index-BqVrS7t9.js +0 -40
- package/dist/client/assets/index-DSLUsCtO.css +0 -1
- package/dist/client/index.html +0 -14
- package/dist/client/vite.svg +0 -1
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling admin - Admin commands for platform management
|
|
3
|
-
*
|
|
4
|
-
* Requires ADMIN_KEY environment variable to be set.
|
|
5
|
-
*/
|
|
6
|
-
import { Command } from "commander";
|
|
7
|
-
import { getApiUrl } from "../utils/config.js";
|
|
8
|
-
// Billable rates per Cloudflare pricing
|
|
9
|
-
const RATES = {
|
|
10
|
-
requestsPerMillion: 0.3, // $0.30 per million requests
|
|
11
|
-
cpuMsPerMillion: 0.02, // $0.02 per million CPU ms
|
|
12
|
-
// D1 pricing
|
|
13
|
-
rowsReadPerMillion: 0.001, // $0.001 per million rows read
|
|
14
|
-
rowsWrittenPerMillion: 1.0, // $1.00 per million rows written
|
|
15
|
-
d1StoragePerGBMonth: 0.75, // $0.75 per GB-month for D1
|
|
16
|
-
// R2 pricing
|
|
17
|
-
r2StoragePerGBMonth: 0.015, // $0.015 per GB-month for R2
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Make an authenticated admin request to the platform API.
|
|
21
|
-
*
|
|
22
|
-
* @param path - API path to request
|
|
23
|
-
* @param fetchFn - Optional fetch function for dependency injection (defaults to global fetch)
|
|
24
|
-
*/
|
|
25
|
-
async function adminFetch(path, fetchFn = fetch) {
|
|
26
|
-
const adminKey = process.env["ADMIN_KEY"];
|
|
27
|
-
if (!adminKey) {
|
|
28
|
-
throw new Error("ADMIN_KEY environment variable is required for admin commands");
|
|
29
|
-
}
|
|
30
|
-
const url = `${getApiUrl()}${path}`;
|
|
31
|
-
return fetchFn(url, {
|
|
32
|
-
headers: {
|
|
33
|
-
Authorization: `Bearer ${adminKey}`,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Format a number with commas for readability.
|
|
39
|
-
*/
|
|
40
|
-
function formatNumber(n) {
|
|
41
|
-
return n.toLocaleString();
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Format bytes as human-readable size.
|
|
45
|
-
*/
|
|
46
|
-
function formatBytes(bytes) {
|
|
47
|
-
if (bytes === 0)
|
|
48
|
-
return "0 B";
|
|
49
|
-
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
50
|
-
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
51
|
-
const value = bytes / Math.pow(1024, i);
|
|
52
|
-
return `${value.toFixed(1)}${units[i]}`;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Format cost as currency.
|
|
56
|
-
*/
|
|
57
|
-
function formatCost(cost) {
|
|
58
|
-
if (cost < 0.01 && cost > 0) {
|
|
59
|
-
return "<$0.01";
|
|
60
|
-
}
|
|
61
|
-
return `$${cost.toFixed(2)}`;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Calculate cost from usage.
|
|
65
|
-
*/
|
|
66
|
-
function calculateCost(usage) {
|
|
67
|
-
const requestsCost = (usage.worker.requests / 1_000_000) * RATES.requestsPerMillion;
|
|
68
|
-
const cpuCost = (usage.worker.cpu_time_ms / 1_000_000) * RATES.cpuMsPerMillion;
|
|
69
|
-
const rowsReadCost = ((usage.d1?.rows_read ?? 0) / 1_000_000) * RATES.rowsReadPerMillion;
|
|
70
|
-
const rowsWrittenCost = ((usage.d1?.rows_written ?? 0) / 1_000_000) * RATES.rowsWrittenPerMillion;
|
|
71
|
-
const d1StorageCost = ((usage.d1?.storage_bytes ?? 0) / (1024 * 1024 * 1024)) * RATES.d1StoragePerGBMonth;
|
|
72
|
-
const r2StorageCost = ((usage.r2?.storage_bytes ?? 0) / (1024 * 1024 * 1024)) * RATES.r2StoragePerGBMonth;
|
|
73
|
-
return requestsCost + cpuCost + rowsReadCost + rowsWrittenCost + d1StorageCost + r2StorageCost;
|
|
74
|
-
}
|
|
75
|
-
function aggregateUsage(usages) {
|
|
76
|
-
return usages.reduce((acc, u) => ({
|
|
77
|
-
requests: acc.requests + u.worker.requests,
|
|
78
|
-
errors: acc.errors + u.worker.errors,
|
|
79
|
-
cpuTimeMs: acc.cpuTimeMs + u.worker.cpu_time_ms,
|
|
80
|
-
rowsRead: acc.rowsRead + (u.d1?.rows_read ?? 0),
|
|
81
|
-
rowsWritten: acc.rowsWritten + (u.d1?.rows_written ?? 0),
|
|
82
|
-
d1StorageBytes: Math.max(acc.d1StorageBytes, u.d1?.storage_bytes ?? 0), // Take max for storage
|
|
83
|
-
r2StorageBytes: Math.max(acc.r2StorageBytes, u.r2?.storage_bytes ?? 0), // Take max for storage
|
|
84
|
-
}), { requests: 0, errors: 0, cpuTimeMs: 0, rowsRead: 0, rowsWritten: 0, d1StorageBytes: 0, r2StorageBytes: 0 });
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Pad a string to a fixed width.
|
|
88
|
-
*/
|
|
89
|
-
function pad(s, width, align = "left") {
|
|
90
|
-
if (s.length >= width)
|
|
91
|
-
return s;
|
|
92
|
-
const padding = " ".repeat(width - s.length);
|
|
93
|
-
return align === "left" ? s + padding : padding + s;
|
|
94
|
-
}
|
|
95
|
-
export const adminCommand = new Command("admin")
|
|
96
|
-
.description("Admin commands for platform management")
|
|
97
|
-
.addHelpText("after", `
|
|
98
|
-
Requires ADMIN_KEY environment variable.
|
|
99
|
-
|
|
100
|
-
Example:
|
|
101
|
-
ADMIN_KEY=your_key fling admin usage
|
|
102
|
-
ADMIN_KEY=your_key fling admin usage --days=7
|
|
103
|
-
`);
|
|
104
|
-
adminCommand
|
|
105
|
-
.command("usage")
|
|
106
|
-
.description("List all users with their resource usage and computed costs")
|
|
107
|
-
.option("--days <number>", "Number of days to look back (1-31)", "31")
|
|
108
|
-
.action(async (options) => {
|
|
109
|
-
const days = parseInt(options.days, 10);
|
|
110
|
-
if (isNaN(days) || days < 1 || days > 31) {
|
|
111
|
-
console.error("Error: days must be between 1 and 31");
|
|
112
|
-
process.exit(1);
|
|
113
|
-
}
|
|
114
|
-
try {
|
|
115
|
-
// Get all users
|
|
116
|
-
const usersResponse = await adminFetch("/admin/users");
|
|
117
|
-
if (!usersResponse.ok) {
|
|
118
|
-
const data = (await usersResponse.json());
|
|
119
|
-
console.error(`Error fetching users: ${data.error ?? "Unknown error"}`);
|
|
120
|
-
process.exit(1);
|
|
121
|
-
}
|
|
122
|
-
const { users } = (await usersResponse.json());
|
|
123
|
-
if (users.length === 0) {
|
|
124
|
-
console.log("No users found.");
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
// Fetch usage for each user's projects with concurrency limit
|
|
128
|
-
const CONCURRENCY = 5;
|
|
129
|
-
const userUsages = new Map();
|
|
130
|
-
// Build list of all project fetch tasks
|
|
131
|
-
const tasks = [];
|
|
132
|
-
for (const user of users) {
|
|
133
|
-
if (user.project) {
|
|
134
|
-
tasks.push({ user, projectId: user.project.id });
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
// User with no project - still track them
|
|
138
|
-
userUsages.set(user.id, { user, usages: [] });
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// Process tasks with concurrency limit
|
|
142
|
-
let completed = 0;
|
|
143
|
-
const total = tasks.length;
|
|
144
|
-
for (let i = 0; i < tasks.length; i += CONCURRENCY) {
|
|
145
|
-
const batch = tasks.slice(i, i + CONCURRENCY);
|
|
146
|
-
const results = await Promise.allSettled(batch.map(async ({ user, projectId }) => {
|
|
147
|
-
const response = await adminFetch(`/admin/users/${user.id}/projects/${projectId}/usage?days=${days}`);
|
|
148
|
-
if (!response.ok) {
|
|
149
|
-
console.error(`Warning: Failed to fetch usage for ${user.email}`);
|
|
150
|
-
return null;
|
|
151
|
-
}
|
|
152
|
-
return { user, usage: (await response.json()) };
|
|
153
|
-
}));
|
|
154
|
-
for (const result of results) {
|
|
155
|
-
completed++;
|
|
156
|
-
if (result.status === "fulfilled" && result.value) {
|
|
157
|
-
const { user, usage } = result.value;
|
|
158
|
-
const existing = userUsages.get(user.id);
|
|
159
|
-
if (existing) {
|
|
160
|
-
existing.usages.push(usage);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
userUsages.set(user.id, { user, usages: [usage] });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// Progress indicator
|
|
168
|
-
process.stderr.write(`\rFetching usage... ${completed}/${total}`);
|
|
169
|
-
}
|
|
170
|
-
process.stderr.write("\r" + " ".repeat(40) + "\r"); // Clear progress line
|
|
171
|
-
const rows = [];
|
|
172
|
-
let totalRequests = 0;
|
|
173
|
-
let totalCpuTimeMs = 0;
|
|
174
|
-
let totalRowsRead = 0;
|
|
175
|
-
let totalRowsWritten = 0;
|
|
176
|
-
let totalD1StorageBytes = 0;
|
|
177
|
-
let totalR2StorageBytes = 0;
|
|
178
|
-
let totalCost = 0;
|
|
179
|
-
for (const { user, usages } of userUsages.values()) {
|
|
180
|
-
if (usages.length === 0)
|
|
181
|
-
continue;
|
|
182
|
-
const agg = aggregateUsage(usages);
|
|
183
|
-
const cost = usages.reduce((sum, u) => sum + calculateCost(u), 0);
|
|
184
|
-
rows.push({
|
|
185
|
-
email: user.email,
|
|
186
|
-
requests: agg.requests,
|
|
187
|
-
cpuTimeMs: agg.cpuTimeMs,
|
|
188
|
-
rowsRead: agg.rowsRead,
|
|
189
|
-
rowsWritten: agg.rowsWritten,
|
|
190
|
-
d1StorageBytes: agg.d1StorageBytes,
|
|
191
|
-
r2StorageBytes: agg.r2StorageBytes,
|
|
192
|
-
cost,
|
|
193
|
-
});
|
|
194
|
-
totalRequests += agg.requests;
|
|
195
|
-
totalCpuTimeMs += agg.cpuTimeMs;
|
|
196
|
-
totalRowsRead += agg.rowsRead;
|
|
197
|
-
totalRowsWritten += agg.rowsWritten;
|
|
198
|
-
totalD1StorageBytes = Math.max(totalD1StorageBytes, agg.d1StorageBytes);
|
|
199
|
-
totalR2StorageBytes = Math.max(totalR2StorageBytes, agg.r2StorageBytes);
|
|
200
|
-
totalCost += cost;
|
|
201
|
-
}
|
|
202
|
-
// Sort by cost descending
|
|
203
|
-
rows.sort((a, b) => b.cost - a.cost);
|
|
204
|
-
// Calculate column widths
|
|
205
|
-
const hUser = "User";
|
|
206
|
-
const hRequests = "Requests";
|
|
207
|
-
const hCpu = "CPU (ms)";
|
|
208
|
-
const hRowsRead = "Rows Read";
|
|
209
|
-
const hRowsWritten = "Rows Written";
|
|
210
|
-
const hD1Storage = "D1 Storage";
|
|
211
|
-
const hR2Storage = "R2 Storage";
|
|
212
|
-
const hCost = "Cost";
|
|
213
|
-
const wUser = Math.max(hUser.length, ...rows.map((r) => r.email.length));
|
|
214
|
-
const wRequests = Math.max(hRequests.length, ...rows.map((r) => formatNumber(r.requests).length));
|
|
215
|
-
const wCpu = Math.max(hCpu.length, ...rows.map((r) => formatNumber(r.cpuTimeMs).length));
|
|
216
|
-
const wRowsRead = Math.max(hRowsRead.length, ...rows.map((r) => formatNumber(r.rowsRead).length));
|
|
217
|
-
const wRowsWritten = Math.max(hRowsWritten.length, ...rows.map((r) => formatNumber(r.rowsWritten).length));
|
|
218
|
-
const wD1Storage = Math.max(hD1Storage.length, ...rows.map((r) => formatBytes(r.d1StorageBytes).length));
|
|
219
|
-
const wR2Storage = Math.max(hR2Storage.length, ...rows.map((r) => formatBytes(r.r2StorageBytes).length));
|
|
220
|
-
const wCost = Math.max(hCost.length, ...rows.map((r) => formatCost(r.cost).length));
|
|
221
|
-
// Print header
|
|
222
|
-
console.log(`${pad(hUser, wUser)} ${pad(hRequests, wRequests, "right")} ${pad(hCpu, wCpu, "right")} ${pad(hRowsRead, wRowsRead, "right")} ${pad(hRowsWritten, wRowsWritten, "right")} ${pad(hD1Storage, wD1Storage, "right")} ${pad(hR2Storage, wR2Storage, "right")} ${pad(hCost, wCost, "right")}`);
|
|
223
|
-
// Print separator
|
|
224
|
-
const separator = [wUser, wRequests, wCpu, wRowsRead, wRowsWritten, wD1Storage, wR2Storage, wCost]
|
|
225
|
-
.map((w) => "-".repeat(w))
|
|
226
|
-
.join(" ");
|
|
227
|
-
console.log(separator);
|
|
228
|
-
// Print rows
|
|
229
|
-
for (const row of rows) {
|
|
230
|
-
console.log(`${pad(row.email, wUser)} ${pad(formatNumber(row.requests), wRequests, "right")} ${pad(formatNumber(row.cpuTimeMs), wCpu, "right")} ${pad(formatNumber(row.rowsRead), wRowsRead, "right")} ${pad(formatNumber(row.rowsWritten), wRowsWritten, "right")} ${pad(formatBytes(row.d1StorageBytes), wD1Storage, "right")} ${pad(formatBytes(row.r2StorageBytes), wR2Storage, "right")} ${pad(formatCost(row.cost), wCost, "right")}`);
|
|
231
|
-
}
|
|
232
|
-
// Print total
|
|
233
|
-
console.log(separator);
|
|
234
|
-
console.log(`${pad("Total", wUser)} ${pad(formatNumber(totalRequests), wRequests, "right")} ${pad(formatNumber(totalCpuTimeMs), wCpu, "right")} ${pad(formatNumber(totalRowsRead), wRowsRead, "right")} ${pad(formatNumber(totalRowsWritten), wRowsWritten, "right")} ${pad(formatBytes(totalD1StorageBytes), wD1Storage, "right")} ${pad(formatBytes(totalR2StorageBytes), wR2Storage, "right")} ${pad(formatCost(totalCost), wCost, "right")}`);
|
|
235
|
-
// Print period info
|
|
236
|
-
console.log();
|
|
237
|
-
console.log(`Period: last ${days} days`);
|
|
238
|
-
}
|
|
239
|
-
catch (error) {
|
|
240
|
-
console.error(`Error: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
241
|
-
process.exit(1);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
//# sourceMappingURL=admin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling dev worker - The actual development server process
|
|
3
|
-
*
|
|
4
|
-
* This script is spawned by `fling dev` using `tsx watch`.
|
|
5
|
-
* tsx watch monitors all imported files and restarts this process on changes.
|
|
6
|
-
*
|
|
7
|
-
* Environment variables:
|
|
8
|
-
* PORT - Port to run the HTTP server on (default: 3210)
|
|
9
|
-
* PROJECT_DIR - Project directory (default: cwd)
|
|
10
|
-
*/
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=dev-worker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-worker.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling dev worker - The actual development server process
|
|
3
|
-
*
|
|
4
|
-
* This script is spawned by `fling dev` using `tsx watch`.
|
|
5
|
-
* tsx watch monitors all imported files and restarts this process on changes.
|
|
6
|
-
*
|
|
7
|
-
* Environment variables:
|
|
8
|
-
* PORT - Port to run the HTTP server on (default: 3210)
|
|
9
|
-
* PROJECT_DIR - Project directory (default: cwd)
|
|
10
|
-
*/
|
|
11
|
-
import { serve } from "@hono/node-server";
|
|
12
|
-
import { pathToFileURL } from "node:url";
|
|
13
|
-
import { getWorkerEntryPath } from "../utils/project.js";
|
|
14
|
-
const port = parseInt(process.env["PORT"] ?? "3210", 10);
|
|
15
|
-
const projectDir = process.env["PROJECT_DIR"] ?? process.cwd();
|
|
16
|
-
const workerEntry = getWorkerEntryPath(projectDir);
|
|
17
|
-
console.log(`[worker] Starting backend server (pid ${process.pid})...`);
|
|
18
|
-
let server = null;
|
|
19
|
-
async function main() {
|
|
20
|
-
try {
|
|
21
|
-
// Import the user's app - this registers routes, cron jobs, and migrations
|
|
22
|
-
// tsx handles TypeScript imports automatically
|
|
23
|
-
const appUrl = pathToFileURL(workerEntry).href;
|
|
24
|
-
await import(appUrl);
|
|
25
|
-
// Import runtime modules
|
|
26
|
-
const { app } = await import("../../runtime/http.js");
|
|
27
|
-
const { runMigrations } = await import("../../runtime/migrate.js");
|
|
28
|
-
const { startCronJobs, getCronJobs, stopCronJobs } = await import("../../runtime/cron.js");
|
|
29
|
-
const { closeLogDatabase } = await import("../../runtime/log.js");
|
|
30
|
-
// Run migrations (before starting crons or HTTP server)
|
|
31
|
-
await runMigrations();
|
|
32
|
-
// Start cron jobs
|
|
33
|
-
startCronJobs();
|
|
34
|
-
const cronJobs = getCronJobs();
|
|
35
|
-
if (cronJobs.size > 0) {
|
|
36
|
-
console.log(`[worker] Cron jobs: ${cronJobs.size} registered`);
|
|
37
|
-
}
|
|
38
|
-
// Graceful shutdown handler
|
|
39
|
-
const shutdown = () => {
|
|
40
|
-
console.log("[worker] Shutting down...");
|
|
41
|
-
stopCronJobs();
|
|
42
|
-
closeLogDatabase();
|
|
43
|
-
if (server) {
|
|
44
|
-
server.close();
|
|
45
|
-
}
|
|
46
|
-
process.exit(0);
|
|
47
|
-
};
|
|
48
|
-
process.on("SIGINT", shutdown);
|
|
49
|
-
process.on("SIGTERM", shutdown);
|
|
50
|
-
// Start HTTP server
|
|
51
|
-
console.log(`[worker] API server: http://localhost:${port}`);
|
|
52
|
-
server = serve({
|
|
53
|
-
fetch: app.fetch,
|
|
54
|
-
port,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
console.error("[worker] Failed to start:", error);
|
|
59
|
-
process.exit(1);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
main().catch((error) => {
|
|
63
|
-
console.error("[worker] Unhandled error:", error);
|
|
64
|
-
process.exit(1);
|
|
65
|
-
});
|
|
66
|
-
//# sourceMappingURL=dev-worker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-worker.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAc,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACzD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAE/D,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAEnD,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AAExE,IAAI,MAAM,GAAsB,IAAI,CAAC;AAErC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,2EAA2E;QAC3E,+CAA+C;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAErB,yBAAyB;QACzB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACnE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAC/D,uBAAuB,CACxB,CAAC;QACF,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAElE,wDAAwD;QACxD,MAAM,aAAa,EAAE,CAAC;QAEtB,kBAAkB;QAClB,aAAa,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC;QACjE,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,oBAAoB;QACpB,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;QAE7D,MAAM,GAAG,KAAK,CAAC;YACb,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling tun - Expose local development server via Cloudflare Tunnel
|
|
3
|
-
*
|
|
4
|
-
* Uses cloudflared (Cloudflare's tunnel daemon) for high-performance,
|
|
5
|
-
* concurrent request handling. The platform provisions tunnel credentials
|
|
6
|
-
* and DNS records; the CLI runs cloudflared with the provided token.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* fling tun 3000 # Tunnel localhost:3000
|
|
10
|
-
*/
|
|
11
|
-
import { Command } from "commander";
|
|
12
|
-
export declare const tunCommand: Command;
|
|
13
|
-
//# sourceMappingURL=tun.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tun.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,UAAU,SAyFnB,CAAC"}
|
package/dist/cli/commands/tun.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fling tun - Expose local development server via Cloudflare Tunnel
|
|
3
|
-
*
|
|
4
|
-
* Uses cloudflared (Cloudflare's tunnel daemon) for high-performance,
|
|
5
|
-
* concurrent request handling. The platform provisions tunnel credentials
|
|
6
|
-
* and DNS records; the CLI runs cloudflared with the provided token.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* fling tun 3000 # Tunnel localhost:3000
|
|
10
|
-
*/
|
|
11
|
-
import { Command } from "commander";
|
|
12
|
-
import { spawn } from "child_process";
|
|
13
|
-
import { existsSync } from "fs";
|
|
14
|
-
import { platformFetch, getToken } from "../utils/config.js";
|
|
15
|
-
import { getProjectName } from "../utils/project-name.js";
|
|
16
|
-
export const tunCommand = new Command("tun")
|
|
17
|
-
.description("Expose local server via Cloudflare Tunnel")
|
|
18
|
-
.argument("<port>", "Local port to tunnel")
|
|
19
|
-
.addHelpText("after", `
|
|
20
|
-
What it does:
|
|
21
|
-
Creates a Cloudflare Tunnel from the internet to your local development server.
|
|
22
|
-
External requests to the tunnel URL are forwarded to localhost:<port>.
|
|
23
|
-
|
|
24
|
-
This uses cloudflared (Cloudflare's tunnel daemon) which provides:
|
|
25
|
-
- Full concurrent request handling (no serialization)
|
|
26
|
-
- Native Cloudflare edge integration
|
|
27
|
-
- Automatic TLS termination
|
|
28
|
-
|
|
29
|
-
Examples:
|
|
30
|
-
fling tun 3000 Tunnel localhost:3000
|
|
31
|
-
|
|
32
|
-
The tunnel URL will be displayed when connected. Keep the command running
|
|
33
|
-
to maintain the tunnel. Press Ctrl+C to disconnect.
|
|
34
|
-
|
|
35
|
-
Prerequisites:
|
|
36
|
-
- Must be logged in (fling login)
|
|
37
|
-
- Local server must be running on the specified port
|
|
38
|
-
|
|
39
|
-
Note: cloudflared will be automatically downloaded on first use.
|
|
40
|
-
`)
|
|
41
|
-
.action(async (portArg) => {
|
|
42
|
-
const port = parseInt(portArg, 10);
|
|
43
|
-
if (isNaN(port) || port < 1 || port > 65535) {
|
|
44
|
-
console.error("Error: Port must be a number between 1 and 65535");
|
|
45
|
-
process.exit(1);
|
|
46
|
-
}
|
|
47
|
-
const token = getToken();
|
|
48
|
-
if (!token) {
|
|
49
|
-
console.error("Error: Not logged in. Run 'fling login' first.");
|
|
50
|
-
process.exit(1);
|
|
51
|
-
}
|
|
52
|
-
// Get project name from package.json (defaults to "default" for backwards compatibility)
|
|
53
|
-
const projectName = getProjectName();
|
|
54
|
-
console.log(`Starting tunnel to localhost:${port}...`);
|
|
55
|
-
// Ensure cloudflared is installed
|
|
56
|
-
const cloudflaredBin = await ensureCloudflared();
|
|
57
|
-
if (!cloudflaredBin) {
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
// Request tunnel credentials from platform
|
|
61
|
-
const tunResponse = await startTunnel(projectName, port);
|
|
62
|
-
if (!tunResponse) {
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
console.log(`\nTunnel URL: ${tunResponse.tunnelUrl}`);
|
|
66
|
-
console.log(`Forwarding to: http://localhost:${port}`);
|
|
67
|
-
console.log("\nPress Ctrl+C to disconnect\n");
|
|
68
|
-
// Run cloudflared with the token
|
|
69
|
-
const cloudflaredProcess = runCloudflared(cloudflaredBin, tunResponse.token, port);
|
|
70
|
-
// Handle graceful shutdown
|
|
71
|
-
const cleanup = async () => {
|
|
72
|
-
console.log("\nDisconnecting tunnel...");
|
|
73
|
-
cloudflaredProcess.kill("SIGTERM");
|
|
74
|
-
// Stop tunnel on platform
|
|
75
|
-
await stopTunnel(projectName);
|
|
76
|
-
process.exit(0);
|
|
77
|
-
};
|
|
78
|
-
process.on("SIGINT", () => void cleanup());
|
|
79
|
-
process.on("SIGTERM", () => void cleanup());
|
|
80
|
-
// Wait for cloudflared to exit
|
|
81
|
-
cloudflaredProcess.on("exit", (code) => {
|
|
82
|
-
if (code !== 0 && code !== null) {
|
|
83
|
-
console.error(`cloudflared exited with code ${code}`);
|
|
84
|
-
}
|
|
85
|
-
process.exit(code ?? 0);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
/**
|
|
89
|
-
* Ensure cloudflared binary is installed.
|
|
90
|
-
* Uses the 'cloudflared' npm package which handles platform-specific downloads.
|
|
91
|
-
*/
|
|
92
|
-
async function ensureCloudflared() {
|
|
93
|
-
try {
|
|
94
|
-
// Dynamic import to handle the cloudflared package
|
|
95
|
-
const { bin, install } = await import("cloudflared");
|
|
96
|
-
if (!existsSync(bin)) {
|
|
97
|
-
console.log("Installing cloudflared...");
|
|
98
|
-
await install(bin);
|
|
99
|
-
console.log("cloudflared installed successfully");
|
|
100
|
-
}
|
|
101
|
-
return bin;
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
console.error("Failed to install cloudflared:", error);
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Request tunnel credentials from the platform.
|
|
110
|
-
*/
|
|
111
|
-
async function startTunnel(projectName, localPort) {
|
|
112
|
-
try {
|
|
113
|
-
const response = await platformFetch(`/project/${encodeURIComponent(projectName)}/tun/start`, {
|
|
114
|
-
method: "POST",
|
|
115
|
-
headers: { "Content-Type": "application/json" },
|
|
116
|
-
body: JSON.stringify({ localPort }),
|
|
117
|
-
});
|
|
118
|
-
if (!response.ok) {
|
|
119
|
-
const error = await response.json().catch(() => ({}));
|
|
120
|
-
console.error(`Error: Failed to start tunnel: ${error.error ?? response.statusText}`);
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
return (await response.json());
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
console.error("Error: Failed to connect to platform:", error);
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Notify platform that tunnel is stopping.
|
|
132
|
-
*/
|
|
133
|
-
async function stopTunnel(projectName) {
|
|
134
|
-
try {
|
|
135
|
-
await platformFetch(`/project/${encodeURIComponent(projectName)}/tun/stop`, { method: "DELETE" });
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
// Ignore errors on cleanup
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Run cloudflared with the provided token.
|
|
143
|
-
*/
|
|
144
|
-
function runCloudflared(bin, tunnelToken, localPort) {
|
|
145
|
-
const args = [
|
|
146
|
-
"tunnel",
|
|
147
|
-
"--no-autoupdate",
|
|
148
|
-
"run",
|
|
149
|
-
"--token",
|
|
150
|
-
tunnelToken,
|
|
151
|
-
"--url",
|
|
152
|
-
`http://localhost:${localPort}`,
|
|
153
|
-
];
|
|
154
|
-
const child = spawn(bin, args, {
|
|
155
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
156
|
-
});
|
|
157
|
-
// Forward cloudflared output (stdout and stderr are piped, so they're non-null)
|
|
158
|
-
child.stdout.on("data", (data) => {
|
|
159
|
-
const lines = data.toString().split("\n").filter(Boolean);
|
|
160
|
-
for (const line of lines) {
|
|
161
|
-
// Filter out noisy logs, show important ones
|
|
162
|
-
if (line.includes("error") ||
|
|
163
|
-
line.includes("failed") ||
|
|
164
|
-
line.includes("connected") ||
|
|
165
|
-
line.includes("Registered")) {
|
|
166
|
-
console.log(`[cloudflared] ${line}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
child.stderr.on("data", (data) => {
|
|
171
|
-
const lines = data.toString().split("\n").filter(Boolean);
|
|
172
|
-
for (const line of lines) {
|
|
173
|
-
// cloudflared logs to stderr by default
|
|
174
|
-
if (line.includes("ERR") ||
|
|
175
|
-
line.includes("error") ||
|
|
176
|
-
line.includes("failed")) {
|
|
177
|
-
console.error(`[cloudflared] ${line}`);
|
|
178
|
-
}
|
|
179
|
-
else if (line.includes("INF") &&
|
|
180
|
-
(line.includes("connect") ||
|
|
181
|
-
line.includes("Registered") ||
|
|
182
|
-
line.includes("serving"))) {
|
|
183
|
-
console.log(`[cloudflared] ${line}`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
return child;
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=tun.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tun.js","sourceRoot":"","sources":["../../../src/cli/commands/tun.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default implementation of LaunchIO using real dependencies.
|
|
3
|
-
*/
|
|
4
|
-
import type { LaunchIO } from "./launch-io.js";
|
|
5
|
-
/**
|
|
6
|
-
* Create the default LaunchIO implementation using real dependencies.
|
|
7
|
-
*/
|
|
8
|
-
export declare function createDefaultLaunchIO(): LaunchIO;
|
|
9
|
-
/**
|
|
10
|
-
* Default LaunchIO instance.
|
|
11
|
-
*/
|
|
12
|
-
export declare const defaultLaunchIO: LaunchIO;
|
|
13
|
-
//# sourceMappingURL=launch-io-impl.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch-io-impl.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/launch-io-impl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,CAiDhD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,UAA0B,CAAC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default implementation of LaunchIO using real dependencies.
|
|
3
|
-
*/
|
|
4
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { homedir } from "node:os";
|
|
7
|
-
import * as p from "@clack/prompts";
|
|
8
|
-
/**
|
|
9
|
-
* Create the default LaunchIO implementation using real dependencies.
|
|
10
|
-
*/
|
|
11
|
-
export function createDefaultLaunchIO() {
|
|
12
|
-
const flingHome = join(homedir(), "fling");
|
|
13
|
-
const cwd = process.cwd();
|
|
14
|
-
return {
|
|
15
|
-
user: {
|
|
16
|
-
async select(opts) {
|
|
17
|
-
return p.select(opts);
|
|
18
|
-
},
|
|
19
|
-
async text(opts) {
|
|
20
|
-
return p.text(opts);
|
|
21
|
-
},
|
|
22
|
-
isCancel: p.isCancel,
|
|
23
|
-
},
|
|
24
|
-
file: {
|
|
25
|
-
exists(path) {
|
|
26
|
-
return existsSync(path);
|
|
27
|
-
},
|
|
28
|
-
isProjectRoot(dir) {
|
|
29
|
-
return existsSync(join(dir, ".claude", "skills", "fling"));
|
|
30
|
-
},
|
|
31
|
-
isDirEmpty(dir) {
|
|
32
|
-
try {
|
|
33
|
-
return readdirSync(dir).length === 0;
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
paths: {
|
|
41
|
-
flingHome,
|
|
42
|
-
cwd,
|
|
43
|
-
homedir: homedir(),
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Default LaunchIO instance.
|
|
49
|
-
*/
|
|
50
|
-
export const defaultLaunchIO = createDefaultLaunchIO();
|
|
51
|
-
//# sourceMappingURL=launch-io-impl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch-io-impl.js","sourceRoot":"","sources":["../../../src/cli/utils/launch-io-impl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAGpC;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,OAAO;QACL,IAAI,EAAE;YACJ,KAAK,CAAC,MAAM,CAAmB,IAG9B;gBACC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAsC,CAErD,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,IAGV;gBACC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAED,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB;QAED,IAAI,EAAE;YACJ,MAAM,CAAC,IAAY;gBACjB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAED,aAAa,CAAC,GAAW;gBACvB,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;YAED,UAAU,CAAC,GAAW;gBACpB,IAAI,CAAC;oBACH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;SACF;QAED,KAAK,EAAE;YACL,SAAS;YACT,GAAG;YACH,OAAO,EAAE,OAAO,EAAE;SACnB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC"}
|