@irtio/cli 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +52 -0
- package/dist/api.js +15 -0
- package/dist/bundle.js +1 -1
- package/dist/{chunk-GBNHBWES.js → chunk-3HQMVCYA.js} +10 -6
- package/dist/{chunk-32QTPKVT.js → chunk-DKWG7MGO.js} +1 -1
- package/dist/{chunk-KRQUAEN2.js → chunk-OTSFRVJN.js} +12 -6
- package/dist/chunk-RNAH5T4W.js +96 -0
- package/dist/chunk-RQSJZWQC.js +452 -0
- package/dist/chunk-UPHQM6NZ.js +72 -0
- package/dist/chunk-ZD4ND6X6.js +31 -0
- package/dist/chunk-ZK5JLUD4.js +94 -0
- package/dist/credentials.d.ts +61 -0
- package/dist/credentials.js +20 -0
- package/dist/delete-project-VENS2B44.js +118 -0
- package/dist/deploy.d.ts +149 -0
- package/dist/{deploy-3SABPL3T.js → deploy.js} +166 -44
- package/dist/{dev-QJOGXLKM.js → dev-QM26ONKS.js} +2957 -231
- package/dist/index.js +97 -25
- package/dist/init.d.ts +1 -1
- package/dist/init.js +20 -4
- package/dist/{keys-XBORZAPI.js → keys-JHLMEGRA.js} +8 -4
- package/dist/leaderboard-SYPSBPS3.js +352 -0
- package/dist/{login-3EXB4CGX.js → login-2M73HBZT.js} +12 -5
- package/dist/{logs-2EOXLNWF.js → logs-2W7CPZO5.js} +9 -5
- package/dist/{migrate-WUO2GBMX.js → migrate-T3DZJREY.js} +12 -8
- package/dist/ratings-VG32WFDG.js +297 -0
- package/dist/{rollback-GA6UY772.js → rollback-SO74MVZV.js} +9 -5
- package/dist/{rooms-B66LQIIF.js → rooms-VI33P4RA.js} +36 -10
- package/dist/simulate.d.ts +147 -4
- package/dist/simulate.js +680 -53
- package/dist/{static-deploy-5TBH4VNA.js → static-deploy-KOWFKWZA.js} +6 -4
- package/dist/status-HF3ZEKB7.js +219 -0
- package/dist/usage-4G23QXCH.js +213 -0
- package/dist/{whoami-CI5D5RCC.js → whoami-KTMTQNHM.js} +8 -4
- package/package.json +23 -7
- package/dist/chunk-BPE452KF.js +0 -180
- package/dist/chunk-TV66QHFP.js +0 -167
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readProjectConfig
|
|
3
|
+
} from "./chunk-DKWG7MGO.js";
|
|
4
|
+
import {
|
|
5
|
+
HelpRequested,
|
|
6
|
+
helpFor,
|
|
7
|
+
helpRequested
|
|
8
|
+
} from "./chunk-ZD4ND6X6.js";
|
|
9
|
+
import {
|
|
10
|
+
createApiClient,
|
|
11
|
+
isLoginRequired
|
|
12
|
+
} from "./chunk-RNAH5T4W.js";
|
|
13
|
+
import {
|
|
14
|
+
resolveControlUrlForUser
|
|
15
|
+
} from "./chunk-UPHQM6NZ.js";
|
|
16
|
+
|
|
17
|
+
// src/leaderboard.ts
|
|
18
|
+
import pc from "picocolors";
|
|
19
|
+
var USAGE = `usage: irtio leaderboard <board> [options]
|
|
20
|
+
irtio leaderboard list [options]
|
|
21
|
+
irtio leaderboard delete <board> [--player <id>] --yes [options]
|
|
22
|
+
|
|
23
|
+
Prints a project's leaderboard. Reads are public: no login is needed, and this works against
|
|
24
|
+
any project's board, exactly as that project's own website would read it.
|
|
25
|
+
|
|
26
|
+
There is no submit command. Scores reach a board only from room code
|
|
27
|
+
(room.leaderboard.submit), which is what makes them server-authoritative.
|
|
28
|
+
|
|
29
|
+
list every board on the project, with its row count and direction. Needs your login,
|
|
30
|
+
because it is a view of a project rather than of one public ranking.
|
|
31
|
+
delete remove a whole board, or one player's row with --player. Needs your login and
|
|
32
|
+
--yes; without --yes it prints what would go and changes nothing.
|
|
33
|
+
|
|
34
|
+
options:
|
|
35
|
+
--limit <n> how many rows (default 10, max 100)
|
|
36
|
+
--cursor <c> continue from a previous page's nextCursor
|
|
37
|
+
--all page through the whole board, following cursors
|
|
38
|
+
--around <player> show the rows around one player instead of the top, with their rank
|
|
39
|
+
--player <id> with delete: remove one player's row instead of the whole board
|
|
40
|
+
--yes with delete: actually delete
|
|
41
|
+
--project <id> project id (default: the project file)
|
|
42
|
+
-c, --config <f> the project file to read (default irtio.json)
|
|
43
|
+
--url <control> control plane (default: your stored login)
|
|
44
|
+
-h, --help print this
|
|
45
|
+
`;
|
|
46
|
+
function parseLeaderboardArgs(args) {
|
|
47
|
+
if (helpRequested(args)) throw helpFor(USAGE);
|
|
48
|
+
const parsed = {};
|
|
49
|
+
if (args[0] === "list" || args[0] === "delete") {
|
|
50
|
+
parsed.action = args[0];
|
|
51
|
+
}
|
|
52
|
+
for (let i = parsed.action === void 0 ? 0 : 1; i < args.length; i++) {
|
|
53
|
+
const arg = args[i];
|
|
54
|
+
switch (arg) {
|
|
55
|
+
case "--cursor": {
|
|
56
|
+
const value = args[++i];
|
|
57
|
+
if (value === void 0 || value === "") {
|
|
58
|
+
throw new Error("irtio leaderboard: --cursor needs a value");
|
|
59
|
+
}
|
|
60
|
+
parsed.cursor = value;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "--all":
|
|
64
|
+
parsed.all = true;
|
|
65
|
+
break;
|
|
66
|
+
case "--yes":
|
|
67
|
+
parsed.yes = true;
|
|
68
|
+
break;
|
|
69
|
+
case "--player": {
|
|
70
|
+
const value = args[++i];
|
|
71
|
+
if (value === void 0 || value === "") {
|
|
72
|
+
throw new Error("irtio leaderboard: --player needs a player id");
|
|
73
|
+
}
|
|
74
|
+
parsed.player = value;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case "--limit": {
|
|
78
|
+
const value = Number(args[++i]);
|
|
79
|
+
if (!Number.isInteger(value) || value < 1) {
|
|
80
|
+
throw new Error("irtio leaderboard: --limit needs a whole number of at least 1");
|
|
81
|
+
}
|
|
82
|
+
parsed.limit = value;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "--around": {
|
|
86
|
+
const value = args[++i];
|
|
87
|
+
if (value === void 0 || value === "") {
|
|
88
|
+
throw new Error("irtio leaderboard: --around needs a player id");
|
|
89
|
+
}
|
|
90
|
+
parsed.around = value;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case "--project": {
|
|
94
|
+
const value = args[++i];
|
|
95
|
+
if (value === void 0) throw new Error("irtio leaderboard: --project needs a value");
|
|
96
|
+
parsed.project = value;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "-c":
|
|
100
|
+
case "--config": {
|
|
101
|
+
const value = args[++i];
|
|
102
|
+
if (value === void 0 || value === "") {
|
|
103
|
+
throw new Error("irtio leaderboard: --config needs a value");
|
|
104
|
+
}
|
|
105
|
+
parsed.config = value;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case "--url": {
|
|
109
|
+
const value = args[++i];
|
|
110
|
+
if (value === void 0) throw new Error("irtio leaderboard: --url needs a value");
|
|
111
|
+
parsed.url = value;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
if (arg.startsWith("-")) {
|
|
116
|
+
throw new Error(`irtio leaderboard: unknown option ${JSON.stringify(arg)}`);
|
|
117
|
+
}
|
|
118
|
+
if (parsed.board !== void 0) {
|
|
119
|
+
throw new Error("irtio leaderboard: give exactly one board name");
|
|
120
|
+
}
|
|
121
|
+
parsed.board = arg;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return parsed;
|
|
125
|
+
}
|
|
126
|
+
function formatLeaderboard(body, around) {
|
|
127
|
+
const direction = body.direction === "lower" ? "lower is better" : "higher is better";
|
|
128
|
+
const out = [pc.dim(`board ${body.board} \xB7 ${direction}`), ""];
|
|
129
|
+
if (body.entries.length === 0) {
|
|
130
|
+
out.push(
|
|
131
|
+
pc.dim(
|
|
132
|
+
around !== void 0 ? `${around} has no score on this board` : "no scores on this board yet"
|
|
133
|
+
)
|
|
134
|
+
);
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
const rankWidth = Math.max(4, ...body.entries.map((e) => String(e.rank).length));
|
|
138
|
+
const idWidth = Math.max(6, ...body.entries.map((e) => e.playerId.length));
|
|
139
|
+
out.push(pc.dim(`${"RANK".padEnd(rankWidth)} ${"PLAYER".padEnd(idWidth)} SCORE`));
|
|
140
|
+
for (const entry of body.entries) {
|
|
141
|
+
const line = `${String(entry.rank).padEnd(rankWidth)} ${entry.playerId.padEnd(idWidth)} ${entry.score}`;
|
|
142
|
+
out.push(entry.playerId === around ? pc.bold(line) : line);
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
async function runLeaderboard(options) {
|
|
147
|
+
const log = options.log ?? ((line) => console.log(line));
|
|
148
|
+
const controlUrl = (await resolveControlUrlForUser(options.controlUrl)).replace(/\/+$/, "");
|
|
149
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
150
|
+
const base = `${controlUrl}/v1/leaderboard/${encodeURIComponent(
|
|
151
|
+
options.project
|
|
152
|
+
)}/${encodeURIComponent(options.board)}`;
|
|
153
|
+
if (options.around !== void 0) {
|
|
154
|
+
const body2 = await readPublicJson(
|
|
155
|
+
fetchImpl,
|
|
156
|
+
`${base}/around/${encodeURIComponent(options.around)}`
|
|
157
|
+
);
|
|
158
|
+
for (const line of formatLeaderboard(body2, options.around)) log(line);
|
|
159
|
+
return body2;
|
|
160
|
+
}
|
|
161
|
+
const pageUrl = (cursor) => {
|
|
162
|
+
const query = new URLSearchParams();
|
|
163
|
+
if (options.limit !== void 0) query.set("limit", String(options.limit));
|
|
164
|
+
if (cursor !== void 0) query.set("cursor", cursor);
|
|
165
|
+
const q = query.toString();
|
|
166
|
+
return `${base}/top${q === "" ? "" : `?${q}`}`;
|
|
167
|
+
};
|
|
168
|
+
let body = await readPublicJson(fetchImpl, pageUrl(options.cursor));
|
|
169
|
+
const entries = [...body.entries];
|
|
170
|
+
if (options.all === true) {
|
|
171
|
+
let next = body.nextCursor;
|
|
172
|
+
for (let page = 1; next !== void 0 && page < 100; page++) {
|
|
173
|
+
body = await readPublicJson(fetchImpl, pageUrl(next));
|
|
174
|
+
entries.push(...body.entries);
|
|
175
|
+
next = body.nextCursor;
|
|
176
|
+
}
|
|
177
|
+
if (next !== void 0) {
|
|
178
|
+
throw new Error(
|
|
179
|
+
"irtio leaderboard: --all stopped after a hundred pages. Read it in pieces with --cursor"
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const combined = { ...body, entries };
|
|
184
|
+
for (const line of formatLeaderboard(combined)) log(line);
|
|
185
|
+
if (options.all !== true && body.nextCursor !== void 0) {
|
|
186
|
+
log("");
|
|
187
|
+
log(pc.dim(`more rows: --cursor ${body.nextCursor}`));
|
|
188
|
+
}
|
|
189
|
+
return combined;
|
|
190
|
+
}
|
|
191
|
+
async function readPublicJson(fetchImpl, url) {
|
|
192
|
+
const res = await fetchImpl(url);
|
|
193
|
+
const text = await res.text().catch(() => "");
|
|
194
|
+
if (!res.ok) {
|
|
195
|
+
let message = `leaderboard read failed with status ${res.status}`;
|
|
196
|
+
try {
|
|
197
|
+
const parsed = JSON.parse(text);
|
|
198
|
+
if (typeof parsed.message === "string") message = parsed.message;
|
|
199
|
+
} catch {
|
|
200
|
+
}
|
|
201
|
+
throw new Error(message);
|
|
202
|
+
}
|
|
203
|
+
return JSON.parse(text);
|
|
204
|
+
}
|
|
205
|
+
function formatBoardList(boards) {
|
|
206
|
+
if (boards.length === 0) {
|
|
207
|
+
return [
|
|
208
|
+
pc.dim("no boards on this project yet"),
|
|
209
|
+
pc.dim("scores reach a board from room code: room.leaderboard.submit")
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
const nameWidth = Math.max(5, ...boards.map((b) => b.board.length));
|
|
213
|
+
const out = [pc.dim(`${"BOARD".padEnd(nameWidth)} ${"ROWS".padStart(7)} DIRECTION`)];
|
|
214
|
+
for (const b of boards) {
|
|
215
|
+
const note = b.configured && b.rows === 0 ? pc.dim(" (configured, no rows yet)") : "";
|
|
216
|
+
out.push(`${b.board.padEnd(nameWidth)} ${String(b.rows).padStart(7)} ${b.direction}${note}`);
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
async function runBoardList(options) {
|
|
221
|
+
const log = options.log ?? ((line) => console.log(line));
|
|
222
|
+
const controlUrl = await resolveControlUrlForUser(options.controlUrl);
|
|
223
|
+
const client = options.client ?? await createApiClient(controlUrl);
|
|
224
|
+
const body = await client.get(
|
|
225
|
+
`/v1/projects/${encodeURIComponent(options.project)}/leaderboards`
|
|
226
|
+
);
|
|
227
|
+
for (const line of formatBoardList(body.boards)) log(line);
|
|
228
|
+
return body.boards;
|
|
229
|
+
}
|
|
230
|
+
async function runBoardDelete(options) {
|
|
231
|
+
const log = options.log ?? ((line) => console.log(line));
|
|
232
|
+
const controlUrl = await resolveControlUrlForUser(options.controlUrl);
|
|
233
|
+
const client = options.client ?? await createApiClient(controlUrl);
|
|
234
|
+
const path = `/v1/projects/${encodeURIComponent(options.project)}/leaderboard/${encodeURIComponent(
|
|
235
|
+
options.board
|
|
236
|
+
)}`;
|
|
237
|
+
if (!options.yes) {
|
|
238
|
+
if (options.player !== void 0) {
|
|
239
|
+
log(
|
|
240
|
+
`this would delete ${pc.bold(options.player)} from board ${pc.bold(options.board)} in project ${options.project}`
|
|
241
|
+
);
|
|
242
|
+
} else {
|
|
243
|
+
const { boards } = await client.get(
|
|
244
|
+
`/v1/projects/${encodeURIComponent(options.project)}/leaderboards`
|
|
245
|
+
);
|
|
246
|
+
const rows = boards.find((b) => b.board === options.board)?.rows ?? 0;
|
|
247
|
+
log(
|
|
248
|
+
`this would delete every row on board ${pc.bold(options.board)} in project ${options.project}: ${pc.bold(String(rows))} row(s)`
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
log(pc.dim("nothing was deleted. This cannot be undone once it runs"));
|
|
252
|
+
log(
|
|
253
|
+
`to proceed: irtio leaderboard delete ${options.board}${options.player !== void 0 ? ` --player ${options.player}` : ""} --yes`
|
|
254
|
+
);
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
if (options.player !== void 0) {
|
|
258
|
+
const body2 = await client.del(
|
|
259
|
+
`${path}/${encodeURIComponent(options.player)}`
|
|
260
|
+
);
|
|
261
|
+
log(
|
|
262
|
+
body2.deleted ? pc.green(`deleted ${options.player} from board ${options.board}`) : pc.dim(`${options.player} had no row on board ${options.board}; nothing to delete`)
|
|
263
|
+
);
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
const body = await client.del(path);
|
|
267
|
+
log(pc.green(`deleted ${body.deleted} row(s) from board ${options.board}`));
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
async function leaderboard(args, deps = {}) {
|
|
271
|
+
const log = deps.log ?? ((line) => console.log(line));
|
|
272
|
+
const errorLog = deps.errorLog ?? ((line) => console.error(line));
|
|
273
|
+
try {
|
|
274
|
+
const parsed = parseLeaderboardArgs(args);
|
|
275
|
+
const config = await readProjectConfig(process.cwd(), "irtio leaderboard", parsed.config);
|
|
276
|
+
const project = parsed.project ?? config.project;
|
|
277
|
+
if (project === void 0) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
"irtio leaderboard: no project id. Pass --project or run this from a project with irtio.json"
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
const common = {
|
|
283
|
+
project,
|
|
284
|
+
log,
|
|
285
|
+
...parsed.url !== void 0 ? { controlUrl: parsed.url } : {},
|
|
286
|
+
...deps.client !== void 0 ? { client: deps.client } : {}
|
|
287
|
+
};
|
|
288
|
+
if (parsed.action === "list") {
|
|
289
|
+
if (parsed.board !== void 0) {
|
|
290
|
+
throw new Error("irtio leaderboard list: takes no board name");
|
|
291
|
+
}
|
|
292
|
+
await runBoardList(common);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (parsed.action === "delete") {
|
|
296
|
+
if (parsed.board === void 0) {
|
|
297
|
+
throw new Error(
|
|
298
|
+
"irtio leaderboard delete: which board? e.g. irtio leaderboard delete scores --yes"
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
await runBoardDelete({
|
|
302
|
+
...common,
|
|
303
|
+
board: parsed.board,
|
|
304
|
+
yes: parsed.yes === true,
|
|
305
|
+
...parsed.player !== void 0 ? { player: parsed.player } : {}
|
|
306
|
+
});
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (parsed.board === void 0) {
|
|
310
|
+
throw new Error("irtio leaderboard: which board? e.g. irtio leaderboard scores");
|
|
311
|
+
}
|
|
312
|
+
if (parsed.cursor !== void 0 && parsed.all === true) {
|
|
313
|
+
throw new Error("irtio leaderboard: --cursor and --all are two ways to do the same thing");
|
|
314
|
+
}
|
|
315
|
+
if (parsed.around !== void 0 && (parsed.cursor !== void 0 || parsed.all === true)) {
|
|
316
|
+
throw new Error("irtio leaderboard: --around does not page; it is already a window");
|
|
317
|
+
}
|
|
318
|
+
await runLeaderboard({
|
|
319
|
+
project,
|
|
320
|
+
board: parsed.board,
|
|
321
|
+
log,
|
|
322
|
+
...parsed.limit !== void 0 ? { limit: parsed.limit } : {},
|
|
323
|
+
...parsed.around !== void 0 ? { around: parsed.around } : {},
|
|
324
|
+
...parsed.cursor !== void 0 ? { cursor: parsed.cursor } : {},
|
|
325
|
+
...parsed.all === true ? { all: true } : {},
|
|
326
|
+
...parsed.url !== void 0 ? { controlUrl: parsed.url } : {}
|
|
327
|
+
});
|
|
328
|
+
} catch (err) {
|
|
329
|
+
if (err instanceof HelpRequested) {
|
|
330
|
+
log(err.usage);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (isLoginRequired(err)) {
|
|
334
|
+
errorLog(pc.red("not logged in"));
|
|
335
|
+
errorLog("run: irtio login");
|
|
336
|
+
process.exitCode = 1;
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
errorLog(pc.red(err instanceof Error ? err.message : String(err)));
|
|
340
|
+
process.exitCode = 1;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
export {
|
|
344
|
+
USAGE,
|
|
345
|
+
formatBoardList,
|
|
346
|
+
formatLeaderboard,
|
|
347
|
+
leaderboard,
|
|
348
|
+
parseLeaderboardArgs,
|
|
349
|
+
runBoardDelete,
|
|
350
|
+
runBoardList,
|
|
351
|
+
runLeaderboard
|
|
352
|
+
};
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
HelpRequested,
|
|
3
|
-
credentialsPath,
|
|
4
3
|
helpFor,
|
|
5
|
-
helpRequested
|
|
4
|
+
helpRequested
|
|
5
|
+
} from "./chunk-ZD4ND6X6.js";
|
|
6
|
+
import "./chunk-RNAH5T4W.js";
|
|
7
|
+
import {
|
|
8
|
+
credentialsPath,
|
|
6
9
|
resolveControlUrl,
|
|
7
10
|
writeCredential
|
|
8
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-UPHQM6NZ.js";
|
|
9
12
|
|
|
10
13
|
// src/login.ts
|
|
11
14
|
import { spawn } from "child_process";
|
|
@@ -18,8 +21,12 @@ var USAGE = `usage: irtio login [--url <control>]
|
|
|
18
21
|
Signs in to a control plane through your browser and stores the credential it hands back.
|
|
19
22
|
|
|
20
23
|
options:
|
|
21
|
-
--url <control>
|
|
22
|
-
-
|
|
24
|
+
--url <control> the control plane to sign in to (default: the last one you used)
|
|
25
|
+
--token-file <file> store the credential in this file instead of the default location
|
|
26
|
+
(a global flag: pass it to later commands too, or set
|
|
27
|
+
IRT_CREDENTIALS_FILE). For agents and sandboxes that cannot
|
|
28
|
+
reach the home directory
|
|
29
|
+
-h, --help print this
|
|
23
30
|
`;
|
|
24
31
|
function parseLoginArgs(args) {
|
|
25
32
|
if (helpRequested(args)) throw helpFor(USAGE);
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
readProjectConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-DKWG7MGO.js";
|
|
4
4
|
import {
|
|
5
5
|
HelpRequested,
|
|
6
|
-
createApiClient,
|
|
7
6
|
helpFor,
|
|
8
|
-
helpRequested
|
|
9
|
-
|
|
7
|
+
helpRequested
|
|
8
|
+
} from "./chunk-ZD4ND6X6.js";
|
|
9
|
+
import {
|
|
10
|
+
createApiClient,
|
|
11
|
+
isLoginRequired
|
|
12
|
+
} from "./chunk-RNAH5T4W.js";
|
|
13
|
+
import {
|
|
10
14
|
resolveControlUrlForUser
|
|
11
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-UPHQM6NZ.js";
|
|
12
16
|
|
|
13
17
|
// src/logs.ts
|
|
14
18
|
import "fs";
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
bundleRoom
|
|
3
|
-
} from "./chunk-KRQUAEN2.js";
|
|
4
1
|
import {
|
|
5
2
|
readProjectConfig
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-DKWG7MGO.js";
|
|
4
|
+
import {
|
|
5
|
+
bundleRoom
|
|
6
|
+
} from "./chunk-OTSFRVJN.js";
|
|
7
7
|
import {
|
|
8
8
|
HelpRequested,
|
|
9
|
-
createApiClient,
|
|
10
9
|
helpFor,
|
|
11
|
-
helpRequested
|
|
12
|
-
|
|
10
|
+
helpRequested
|
|
11
|
+
} from "./chunk-ZD4ND6X6.js";
|
|
12
|
+
import {
|
|
13
|
+
createApiClient,
|
|
14
|
+
isLoginRequired
|
|
15
|
+
} from "./chunk-RNAH5T4W.js";
|
|
16
|
+
import {
|
|
13
17
|
resolveControlUrlForUser
|
|
14
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-UPHQM6NZ.js";
|
|
15
19
|
|
|
16
20
|
// src/migrate.ts
|
|
17
21
|
import { existsSync } from "fs";
|