dx-devkit 0.0.0-stage → 1.1.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/CHANGELOG.md +81 -0
- package/LICENSE +21 -0
- package/README.md +475 -2
- package/bin/dx-mcp.js +2 -0
- package/dist/command.d.ts +9 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +2 -0
- package/dist/command.js.map +1 -0
- package/dist/commands/ai.d.ts +7 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +148 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/clean.d.ts +3 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +72 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/deps.d.ts +3 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +98 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/go.d.ts +3 -0
- package/dist/commands/go.d.ts.map +1 -0
- package/dist/commands/go.js +202 -0
- package/dist/commands/go.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +51 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +117 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/port.d.ts +4 -0
- package/dist/commands/port.d.ts.map +1 -0
- package/dist/commands/port.js +106 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/projects.d.ts +5 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +46 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/stack.d.ts +34 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +140 -0
- package/dist/commands/stack.js.map +1 -0
- package/dist/commands/summary.d.ts +3 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +88 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/system.d.ts +5 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +104 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +96 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/ui.d.ts +27 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +104 -0
- package/dist/ui.js.map +1 -0
- package/node_modules/@dx/core/dist/config.d.ts +46 -0
- package/node_modules/@dx/core/dist/config.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/config.js +131 -0
- package/node_modules/@dx/core/dist/config.js.map +1 -0
- package/node_modules/@dx/core/dist/fuzzy.d.ts +15 -0
- package/node_modules/@dx/core/dist/fuzzy.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/fuzzy.js +63 -0
- package/node_modules/@dx/core/dist/fuzzy.js.map +1 -0
- package/node_modules/@dx/core/dist/index.d.ts +17 -0
- package/node_modules/@dx/core/dist/index.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/index.js +19 -0
- package/node_modules/@dx/core/dist/index.js.map +1 -0
- package/node_modules/@dx/core/dist/runs.d.ts +19 -0
- package/node_modules/@dx/core/dist/runs.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/runs.js +41 -0
- package/node_modules/@dx/core/dist/runs.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.d.ts +58 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.js +243 -0
- package/node_modules/@dx/core/dist/tools/aiSetup.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/cleanup.d.ts +61 -0
- package/node_modules/@dx/core/dist/tools/cleanup.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/cleanup.js +171 -0
- package/node_modules/@dx/core/dist/tools/cleanup.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/deps.d.ts +57 -0
- package/node_modules/@dx/core/dist/tools/deps.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/deps.js +151 -0
- package/node_modules/@dx/core/dist/tools/deps.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/devErrors.d.ts +74 -0
- package/node_modules/@dx/core/dist/tools/devErrors.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/devErrors.js +261 -0
- package/node_modules/@dx/core/dist/tools/devErrors.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/doctor.d.ts +12 -0
- package/node_modules/@dx/core/dist/tools/doctor.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/doctor.js +176 -0
- package/node_modules/@dx/core/dist/tools/doctor.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/github.d.ts +31 -0
- package/node_modules/@dx/core/dist/tools/github.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/github.js +80 -0
- package/node_modules/@dx/core/dist/tools/github.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/journal.d.ts +23 -0
- package/node_modules/@dx/core/dist/tools/journal.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/journal.js +80 -0
- package/node_modules/@dx/core/dist/tools/journal.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/launch.d.ts +24 -0
- package/node_modules/@dx/core/dist/tools/launch.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/launch.js +137 -0
- package/node_modules/@dx/core/dist/tools/launch.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/ports.d.ts +42 -0
- package/node_modules/@dx/core/dist/tools/ports.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/ports.js +220 -0
- package/node_modules/@dx/core/dist/tools/ports.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/projects.d.ts +58 -0
- package/node_modules/@dx/core/dist/tools/projects.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/projects.js +208 -0
- package/node_modules/@dx/core/dist/tools/projects.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/scaffold.d.ts +40 -0
- package/node_modules/@dx/core/dist/tools/scaffold.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/scaffold.js +188 -0
- package/node_modules/@dx/core/dist/tools/scaffold.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/stacks.d.ts +119 -0
- package/node_modules/@dx/core/dist/tools/stacks.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/stacks.js +386 -0
- package/node_modules/@dx/core/dist/tools/stacks.js.map +1 -0
- package/node_modules/@dx/core/dist/tools/summary.d.ts +87 -0
- package/node_modules/@dx/core/dist/tools/summary.d.ts.map +1 -0
- package/node_modules/@dx/core/dist/tools/summary.js +331 -0
- package/node_modules/@dx/core/dist/tools/summary.js.map +1 -0
- package/node_modules/@dx/core/package.json +20 -0
- package/node_modules/@dx/mcp/dist/index.d.ts +3 -0
- package/node_modules/@dx/mcp/dist/index.d.ts.map +1 -0
- package/node_modules/@dx/mcp/dist/index.js +540 -0
- package/node_modules/@dx/mcp/dist/index.js.map +1 -0
- package/node_modules/@dx/mcp/package.json +8 -0
- package/node_modules/@dx/web/dist/api.d.ts +13 -0
- package/node_modules/@dx/web/dist/api.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/api.js +351 -0
- package/node_modules/@dx/web/dist/api.js.map +1 -0
- package/node_modules/@dx/web/dist/background.d.ts +2 -0
- package/node_modules/@dx/web/dist/background.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/background.js +24 -0
- package/node_modules/@dx/web/dist/background.js.map +1 -0
- package/node_modules/@dx/web/dist/check.d.ts +39 -0
- package/node_modules/@dx/web/dist/check.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/check.js +97 -0
- package/node_modules/@dx/web/dist/check.js.map +1 -0
- package/node_modules/@dx/web/dist/dev.d.ts +109 -0
- package/node_modules/@dx/web/dist/dev.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/dev.js +645 -0
- package/node_modules/@dx/web/dist/dev.js.map +1 -0
- package/node_modules/@dx/web/dist/link.d.ts +45 -0
- package/node_modules/@dx/web/dist/link.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/link.js +150 -0
- package/node_modules/@dx/web/dist/link.js.map +1 -0
- package/node_modules/@dx/web/dist/proxy.d.ts +21 -0
- package/node_modules/@dx/web/dist/proxy.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/proxy.js +140 -0
- package/node_modules/@dx/web/dist/proxy.js.map +1 -0
- package/node_modules/@dx/web/dist/server.d.ts +33 -0
- package/node_modules/@dx/web/dist/server.d.ts.map +1 -0
- package/node_modules/@dx/web/dist/server.js +184 -0
- package/node_modules/@dx/web/dist/server.js.map +1 -0
- package/node_modules/@dx/web/package.json +26 -0
- package/node_modules/@dx/web/public/app.js +1553 -0
- package/node_modules/@dx/web/public/icon.svg +1 -0
- package/node_modules/@dx/web/public/index.html +47 -0
- package/node_modules/@dx/web/public/styles.css +1124 -0
- package/package.json +52 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { addJournalEntry, journalPath, loadConfig, openInEditor, readJournal, recordRun } from "@dx/core";
|
|
3
|
+
import { c, ok, tildify } from "../ui.js";
|
|
4
|
+
export const logCommand = {
|
|
5
|
+
name: "log",
|
|
6
|
+
summary: "Write one line in your work journal, or read it back",
|
|
7
|
+
usage: [
|
|
8
|
+
'dx log "fixed seat map overflow" add an entry',
|
|
9
|
+
"dx log show the last 7 days",
|
|
10
|
+
"dx log --days 30 show the last 30 days",
|
|
11
|
+
"dx log --edit open the journal file in your editor",
|
|
12
|
+
].join("\n"),
|
|
13
|
+
async run(argv) {
|
|
14
|
+
const { values, positionals } = parseArgs({
|
|
15
|
+
args: argv,
|
|
16
|
+
allowPositionals: true,
|
|
17
|
+
options: {
|
|
18
|
+
days: { type: "string", short: "d" },
|
|
19
|
+
edit: { type: "boolean", short: "e" },
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
if (values.edit) {
|
|
23
|
+
await openInEditor(journalPath(), loadConfig().editor);
|
|
24
|
+
ok(`Opened ${tildify(journalPath())}`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const text = positionals.join(" ").trim();
|
|
28
|
+
if (text) {
|
|
29
|
+
const entry = addJournalEntry(text);
|
|
30
|
+
recordRun("log", true);
|
|
31
|
+
ok(`Logged ${c.dim(`${entry.date} ${entry.time}`)} ${entry.text}`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const days = values.days ? Math.max(1, Number(values.days) || 7) : 7;
|
|
35
|
+
const entries = readJournal({ sinceDays: days });
|
|
36
|
+
if (entries.length === 0) {
|
|
37
|
+
console.log(`Nothing logged in the last ${days} day(s). Add an entry with: dx log "what you did"`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let lastDate = "";
|
|
41
|
+
for (const e of entries) {
|
|
42
|
+
if (e.date !== lastDate) {
|
|
43
|
+
console.log(`${lastDate ? "\n" : ""}${c.bold(e.date)}`);
|
|
44
|
+
lastDate = e.date;
|
|
45
|
+
}
|
|
46
|
+
console.log(` ${c.dim(e.time || " ")} ${e.text}`);
|
|
47
|
+
}
|
|
48
|
+
console.log(c.dim(`\n${entries.length} entr${entries.length === 1 ? "y" : "ies"} · ${tildify(journalPath())}`));
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,eAAO,MAAM,UAAU,EAAE,OA0GxB,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
import { copyProject, isValidProjectName, listTemplates, loadConfig, NAME_PLACEHOLDER, readProject, recordRun, resolveSource, saveAsTemplate, templatesDir, } from "@dx/core";
|
|
5
|
+
import { goCommand } from "./go.js";
|
|
6
|
+
import { c, info, ok, tildify, UsageError, warn } from "../ui.js";
|
|
7
|
+
export const newCommand = {
|
|
8
|
+
name: "new",
|
|
9
|
+
aliases: ["create"],
|
|
10
|
+
summary: "Start a new project from one of your templates or a copy of a project, then open it",
|
|
11
|
+
usage: [
|
|
12
|
+
"dx new list your templates",
|
|
13
|
+
"dx new <template> <name> new project from ~/.dx/templates/<template>",
|
|
14
|
+
"dx new <project> <name> new project copied from an existing one",
|
|
15
|
+
"dx new --save <project> <template> save a project as a template",
|
|
16
|
+
"",
|
|
17
|
+
" --in <folder> create it there instead of your first projects folder",
|
|
18
|
+
" --no-install don't install packages",
|
|
19
|
+
" --no-git don't create a git repository",
|
|
20
|
+
" --no-open don't open it afterwards (default: dx go, editor + dev server)",
|
|
21
|
+
" --no-dev open the editor but don't start the dev server",
|
|
22
|
+
"",
|
|
23
|
+
"A git project is copied as what git tracks plus new files it doesn't ignore.",
|
|
24
|
+
"Copies always leave out .git, node_modules, build output and .env files (.env.example is kept).",
|
|
25
|
+
`In template files, ${NAME_PLACEHOLDER} is replaced with the new name, in file names too.`,
|
|
26
|
+
].join("\n"),
|
|
27
|
+
async run(argv) {
|
|
28
|
+
const { values, positionals } = parseArgs({
|
|
29
|
+
args: argv,
|
|
30
|
+
allowPositionals: true,
|
|
31
|
+
allowNegative: true,
|
|
32
|
+
options: {
|
|
33
|
+
save: { type: "boolean" },
|
|
34
|
+
in: { type: "string" },
|
|
35
|
+
install: { type: "boolean", default: true },
|
|
36
|
+
git: { type: "boolean", default: true },
|
|
37
|
+
open: { type: "boolean", default: true },
|
|
38
|
+
dev: { type: "boolean", default: true },
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const config = loadConfig();
|
|
42
|
+
const [sourceInput, name] = positionals;
|
|
43
|
+
if (!sourceInput) {
|
|
44
|
+
const templates = listTemplates(config);
|
|
45
|
+
if (templates.length === 0) {
|
|
46
|
+
console.log(`No templates yet. They live in ${tildify(templatesDir(config))}, one folder each.`);
|
|
47
|
+
console.log(c.dim("Save one from a project: dx new --save todo-app vite-app"));
|
|
48
|
+
console.log(c.dim("Or copy a project directly: dx new todo-app my-new-app"));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
console.log(c.bold("Templates") + c.dim(` ${tildify(templatesDir(config))}`));
|
|
52
|
+
for (const t of templates)
|
|
53
|
+
console.log(` ${c.cyan(t.name)}`);
|
|
54
|
+
console.log(c.dim("\nUse one: dx new <template> <name>"));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!name)
|
|
58
|
+
throw new UsageError(values.save ? "Name the template: dx new --save <project> <template>" : "Name the new project: dx new <template> <name>");
|
|
59
|
+
if (!isValidProjectName(name))
|
|
60
|
+
throw new UsageError(`"${name}" isn't a valid name: use lowercase letters, digits, - _ or .`);
|
|
61
|
+
const source = resolveSource(sourceInput, config);
|
|
62
|
+
if ("candidates" in source) {
|
|
63
|
+
throw new UsageError(source.candidates.length
|
|
64
|
+
? `"${sourceInput}" matches several projects: ${source.candidates.join(", ")}. Which one?`
|
|
65
|
+
: `No template or project called "${sourceInput}". See templates with: dx new`);
|
|
66
|
+
}
|
|
67
|
+
if (values.save) {
|
|
68
|
+
const result = saveAsTemplate(source, name, config);
|
|
69
|
+
ok(`Saved ${c.bold(source.name)} as template ${c.cyan(name)} (${result.files} files) in ${tildify(result.dir)}`);
|
|
70
|
+
info(`Tip: put ${NAME_PLACEHOLDER} in its files (README title, page title, …) and new projects get their own name there.`);
|
|
71
|
+
recordRun("new.template", true, `${source.name} → ${name}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const parent = values.in ? path.resolve(values.in) : config.projectsRoots[0];
|
|
75
|
+
if (!parent)
|
|
76
|
+
throw new UsageError("No projects folder configured. Add one with: dx config add-root <path>, or pass --in <folder>.");
|
|
77
|
+
const dest = path.join(parent, name);
|
|
78
|
+
const result = copyProject(source, dest, name);
|
|
79
|
+
ok(`Created ${c.bold(name)} from ${source.kind} ${c.cyan(source.name)}: ${result.files} files` +
|
|
80
|
+
(result.filled ? `, ${result.filled} with the name filled in` : "") +
|
|
81
|
+
c.dim(` ${tildify(dest)}`));
|
|
82
|
+
if (values.git) {
|
|
83
|
+
try {
|
|
84
|
+
execFileSync("git", ["init", "-q"], { cwd: dest, stdio: "ignore", windowsHide: true });
|
|
85
|
+
ok("Created a git repository");
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
warn("Couldn't create a git repository (is git installed?)");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const project = readProject(dest);
|
|
92
|
+
if (values.install && project?.kind === "node") {
|
|
93
|
+
const pm = project.packageManager ?? "npm";
|
|
94
|
+
info(`Installing packages with ${pm}…`);
|
|
95
|
+
const code = await runInherit(`${pm} install`, dest);
|
|
96
|
+
if (code === 0)
|
|
97
|
+
ok("Packages installed");
|
|
98
|
+
else
|
|
99
|
+
warn(`${pm} install exited with ${code}; run it again in ${tildify(dest)}`);
|
|
100
|
+
}
|
|
101
|
+
recordRun("new", true, `${name} from ${source.kind} ${source.name}`, "cli", { project: name });
|
|
102
|
+
if (!values.open) {
|
|
103
|
+
info(`Open it with: dx go ${name}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
process.chdir(dest);
|
|
107
|
+
return goCommand.run(values.dev ? ["."] : [".", "--no-dev"]);
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
function runInherit(command, cwd) {
|
|
111
|
+
return new Promise((resolve) => {
|
|
112
|
+
const child = spawn(command, { cwd, shell: true, stdio: "inherit" });
|
|
113
|
+
child.once("error", () => resolve(1));
|
|
114
|
+
child.once("exit", (code) => resolve(code ?? 1));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/commands/port.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAgD7C,eAAO,MAAM,WAAW,EAAE,OAwCzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAczB,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { killPort, listListeningPorts, recordRun } from "@dx/core";
|
|
3
|
+
import { c, confirm, ok, table, UsageError, warn } from "../ui.js";
|
|
4
|
+
function portTable(entries) {
|
|
5
|
+
return table(["PORT", "PID", "PROCESS", "COMMAND"], entries.map((e) => [
|
|
6
|
+
c.bold(String(e.port)),
|
|
7
|
+
String(e.pid),
|
|
8
|
+
e.system ? c.dim(e.processName ?? "System") : (e.processName ?? c.dim("?")),
|
|
9
|
+
c.dim(e.commandLine ?? ""),
|
|
10
|
+
]));
|
|
11
|
+
}
|
|
12
|
+
function parsePort(value) {
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
const n = Number(value.replace(/^:/, ""));
|
|
16
|
+
if (!Number.isInteger(n) || n < 1 || n > 65535)
|
|
17
|
+
throw new UsageError(`Not a valid port: ${value}`);
|
|
18
|
+
return n;
|
|
19
|
+
}
|
|
20
|
+
async function killFlow(port, yes) {
|
|
21
|
+
const entries = await listListeningPorts(port);
|
|
22
|
+
if (entries.length === 0) {
|
|
23
|
+
console.log(`Nothing is listening on port ${port}.`);
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
console.log(portTable(entries));
|
|
27
|
+
const killable = entries.filter((e) => !e.system);
|
|
28
|
+
if (killable.length === 0) {
|
|
29
|
+
warn(`Port ${port} belongs to the operating system; dx won't kill it.`);
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
if (!yes && !(await confirm(`\nKill ${killable.length === 1 ? "this process" : `these ${killable.length} processes`}?`))) {
|
|
33
|
+
console.log("Left it running.");
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
const { results } = await killPort(port);
|
|
37
|
+
let failed = 0;
|
|
38
|
+
for (const r of results) {
|
|
39
|
+
(r.ok ? ok : warn)(r.message);
|
|
40
|
+
if (!r.ok)
|
|
41
|
+
failed++;
|
|
42
|
+
}
|
|
43
|
+
recordRun("port.kill", failed === 0, `port ${port}: ${results.map((r) => r.message).join("; ")}`);
|
|
44
|
+
return failed === 0 ? 0 : 1;
|
|
45
|
+
}
|
|
46
|
+
export const portCommand = {
|
|
47
|
+
name: "port",
|
|
48
|
+
aliases: ["ports"],
|
|
49
|
+
summary: "See what's listening on a port, and kill it",
|
|
50
|
+
usage: [
|
|
51
|
+
"dx port list listening ports (1024 and up)",
|
|
52
|
+
"dx port --all include low ports and system processes",
|
|
53
|
+
"dx port 3000 show what's on port 3000",
|
|
54
|
+
"dx port 3000 --kill kill it (asks first; add -y to skip the question)",
|
|
55
|
+
"dx port --json",
|
|
56
|
+
].join("\n"),
|
|
57
|
+
async run(argv) {
|
|
58
|
+
const { values, positionals } = parseArgs({
|
|
59
|
+
args: argv,
|
|
60
|
+
allowPositionals: true,
|
|
61
|
+
options: {
|
|
62
|
+
kill: { type: "boolean", short: "k" },
|
|
63
|
+
yes: { type: "boolean", short: "y" },
|
|
64
|
+
all: { type: "boolean", short: "a" },
|
|
65
|
+
json: { type: "boolean" },
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
const port = parsePort(positionals[0]);
|
|
69
|
+
if (values.kill) {
|
|
70
|
+
if (port === undefined)
|
|
71
|
+
throw new UsageError("Which port? e.g. dx port 3000 --kill");
|
|
72
|
+
return killFlow(port, Boolean(values.yes));
|
|
73
|
+
}
|
|
74
|
+
let entries = await listListeningPorts(port);
|
|
75
|
+
if (port === undefined && !values.all)
|
|
76
|
+
entries = entries.filter((e) => e.port >= 1024 && !e.system);
|
|
77
|
+
if (values.json) {
|
|
78
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (entries.length === 0) {
|
|
82
|
+
console.log(port === undefined ? "No listening ports found." : `Nothing is listening on port ${port}.`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
console.log(portTable(entries));
|
|
86
|
+
if (port !== undefined)
|
|
87
|
+
console.log(c.dim(`\nKill it with: dx kill ${port}`));
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
export const killCommand = {
|
|
91
|
+
name: "kill",
|
|
92
|
+
summary: "Kill whatever is listening on a port",
|
|
93
|
+
usage: "dx kill <port> [-y]",
|
|
94
|
+
async run(argv) {
|
|
95
|
+
const { values, positionals } = parseArgs({
|
|
96
|
+
args: argv,
|
|
97
|
+
allowPositionals: true,
|
|
98
|
+
options: { yes: { type: "boolean", short: "y" } },
|
|
99
|
+
});
|
|
100
|
+
const port = parsePort(positionals[0]);
|
|
101
|
+
if (port === undefined)
|
|
102
|
+
throw new UsageError("Which port? e.g. dx kill 3000");
|
|
103
|
+
return killFlow(port, Boolean(values.yes));
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/commands/port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAC;AAEnF,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEnE,SAAS,SAAS,CAAC,OAAoB;IACrC,OAAO,KAAK,CACV,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,EACrC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACb,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3E,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;KAC3B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK;QAAE,MAAM,IAAI,UAAU,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IACnG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAY;IAChD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,IAAI,qDAAqD,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC;QACzH,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,EAAE,CAAC;IACtB,CAAC;IACD,SAAS,CAAC,WAAW,EAAE,MAAM,KAAK,CAAC,EAAE,QAAQ,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,OAAO,CAAC;IAClB,OAAO,EAAE,6CAA6C;IACtD,KAAK,EAAE;QACL,4DAA4D;QAC5D,gEAAgE;QAChE,kDAAkD;QAClD,2EAA2E;QAC3E,gBAAgB;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACrC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACpC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACpC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;aAC1B;SACF,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,sCAAsC,CAAC,CAAC;YACrF,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,gCAAgC,IAAI,GAAG,CAAC,CAAC;YACxG,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,sCAAsC;IAC/C,KAAK,EAAE,qBAAqB;IAC5B,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;SAClD,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAC9E,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAG/C;AAED,eAAO,MAAM,eAAe,EAAE,OA2C7B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { findProjects, loadConfig, scanProjects } from "@dx/core";
|
|
3
|
+
import { c, relativeTime, table, tildify } from "../ui.js";
|
|
4
|
+
export function projectLabel(p) {
|
|
5
|
+
const kind = p.packageManager ? `${p.kind}/${p.packageManager}` : p.kind;
|
|
6
|
+
return `${c.bold(p.name)} ${c.dim(kind)} ${c.dim(relativeTime(p.lastActive))}`;
|
|
7
|
+
}
|
|
8
|
+
export const projectsCommand = {
|
|
9
|
+
name: "projects",
|
|
10
|
+
aliases: ["ls"],
|
|
11
|
+
summary: "List your projects, most recently active first",
|
|
12
|
+
usage: "dx projects [search] [--json]",
|
|
13
|
+
async run(argv) {
|
|
14
|
+
const { values, positionals } = parseArgs({
|
|
15
|
+
args: argv,
|
|
16
|
+
allowPositionals: true,
|
|
17
|
+
options: { json: { type: "boolean" } },
|
|
18
|
+
});
|
|
19
|
+
const config = loadConfig();
|
|
20
|
+
const all = scanProjects(config);
|
|
21
|
+
const query = positionals.join(" ");
|
|
22
|
+
const list = query ? findProjects(query, all).candidates : all;
|
|
23
|
+
if (values.json) {
|
|
24
|
+
console.log(JSON.stringify(list, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (all.length === 0) {
|
|
28
|
+
console.log(`No projects found in ${config.projectsRoots.map(tildify).join(", ")}.`);
|
|
29
|
+
console.log(c.dim("Add a folder with: dx config add-root <path>"));
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
if (list.length === 0) {
|
|
33
|
+
console.log(`No project matches "${query}".`);
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
console.log(table(["NAME", "TYPE", "ACTIVE", "DEV", "PATH"], list.map((p) => [
|
|
37
|
+
c.bold(p.name),
|
|
38
|
+
p.packageManager ? `${p.kind}/${p.packageManager}` : p.kind,
|
|
39
|
+
relativeTime(p.lastActive),
|
|
40
|
+
p.devCommand ? c.cyan(p.devCommand) : c.dim("—"),
|
|
41
|
+
c.dim(tildify(p.dir)),
|
|
42
|
+
])));
|
|
43
|
+
console.log(c.dim(`\n${list.length} project(s). Open one with: dx go <name>`));
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAC;AAEhF,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE3D,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,MAAM,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE,gDAAgD;IACzD,KAAK,EAAE,+BAA+B;IACtC,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;SACvC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;QAE/D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CACT,KAAK,CACH,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EACzC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACd,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACd,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YAC3D,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;YAC1B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YAChD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACtB,CAAC,CACH,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,0CAA0C,CAAC,CAAC,CAAC;IACjF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type Project } from "@dx/core";
|
|
2
|
+
import { type DashboardClient } from "@dx/web/link";
|
|
3
|
+
import type { Command } from "../command.js";
|
|
4
|
+
/**
|
|
5
|
+
* Stacks run in the dashboard, so they keep going when the terminal closes (dx up), or follow in
|
|
6
|
+
* this terminal and stop with Ctrl+C (dx go).
|
|
7
|
+
*/
|
|
8
|
+
interface DevInfo {
|
|
9
|
+
project: string;
|
|
10
|
+
dir: string;
|
|
11
|
+
status: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
localUrl?: string;
|
|
14
|
+
command: string;
|
|
15
|
+
service?: string;
|
|
16
|
+
role?: string;
|
|
17
|
+
errorCount: number;
|
|
18
|
+
lastLine: number;
|
|
19
|
+
services?: DevInfo[];
|
|
20
|
+
note?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Prints a stack's services with their addresses. */
|
|
23
|
+
export declare function printServices(server: DevInfo): void;
|
|
24
|
+
/** Starts a project (its stack, or its dev command) in the dashboard and waits until it's up. */
|
|
25
|
+
export declare function startInDashboard(project: Project, by?: "terminal" | "ai"): Promise<{
|
|
26
|
+
client: DashboardClient;
|
|
27
|
+
server: DevInfo;
|
|
28
|
+
}>;
|
|
29
|
+
/** Follows the output in this terminal until Ctrl+C, which stops it. */
|
|
30
|
+
export declare function follow(client: DashboardClient, project: Project, openWhenReady: boolean): Promise<number>;
|
|
31
|
+
export declare const upCommand: Command;
|
|
32
|
+
export declare const downCommand: Command;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"AACA,OAAO,EAA2E,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AACjH,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;GAGG;AACH,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiBD,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAUnD;AAED,iGAAiG;AACjG,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAE,UAAU,GAAG,IAAiB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAKlJ;AAED,wEAAwE;AACxE,wBAAsB,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiD/G;AAED,eAAO,MAAM,SAAS,EAAE,OAwBvB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAgBzB,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { findProjects, loadConfig, openUrl, readProject, recordRun, scanProjects } from "@dx/core";
|
|
3
|
+
import { ensureDashboard, findDashboard } from "@dx/web/link";
|
|
4
|
+
import { c, info, ok, UsageError, warn } from "../ui.js";
|
|
5
|
+
function resolve(query) {
|
|
6
|
+
if (!query || query === ".") {
|
|
7
|
+
const here = readProject(process.cwd());
|
|
8
|
+
if (here)
|
|
9
|
+
return here;
|
|
10
|
+
if (!query)
|
|
11
|
+
throw new UsageError("Which project? Give its name, or run this inside its folder.");
|
|
12
|
+
throw new UsageError(`${process.cwd()} doesn't look like a project.`);
|
|
13
|
+
}
|
|
14
|
+
const { match, candidates } = findProjects(query, scanProjects(loadConfig()));
|
|
15
|
+
const project = match ?? (candidates.length === 1 ? candidates[0] : undefined);
|
|
16
|
+
if (project)
|
|
17
|
+
return project;
|
|
18
|
+
throw new UsageError(candidates.length ? `Several projects match "${query}": ${candidates.slice(0, 8).map((p) => p.name).join(", ")}` : `No project matches "${query}".`);
|
|
19
|
+
}
|
|
20
|
+
const STATUS = { ready: c.green, starting: c.yellow, failed: c.red, stopped: c.dim };
|
|
21
|
+
/** Prints a stack's services with their addresses. */
|
|
22
|
+
export function printServices(server) {
|
|
23
|
+
const list = server.services ?? [server];
|
|
24
|
+
const width = Math.max(...list.map((s) => (s.service ?? s.project).length));
|
|
25
|
+
for (const s of list) {
|
|
26
|
+
const name = (s.service ?? s.project).padEnd(width);
|
|
27
|
+
const where = s.localUrl ?? s.url;
|
|
28
|
+
const errors = s.errorCount ? c.red(` ${s.errorCount} error(s)`) : "";
|
|
29
|
+
console.log(` ${c.bold(name)} ${(STATUS[s.status] ?? String)(s.status.padEnd(8))} ${where ? c.cyan(where) : c.dim(s.command)}${errors}`);
|
|
30
|
+
}
|
|
31
|
+
if (server.note)
|
|
32
|
+
warn(server.note);
|
|
33
|
+
}
|
|
34
|
+
/** Starts a project (its stack, or its dev command) in the dashboard and waits until it's up. */
|
|
35
|
+
export async function startInDashboard(project, by = "terminal") {
|
|
36
|
+
const client = await ensureDashboard();
|
|
37
|
+
await client.post("/api/dev/start", { dir: project.dir, by });
|
|
38
|
+
const r = await client.post("/api/dev/wait", { dir: project.dir, until: "ready", after: 0, timeoutMs: 120_000 }, 130_000);
|
|
39
|
+
return { client, server: r.server };
|
|
40
|
+
}
|
|
41
|
+
/** Follows the output in this terminal until Ctrl+C, which stops it. */
|
|
42
|
+
export async function follow(client, project, openWhenReady) {
|
|
43
|
+
let after = 0;
|
|
44
|
+
let opened = !openWhenReady;
|
|
45
|
+
const colors = [c.cyan, c.magenta, c.yellow, c.green, c.blue];
|
|
46
|
+
const serviceColor = new Map();
|
|
47
|
+
const tint = (svc) => {
|
|
48
|
+
if (!serviceColor.has(svc))
|
|
49
|
+
serviceColor.set(svc, colors[serviceColor.size % colors.length]);
|
|
50
|
+
return serviceColor.get(svc);
|
|
51
|
+
};
|
|
52
|
+
let interrupted = false;
|
|
53
|
+
const onInterrupt = () => {
|
|
54
|
+
interrupted = true;
|
|
55
|
+
};
|
|
56
|
+
process.on("SIGINT", onInterrupt);
|
|
57
|
+
try {
|
|
58
|
+
for (;;) {
|
|
59
|
+
const r = await client.get(`/api/dev/logs?dir=${encodeURIComponent(project.dir)}&after=${after}`);
|
|
60
|
+
for (const l of r.lines) {
|
|
61
|
+
const prefix = l.service ? tint(l.service)(`${l.service} │ `) : "";
|
|
62
|
+
console.log(prefix + (l.stream === "err" ? c.red(l.text) : l.stream === "dx" ? c.dim(l.text) : l.text));
|
|
63
|
+
after = l.n;
|
|
64
|
+
}
|
|
65
|
+
const server = r.server;
|
|
66
|
+
if (!opened && server?.status === "ready" && (server.localUrl ?? server.url)) {
|
|
67
|
+
opened = true;
|
|
68
|
+
const url = server.localUrl ?? server.url;
|
|
69
|
+
try {
|
|
70
|
+
await openUrl(url);
|
|
71
|
+
ok(`Ready, opened ${c.cyan(url)}`);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
ok(`Ready at ${c.cyan(url)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (interrupted) {
|
|
78
|
+
info("Stopping…");
|
|
79
|
+
await client.post("/api/dev/stop", { dir: project.dir });
|
|
80
|
+
recordRun("go", true, `${project.name} stopped with Ctrl+C`, "cli", { project: project.name });
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
if (!server || server.status === "stopped")
|
|
84
|
+
return 0;
|
|
85
|
+
// A stack keeps going when one service fails; a single dev server is done.
|
|
86
|
+
if (server.status === "failed" && !server.services)
|
|
87
|
+
return 1;
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
process.off("SIGINT", onInterrupt);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export const upCommand = {
|
|
96
|
+
name: "up",
|
|
97
|
+
summary: "Start a project's whole stack in the background (front end, API, databases…)",
|
|
98
|
+
usage: [
|
|
99
|
+
"dx up the project in this folder",
|
|
100
|
+
"dx up shop a project by name",
|
|
101
|
+
"dx up shop --open and open it in the browser",
|
|
102
|
+
"",
|
|
103
|
+
"Services start in order: databases, then back ends, then front ends. They run in the dx dashboard,",
|
|
104
|
+
"so they keep running after this terminal closes. dx down stops them; dx logs shop -f follows them.",
|
|
105
|
+
].join("\n"),
|
|
106
|
+
async run(argv) {
|
|
107
|
+
const { values, positionals } = parseArgs({ args: argv, allowPositionals: true, options: { open: { type: "boolean" } } });
|
|
108
|
+
const project = resolve(positionals[0]);
|
|
109
|
+
info(`Starting ${c.bold(project.name)}…`);
|
|
110
|
+
const { server } = await startInDashboard(project);
|
|
111
|
+
printServices(server);
|
|
112
|
+
const url = server.localUrl ?? server.url;
|
|
113
|
+
if (server.status === "ready")
|
|
114
|
+
ok(`${project.name} is up${url ? ` at ${c.cyan(url)}` : ""}`);
|
|
115
|
+
else
|
|
116
|
+
warn(`${project.name} is ${server.status}. dx logs ${project.name} shows why.`);
|
|
117
|
+
if (values.open && url)
|
|
118
|
+
await openUrl(url).catch(() => undefined);
|
|
119
|
+
recordRun("up", server.status === "ready", project.name, "cli", { project: project.name });
|
|
120
|
+
return server.status === "failed" ? 1 : 0;
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
export const downCommand = {
|
|
124
|
+
name: "down",
|
|
125
|
+
summary: "Stop a project's stack or dev server running in the dashboard",
|
|
126
|
+
usage: ["dx down the project in this folder", "dx down shop a project by name"].join("\n"),
|
|
127
|
+
async run(argv) {
|
|
128
|
+
const { positionals } = parseArgs({ args: argv, allowPositionals: true });
|
|
129
|
+
const project = resolve(positionals[0]);
|
|
130
|
+
const client = await findDashboard();
|
|
131
|
+
const server = client && (await client.post("/api/dev/stop", { dir: project.dir }));
|
|
132
|
+
if (!server) {
|
|
133
|
+
info(`${project.name} isn't running in the dashboard.`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
ok(`Stopped ${project.name}`);
|
|
137
|
+
recordRun("down", true, project.name, "cli", { project: project.name });
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,cAAc,EAAE,OAiE5B,CAAC"}
|