@meltemi/diagrams-cli 0.0.0-stage → 1.9.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/LICENSE +21 -0
- package/README.md +58 -2
- package/dist/assets-command.d.ts +16 -0
- package/dist/assets-command.d.ts.map +1 -0
- package/dist/assets-command.js +145 -0
- package/dist/assets-command.js.map +1 -0
- package/dist/assist-command.d.ts +19 -0
- package/dist/assist-command.d.ts.map +1 -0
- package/dist/assist-command.js +268 -0
- package/dist/assist-command.js.map +1 -0
- package/dist/auth-command.d.ts +14 -0
- package/dist/auth-command.d.ts.map +1 -0
- package/dist/auth-command.js +233 -0
- package/dist/auth-command.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +60 -0
- package/dist/bin.js.map +1 -0
- package/dist/build-command.d.ts +23 -0
- package/dist/build-command.d.ts.map +1 -0
- package/dist/build-command.js +123 -0
- package/dist/build-command.js.map +1 -0
- package/dist/cli.d.ts +46 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +823 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +246 -0
- package/dist/cloud-client.d.ts.map +1 -0
- package/dist/cloud-client.js +591 -0
- package/dist/cloud-client.js.map +1 -0
- package/dist/cloud-command.d.ts +56 -0
- package/dist/cloud-command.d.ts.map +1 -0
- package/dist/cloud-command.js +81 -0
- package/dist/cloud-command.js.map +1 -0
- package/dist/cloud-context.d.ts +106 -0
- package/dist/cloud-context.d.ts.map +1 -0
- package/dist/cloud-context.js +185 -0
- package/dist/cloud-context.js.map +1 -0
- package/dist/cloud-errors.d.ts +37 -0
- package/dist/cloud-errors.d.ts.map +1 -0
- package/dist/cloud-errors.js +46 -0
- package/dist/cloud-errors.js.map +1 -0
- package/dist/cloud-host.d.ts +72 -0
- package/dist/cloud-host.d.ts.map +1 -0
- package/dist/cloud-host.js +129 -0
- package/dist/cloud-host.js.map +1 -0
- package/dist/cloud-manifest.d.ts +12 -0
- package/dist/cloud-manifest.d.ts.map +1 -0
- package/dist/cloud-manifest.js +21 -0
- package/dist/cloud-manifest.js.map +1 -0
- package/dist/cloud-paths.d.ts +48 -0
- package/dist/cloud-paths.d.ts.map +1 -0
- package/dist/cloud-paths.js +104 -0
- package/dist/cloud-paths.js.map +1 -0
- package/dist/credentials.d.ts +107 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +243 -0
- package/dist/credentials.js.map +1 -0
- package/dist/export-command.d.ts +35 -0
- package/dist/export-command.d.ts.map +1 -0
- package/dist/export-command.js +524 -0
- package/dist/export-command.js.map +1 -0
- package/dist/import-command.d.ts +20 -0
- package/dist/import-command.d.ts.map +1 -0
- package/dist/import-command.js +254 -0
- package/dist/import-command.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/init-command.d.ts +28 -0
- package/dist/init-command.d.ts.map +1 -0
- package/dist/init-command.js +199 -0
- package/dist/init-command.js.map +1 -0
- package/dist/login-listener.d.ts +58 -0
- package/dist/login-listener.d.ts.map +1 -0
- package/dist/login-listener.js +173 -0
- package/dist/login-listener.js.map +1 -0
- package/dist/messages/en.d.ts +533 -0
- package/dist/messages/en.d.ts.map +1 -0
- package/dist/messages/en.js +803 -0
- package/dist/messages/en.js.map +1 -0
- package/dist/messages/es.d.ts +3 -0
- package/dist/messages/es.d.ts.map +1 -0
- package/dist/messages/es.js +764 -0
- package/dist/messages/es.js.map +1 -0
- package/dist/messages/index.d.ts +442 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +42 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/push-pull-en.d.ts +84 -0
- package/dist/messages/push-pull-en.d.ts.map +1 -0
- package/dist/messages/push-pull-en.js +146 -0
- package/dist/messages/push-pull-en.js.map +1 -0
- package/dist/messages/push-pull-es.d.ts +7 -0
- package/dist/messages/push-pull-es.d.ts.map +1 -0
- package/dist/messages/push-pull-es.js +144 -0
- package/dist/messages/push-pull-es.js.map +1 -0
- package/dist/open-url.d.ts +11 -0
- package/dist/open-url.d.ts.map +1 -0
- package/dist/open-url.js +36 -0
- package/dist/open-url.js.map +1 -0
- package/dist/plugins-command.d.ts +15 -0
- package/dist/plugins-command.d.ts.map +1 -0
- package/dist/plugins-command.js +106 -0
- package/dist/plugins-command.js.map +1 -0
- package/dist/preview.d.ts +54 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +249 -0
- package/dist/preview.js.map +1 -0
- package/dist/project-errors.d.ts +17 -0
- package/dist/project-errors.d.ts.map +1 -0
- package/dist/project-errors.js +85 -0
- package/dist/project-errors.js.map +1 -0
- package/dist/projects-command.d.ts +13 -0
- package/dist/projects-command.d.ts.map +1 -0
- package/dist/projects-command.js +85 -0
- package/dist/projects-command.js.map +1 -0
- package/dist/publish-command.d.ts +41 -0
- package/dist/publish-command.d.ts.map +1 -0
- package/dist/publish-command.js +311 -0
- package/dist/publish-command.js.map +1 -0
- package/dist/pull-command.d.ts +21 -0
- package/dist/pull-command.d.ts.map +1 -0
- package/dist/pull-command.js +300 -0
- package/dist/pull-command.js.map +1 -0
- package/dist/push-command.d.ts +31 -0
- package/dist/push-command.d.ts.map +1 -0
- package/dist/push-command.js +391 -0
- package/dist/push-command.js.map +1 -0
- package/dist/push-review.d.ts +16 -0
- package/dist/push-review.d.ts.map +1 -0
- package/dist/push-review.js +72 -0
- package/dist/push-review.js.map +1 -0
- package/dist/push-set.d.ts +126 -0
- package/dist/push-set.d.ts.map +1 -0
- package/dist/push-set.js +289 -0
- package/dist/push-set.js.map +1 -0
- package/dist/push-validation.d.ts +20 -0
- package/dist/push-validation.d.ts.map +1 -0
- package/dist/push-validation.js +70 -0
- package/dist/push-validation.js.map +1 -0
- package/dist/redact.d.ts +9 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +22 -0
- package/dist/redact.js.map +1 -0
- package/dist/review-command.d.ts +44 -0
- package/dist/review-command.d.ts.map +1 -0
- package/dist/review-command.js +348 -0
- package/dist/review-command.js.map +1 -0
- package/package.json +56 -3
- package/templates/c4/diagrams/views.meltemi +16 -0
- package/templates/c4/models/system.meltemi +23 -0
- package/templates/ci/github.yml +96 -0
- package/templates/ci/gitlab.yml +53 -0
- package/templates/flow/diagrams/overview.meltemi +15 -0
- package/templates/free/diagrams/slide.meltemi +39 -0
- package/templates/purchase/diagrams/architecture.meltemi +36 -0
- package/templates/purchase/diagrams/executive.meltemi +52 -0
- package/templates/purchase/diagrams/payment.meltemi +42 -0
- package/templates/purchase/models/commerce.meltemi +30 -0
- package/templates/purchase/stories/purchase.meltemi +38 -0
- package/templates/sequence/diagrams/sign-in.meltemi +36 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
import { IMPORT_EXTENSIONS, importText, mergeImport, stemOf, } from "@meltemi/diagrams-import";
|
|
5
|
+
import { toProjectPath } from "@meltemi/diagrams-project";
|
|
6
|
+
import { argumentsError, messages } from "./messages/index.js";
|
|
7
|
+
const EXIT_OK = 0;
|
|
8
|
+
const EXIT_FINDINGS = 1;
|
|
9
|
+
const EXIT_USAGE = 2;
|
|
10
|
+
const FORMATS = ["mermaid", "plantuml", "markdown"];
|
|
11
|
+
/** Every importable file below a folder, sorted; hidden folders and `node_modules` are skipped. */
|
|
12
|
+
function importableFiles(folder) {
|
|
13
|
+
const found = [];
|
|
14
|
+
const walk = (dir) => {
|
|
15
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
16
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
17
|
+
continue;
|
|
18
|
+
const path = join(dir, entry.name);
|
|
19
|
+
if (entry.isDirectory())
|
|
20
|
+
walk(path);
|
|
21
|
+
else {
|
|
22
|
+
const extension = entry.name.slice(entry.name.lastIndexOf(".") + 1).toLowerCase();
|
|
23
|
+
// Include files are imported through the files that include them.
|
|
24
|
+
if (extension !== "iuml" && IMPORT_EXTENSIONS.includes(extension))
|
|
25
|
+
found.push(path);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
walk(folder);
|
|
30
|
+
return found.sort();
|
|
31
|
+
}
|
|
32
|
+
/** `meltemi-diagrams import <file or folder>`. */
|
|
33
|
+
export function importCommand(args, context) {
|
|
34
|
+
const fail = (message) => {
|
|
35
|
+
context.stderr(`${context.name} import: ${message}\n`);
|
|
36
|
+
return EXIT_USAGE;
|
|
37
|
+
};
|
|
38
|
+
let options;
|
|
39
|
+
let paths;
|
|
40
|
+
try {
|
|
41
|
+
const parsed = parseArgs({
|
|
42
|
+
args: [...args],
|
|
43
|
+
options: {
|
|
44
|
+
from: { type: "string" },
|
|
45
|
+
out: { type: "string" },
|
|
46
|
+
force: { type: "boolean", default: false },
|
|
47
|
+
merge: { type: "boolean", default: false },
|
|
48
|
+
check: { type: "boolean", default: false },
|
|
49
|
+
json: { type: "boolean", default: false },
|
|
50
|
+
help: { type: "boolean", short: "h", default: false },
|
|
51
|
+
},
|
|
52
|
+
allowPositionals: true,
|
|
53
|
+
strict: true,
|
|
54
|
+
});
|
|
55
|
+
options = parsed.values;
|
|
56
|
+
paths = parsed.positionals;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return fail(argumentsError(error));
|
|
60
|
+
}
|
|
61
|
+
const t = messages().import;
|
|
62
|
+
if (options.help) {
|
|
63
|
+
context.stdout(messages().help.import);
|
|
64
|
+
return EXIT_OK;
|
|
65
|
+
}
|
|
66
|
+
if (paths.length !== 1)
|
|
67
|
+
return fail(t.oneSource);
|
|
68
|
+
if (options.from !== undefined && !FORMATS.includes(options.from)) {
|
|
69
|
+
return fail(t.from(options.from, FORMATS));
|
|
70
|
+
}
|
|
71
|
+
if (options.force && options.merge)
|
|
72
|
+
return fail(t.forceAndMerge);
|
|
73
|
+
const source = isAbsolute(paths[0]) ? paths[0] : resolve(context.cwd, paths[0]);
|
|
74
|
+
let folder = false;
|
|
75
|
+
try {
|
|
76
|
+
folder = statSync(source).isDirectory();
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Reading the file reports it.
|
|
80
|
+
}
|
|
81
|
+
if (!folder) {
|
|
82
|
+
const out = options.out !== undefined
|
|
83
|
+
? resolve(context.cwd, options.out)
|
|
84
|
+
: join(dirname(source), `${stemOf(source)}.meltemi`);
|
|
85
|
+
const result = importFile(context, source, out, options, false);
|
|
86
|
+
if (typeof result === "string")
|
|
87
|
+
return fail(result);
|
|
88
|
+
if (options.json) {
|
|
89
|
+
const { refused: _refused, ...report } = result;
|
|
90
|
+
context.stdout(`${JSON.stringify(report, null, 2)}\n`);
|
|
91
|
+
}
|
|
92
|
+
if (result.refused || result.status === "failed")
|
|
93
|
+
return EXIT_USAGE;
|
|
94
|
+
return result.status === "partial" ? EXIT_FINDINGS : EXIT_OK;
|
|
95
|
+
}
|
|
96
|
+
if (options.from !== undefined)
|
|
97
|
+
return fail(t.fromInFolder);
|
|
98
|
+
const files = importableFiles(source);
|
|
99
|
+
if (files.length === 0)
|
|
100
|
+
return fail(t.noSources(context.display(source)));
|
|
101
|
+
const outRoot = options.out === undefined ? null : resolve(context.cwd, options.out);
|
|
102
|
+
const reports = [];
|
|
103
|
+
let passed = 0;
|
|
104
|
+
for (const file of files) {
|
|
105
|
+
const out = outRoot === null
|
|
106
|
+
? join(dirname(file), `${stemOf(file)}.meltemi`)
|
|
107
|
+
: join(outRoot, dirname(relative(source, file)), `${stemOf(file)}.meltemi`);
|
|
108
|
+
const result = importFile(context, file, out, options, true);
|
|
109
|
+
if (typeof result === "string") {
|
|
110
|
+
context.stderr(`${context.name} import: ${result}\n`);
|
|
111
|
+
reports.push({
|
|
112
|
+
source: context.display(file),
|
|
113
|
+
output: context.display(out),
|
|
114
|
+
status: "failed",
|
|
115
|
+
written: false,
|
|
116
|
+
refused: false,
|
|
117
|
+
diagrams: [],
|
|
118
|
+
findings: [],
|
|
119
|
+
merge: [],
|
|
120
|
+
coverage: [],
|
|
121
|
+
});
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// A Markdown file without diagram blocks is documentation, not a failed import.
|
|
125
|
+
if (result.status === "failed" && /\.(md|markdown)$/i.test(file) && !result.written) {
|
|
126
|
+
passed++;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
reports.push(result);
|
|
130
|
+
}
|
|
131
|
+
const count = (status) => reports.filter((r) => r.status === status).length;
|
|
132
|
+
const refused = reports.filter((r) => r.refused).length;
|
|
133
|
+
if (options.json) {
|
|
134
|
+
context.stdout(`${JSON.stringify({
|
|
135
|
+
folder: context.display(source),
|
|
136
|
+
files: reports.map(({ refused: _refused, ...report }) => report),
|
|
137
|
+
skipped: passed,
|
|
138
|
+
}, null, 2)}\n`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const parts = [
|
|
142
|
+
t.folder.complete(count("complete")),
|
|
143
|
+
t.folder.partial(count("partial")),
|
|
144
|
+
...(count("failed") > 0 ? [t.folder.failed(count("failed"))] : []),
|
|
145
|
+
...(refused > 0 ? [t.folder.notReplaced(refused)] : []),
|
|
146
|
+
...(passed > 0 ? [t.folder.withoutDiagrams(passed)] : []),
|
|
147
|
+
];
|
|
148
|
+
context.stdout(`${t.folderSummary(options.check, reports.length, context.display(source), parts)}\n`);
|
|
149
|
+
}
|
|
150
|
+
if (refused > 0 || count("failed") > 0)
|
|
151
|
+
return EXIT_USAGE;
|
|
152
|
+
return count("partial") > 0 ? EXIT_FINDINGS : EXIT_OK;
|
|
153
|
+
}
|
|
154
|
+
/** Imports one file into `out`; the report, or a message when it cannot even be read. */
|
|
155
|
+
function importFile(context, source, out, options, quietNothing) {
|
|
156
|
+
let text;
|
|
157
|
+
try {
|
|
158
|
+
text = readFileSync(source, "utf8");
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
return messages().common.cannotRead(context.display(source), error.message);
|
|
162
|
+
}
|
|
163
|
+
const t = messages().import;
|
|
164
|
+
if (out === source)
|
|
165
|
+
return t.replacesSource;
|
|
166
|
+
// Includes stay inside the source's project, or its folder when it has none.
|
|
167
|
+
const workspace = context.workspaceFor(toProjectPath(source));
|
|
168
|
+
const registry = workspace.assets().registry;
|
|
169
|
+
const result = importText(text, {
|
|
170
|
+
...(options.from !== undefined ? { format: options.from } : {}),
|
|
171
|
+
fileName: toProjectPath(source),
|
|
172
|
+
includeRoot: workspace.root,
|
|
173
|
+
readFile: (path) => {
|
|
174
|
+
try {
|
|
175
|
+
return readFileSync(path, "utf8");
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
hasIcon: (name) => registry.lookup(name).status === "found",
|
|
182
|
+
locale: context.contentLocale(workspace),
|
|
183
|
+
});
|
|
184
|
+
const sourceName = context.display(source);
|
|
185
|
+
const outName = context.display(out);
|
|
186
|
+
let sheet = result.text;
|
|
187
|
+
let mergeFindings = [];
|
|
188
|
+
const exists = existsSync(out);
|
|
189
|
+
let refused = false;
|
|
190
|
+
if (sheet !== null && exists) {
|
|
191
|
+
if (options.merge) {
|
|
192
|
+
try {
|
|
193
|
+
const merged = mergeImport(readFileSync(out, "utf8"), sheet);
|
|
194
|
+
sheet = merged.text;
|
|
195
|
+
mergeFindings = merged.findings;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return messages().common.cannotRead(outName, error.message);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (!options.force)
|
|
202
|
+
refused = true;
|
|
203
|
+
}
|
|
204
|
+
const written = sheet !== null && !refused && !options.check;
|
|
205
|
+
if (written) {
|
|
206
|
+
try {
|
|
207
|
+
mkdirSync(dirname(out), { recursive: true });
|
|
208
|
+
writeFileSync(out, sheet, "utf8");
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return messages().common.cannotWrite(outName, error.message);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (!options.json && !(quietNothing && sheet === null)) {
|
|
215
|
+
printFindings(context, sourceName, result.findings);
|
|
216
|
+
printFindings(context, outName, mergeFindings);
|
|
217
|
+
for (const c of result.coverage) {
|
|
218
|
+
context.stdout(`${t.coverage(c.diagram, c.mapped, c.approximated, c.dropped)}\n`);
|
|
219
|
+
}
|
|
220
|
+
const status = t.status[result.status];
|
|
221
|
+
if (refused) {
|
|
222
|
+
context.stderr(`${context.name} import: ${t.exists(outName)}\n`);
|
|
223
|
+
}
|
|
224
|
+
else if (sheet === null) {
|
|
225
|
+
context.stderr(`${context.name} import: ${t.nothing(sourceName)}\n`);
|
|
226
|
+
}
|
|
227
|
+
else if (options.check) {
|
|
228
|
+
context.stdout(`${t.wouldImport(sourceName, outName, status)}\n`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
context.stdout(`${t.imported(sourceName, outName, status, options.merge && exists)}\n`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
source: sourceName,
|
|
236
|
+
output: outName,
|
|
237
|
+
status: result.status,
|
|
238
|
+
written,
|
|
239
|
+
refused,
|
|
240
|
+
diagrams: result.diagrams,
|
|
241
|
+
findings: result.findings,
|
|
242
|
+
merge: mergeFindings,
|
|
243
|
+
coverage: result.coverage,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
function printFindings(context, path, findings) {
|
|
247
|
+
for (const f of findings) {
|
|
248
|
+
context.stdout(`${path}:${f.range.start.line}:${f.range.start.column}: ${f.severity} ${f.code} ${f.message}\n`);
|
|
249
|
+
for (const hint of f.hints ?? []) {
|
|
250
|
+
context.stdout(` ${messages().common.hint}: ${hint}\n`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=import-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-command.js","sourceRoot":"","sources":["../src/import-command.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "@meltemi/diagrams-cli";
|
|
2
|
+
export { MELTEMI_EXTENSION, CLI_NAME, CLI_VERSION, EXIT_AUTH, EXIT_FINDINGS, EXIT_OK, EXIT_USAGE, run, type CliIo, } from "./cli.js";
|
|
3
|
+
export { redactSecrets } from "./redact.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAEpD,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,OAAO,EACP,UAAU,EACV,GAAG,EACH,KAAK,KAAK,GACX,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAEpD,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,OAAO,EACP,UAAU,EACV,GAAG,GAEJ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { TEMPLATES, type TemplateName } from "@meltemi/diagrams-project";
|
|
2
|
+
export { TEMPLATES, type TemplateName };
|
|
3
|
+
/** What the init command needs from the CLI. */
|
|
4
|
+
export interface InitContext {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly stdout: (text: string) => void;
|
|
7
|
+
readonly stderr: (text: string) => void;
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
/** A path as printed: relative to the working folder. */
|
|
10
|
+
readonly display: (path: string) => string;
|
|
11
|
+
readonly toolVersion: string;
|
|
12
|
+
readonly languageVersion: string;
|
|
13
|
+
}
|
|
14
|
+
/** The CI services `--ci` writes a workflow for. */
|
|
15
|
+
export declare const CI_SERVICES: readonly ["github", "gitlab"];
|
|
16
|
+
/** The files of a template, relative to its folder, sorted. */
|
|
17
|
+
export declare function templateFiles(template: TemplateName): string[];
|
|
18
|
+
/**
|
|
19
|
+
* A CI template with its cloud job in or out. The job that pushes to the cloud sits at the end of
|
|
20
|
+
* the template between two marker comments (`# {{cloud-begin}}` and `# {{cloud-end}}`, so that the
|
|
21
|
+
* template is the workflow one reads and Prettier keeps it as it is): `--cloud` keeps the job and
|
|
22
|
+
* drops the markers, and without it the job goes, with the blank line before it, so that the
|
|
23
|
+
* workflow is byte for byte what it was before the job existed.
|
|
24
|
+
*/
|
|
25
|
+
export declare function withCloudJob(template: string, cloud: boolean): string;
|
|
26
|
+
/** `meltemi-diagrams init`. */
|
|
27
|
+
export declare function initCommand(args: readonly string[], context: InitContext): number;
|
|
28
|
+
//# sourceMappingURL=init-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.d.ts","sourceRoot":"","sources":["../src/init-command.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAoB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG3F,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,CAAC;AAExC,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,oDAAoD;AACpD,eAAO,MAAM,WAAW,+BAAgC,CAAC;AAQzD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAY9D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAIrE;AA6DD,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CA0GjF"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { parseArgs } from "node:util";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { TEMPLATES, templateManifest } from "@meltemi/diagrams-project";
|
|
7
|
+
import { argumentsError, messages } from "./messages/index.js";
|
|
8
|
+
export { TEMPLATES };
|
|
9
|
+
/** The CI services `--ci` writes a workflow for. */
|
|
10
|
+
export const CI_SERVICES = ["github", "gitlab"];
|
|
11
|
+
const EXIT_OK = 0;
|
|
12
|
+
const EXIT_USAGE = 2;
|
|
13
|
+
/** The folder of the templates: `templates/` beside `src/` and `dist/`. */
|
|
14
|
+
const TEMPLATE_ROOT = fileURLToPath(new URL("../templates/", import.meta.url));
|
|
15
|
+
/** The files of a template, relative to its folder, sorted. */
|
|
16
|
+
export function templateFiles(template) {
|
|
17
|
+
const root = join(TEMPLATE_ROOT, template);
|
|
18
|
+
const found = [];
|
|
19
|
+
const walk = (dir) => {
|
|
20
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
21
|
+
const path = join(dir, entry.name);
|
|
22
|
+
if (entry.isDirectory())
|
|
23
|
+
walk(path);
|
|
24
|
+
else
|
|
25
|
+
found.push(relative(root, path).split(sep).join("/"));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
walk(root);
|
|
29
|
+
return found.sort();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A CI template with its cloud job in or out. The job that pushes to the cloud sits at the end of
|
|
33
|
+
* the template between two marker comments (`# {{cloud-begin}}` and `# {{cloud-end}}`, so that the
|
|
34
|
+
* template is the workflow one reads and Prettier keeps it as it is): `--cloud` keeps the job and
|
|
35
|
+
* drops the markers, and without it the job goes, with the blank line before it, so that the
|
|
36
|
+
* workflow is byte for byte what it was before the job existed.
|
|
37
|
+
*/
|
|
38
|
+
export function withCloudJob(template, cloud) {
|
|
39
|
+
return cloud
|
|
40
|
+
? template.replace(/^ *# \{\{cloud-(?:begin|end)\}\}\n/gm, "")
|
|
41
|
+
: template.replace(/\n *# \{\{cloud-begin\}\}\n[\s\S]*?\n *# \{\{cloud-end\}\}\n/, "");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The Git working tree that holds `folder`, or null, spelled as `folder` is: Git answers with the
|
|
45
|
+
* long form of a path, and a folder reached through a Windows short name (`RUNNER~1`) would
|
|
46
|
+
* otherwise lie outside it, so the top is reached by climbing from `folder` as far as Git's top is
|
|
47
|
+
* above it.
|
|
48
|
+
*/
|
|
49
|
+
function gitTop(folder) {
|
|
50
|
+
const result = spawnSync("git", ["rev-parse", "--show-toplevel"], {
|
|
51
|
+
cwd: folder,
|
|
52
|
+
encoding: "utf8",
|
|
53
|
+
windowsHide: true,
|
|
54
|
+
});
|
|
55
|
+
if (result.status !== 0)
|
|
56
|
+
return null;
|
|
57
|
+
const top = resolve(result.stdout.trim());
|
|
58
|
+
try {
|
|
59
|
+
return resolve(folder, relative(realpathSync.native(folder), realpathSync.native(top)));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return top;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Writes the CI workflow of a project: at the top of its Git working tree when it has one, with
|
|
67
|
+
* the project's path from there. A message when a workflow is already there.
|
|
68
|
+
*/
|
|
69
|
+
function writeCi(service, folder, context, written, cloud) {
|
|
70
|
+
const top = gitTop(folder) ?? folder;
|
|
71
|
+
const project = relative(top, folder).split(sep).join("/") || ".";
|
|
72
|
+
const text = withCloudJob(readFileSync(join(TEMPLATE_ROOT, "ci", `${service}.yml`), "utf8"), cloud)
|
|
73
|
+
.replaceAll("{{project}}", () => project)
|
|
74
|
+
.replaceAll("{{version}}", () => context.toolVersion);
|
|
75
|
+
const t = messages().init;
|
|
76
|
+
let target;
|
|
77
|
+
if (service === "github") {
|
|
78
|
+
target = join(top, ".github", "workflows", "meltemi-diagrams.yml");
|
|
79
|
+
if (existsSync(target))
|
|
80
|
+
return t.exists(context.display(target));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
target = join(top, ".gitlab-ci.yml");
|
|
84
|
+
if (existsSync(target)) {
|
|
85
|
+
target = join(top, ".gitlab", "meltemi-diagrams.yml");
|
|
86
|
+
if (existsSync(target))
|
|
87
|
+
return t.exists(context.display(target));
|
|
88
|
+
context.stdout(t.gitlab);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
92
|
+
writeFileSync(target, text);
|
|
93
|
+
written.push(target);
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
/** `meltemi-diagrams init`. */
|
|
97
|
+
export function initCommand(args, context) {
|
|
98
|
+
const fail = (message) => {
|
|
99
|
+
context.stderr(`${context.name} init: ${message}\n`);
|
|
100
|
+
return EXIT_USAGE;
|
|
101
|
+
};
|
|
102
|
+
let options;
|
|
103
|
+
let paths;
|
|
104
|
+
try {
|
|
105
|
+
const parsed = parseArgs({
|
|
106
|
+
args: [...args],
|
|
107
|
+
options: {
|
|
108
|
+
template: { type: "string" },
|
|
109
|
+
name: { type: "string" },
|
|
110
|
+
list: { type: "boolean", default: false },
|
|
111
|
+
ci: { type: "string" },
|
|
112
|
+
cloud: { type: "boolean", default: false },
|
|
113
|
+
help: { type: "boolean", short: "h", default: false },
|
|
114
|
+
},
|
|
115
|
+
allowPositionals: true,
|
|
116
|
+
strict: true,
|
|
117
|
+
});
|
|
118
|
+
options = parsed.values;
|
|
119
|
+
paths = parsed.positionals;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return fail(argumentsError(error));
|
|
123
|
+
}
|
|
124
|
+
const t = messages().init;
|
|
125
|
+
const names = Object.keys(TEMPLATES);
|
|
126
|
+
if (options.help) {
|
|
127
|
+
context.stdout(messages().help.init(names.join(", ")));
|
|
128
|
+
return EXIT_OK;
|
|
129
|
+
}
|
|
130
|
+
if (options.list) {
|
|
131
|
+
const width = Math.max(...names.map((n) => n.length));
|
|
132
|
+
for (const name of names)
|
|
133
|
+
context.stdout(`${name.padEnd(width)} ${t.templates[name]}\n`);
|
|
134
|
+
return EXIT_OK;
|
|
135
|
+
}
|
|
136
|
+
if (paths.length > 1)
|
|
137
|
+
return fail(t.oneFolder);
|
|
138
|
+
const template = (options.template ?? "flow");
|
|
139
|
+
if (!(template in TEMPLATES))
|
|
140
|
+
return fail(t.noTemplate(String(options.template), names));
|
|
141
|
+
if (options.ci !== undefined && !CI_SERVICES.includes(options.ci)) {
|
|
142
|
+
return fail(t.ci(options.ci, CI_SERVICES));
|
|
143
|
+
}
|
|
144
|
+
// The push job is a part of the workflow: there is nothing for `--cloud` to change without one.
|
|
145
|
+
if (options.cloud && options.ci === undefined)
|
|
146
|
+
return fail(t.cloudNeedsCi(CI_SERVICES));
|
|
147
|
+
if (options.name !== undefined && options.name.trim() === "")
|
|
148
|
+
return fail(t.name);
|
|
149
|
+
const folder = resolve(context.cwd, paths[0] ?? ".");
|
|
150
|
+
if (existsSync(folder) && !statSync(folder).isDirectory()) {
|
|
151
|
+
return fail(t.notAFolder(context.display(folder)));
|
|
152
|
+
}
|
|
153
|
+
const written = [];
|
|
154
|
+
const manifest = join(folder, "project.json");
|
|
155
|
+
if (existsSync(manifest)) {
|
|
156
|
+
// An existing project only gets its CI workflow.
|
|
157
|
+
if (options.ci === undefined || options.template !== undefined || options.name !== undefined) {
|
|
158
|
+
return fail(t.alreadyAProject(context.display(folder)));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const files = templateFiles(template);
|
|
163
|
+
const clash = files.map((f) => join(folder, ...f.split("/"))).find((f) => existsSync(f));
|
|
164
|
+
if (clash)
|
|
165
|
+
return fail(t.clash(context.display(clash)));
|
|
166
|
+
const name = options.name?.trim() ?? (basename(folder) || "diagrams");
|
|
167
|
+
mkdirSync(folder, { recursive: true });
|
|
168
|
+
writeFileSync(manifest, templateManifest(name, template, context));
|
|
169
|
+
written.push(manifest);
|
|
170
|
+
for (const file of files) {
|
|
171
|
+
const target = join(folder, ...file.split("/"));
|
|
172
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
173
|
+
writeFileSync(target, readFileSync(join(TEMPLATE_ROOT, template, ...file.split("/"))));
|
|
174
|
+
written.push(target);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (options.ci !== undefined) {
|
|
178
|
+
const problem = writeCi(options.ci, folder, context, written, options.cloud);
|
|
179
|
+
if (problem)
|
|
180
|
+
return fail(problem);
|
|
181
|
+
}
|
|
182
|
+
for (const path of written)
|
|
183
|
+
context.stdout(`${t.created(context.display(path))}\n`);
|
|
184
|
+
if (options.cloud)
|
|
185
|
+
context.stdout(`${t.cloudNote("MELTEMI_TOKEN")}\n`);
|
|
186
|
+
if (written.includes(manifest)) {
|
|
187
|
+
const at = context.display(folder);
|
|
188
|
+
context.stdout([
|
|
189
|
+
"",
|
|
190
|
+
t.next,
|
|
191
|
+
` ${context.name} validate ${at}`,
|
|
192
|
+
` ${context.name} preview ${at}`,
|
|
193
|
+
` ${context.name} build catalog ${at}`,
|
|
194
|
+
"",
|
|
195
|
+
].join("\n"));
|
|
196
|
+
}
|
|
197
|
+
return EXIT_OK;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=init-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.js","sourceRoot":"","sources":["../src/init-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The half of `mdg login` that runs on this computer (`cli-cloud`, "Signing in from the command
|
|
3
|
+
* line"): a listener on `127.0.0.1` at a random port that the approval page redirects the browser
|
|
4
|
+
* to, with the one-time `code` and the `state` of this request.
|
|
5
|
+
*
|
|
6
|
+
* It answers `GET /` with a `code` and a `state` and nothing else (anything else is refused and the
|
|
7
|
+
* wait goes on), checks the `Host` header so that a name that resolves to this machine is no way in,
|
|
8
|
+
* stops listening the moment the first such request arrives, and answers the browser only when the
|
|
9
|
+
* caller says how signing in ended, so the page never claims more than the truth. The code is never
|
|
10
|
+
* printed or logged.
|
|
11
|
+
*/
|
|
12
|
+
import { type Locale } from "@meltemi/diagrams-i18n";
|
|
13
|
+
/** How long a person has to approve: five minutes, as the service's one-time code lives. */
|
|
14
|
+
export declare const LOGIN_TIMEOUT_MS: number;
|
|
15
|
+
/** RFC 4648 base32, upper case and without padding, of bytes. */
|
|
16
|
+
export declare function base32(bytes: Uint8Array): string;
|
|
17
|
+
/**
|
|
18
|
+
* The six characters the approval page shows for a `state`: the first six of the base32 of its
|
|
19
|
+
* SHA-256, so that a person can tell their own terminal's request from somebody else's.
|
|
20
|
+
*/
|
|
21
|
+
export declare function approvalCheck(state: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* The language of a page from an `Accept-Language` header: the first language, by preference, that
|
|
24
|
+
* is English or Spanish; the fallback when the header names neither.
|
|
25
|
+
*/
|
|
26
|
+
export declare function languageOf(header: string | undefined, fallback?: Locale): Locale;
|
|
27
|
+
/** The small page the browser lands on: done, or that signing in did not finish. */
|
|
28
|
+
export declare function donePage(locale: Locale, finished: boolean): string;
|
|
29
|
+
/** The one-time code and the state a request brought, and the way to answer the browser. */
|
|
30
|
+
export interface Arrival {
|
|
31
|
+
readonly code: string;
|
|
32
|
+
readonly state: string;
|
|
33
|
+
/** Answers the browser: `true` when signing in finished, `false` when it did not. Once. */
|
|
34
|
+
reply(finished: boolean): void;
|
|
35
|
+
}
|
|
36
|
+
export interface Approval {
|
|
37
|
+
/** The port the listener is on. */
|
|
38
|
+
readonly port: number;
|
|
39
|
+
/**
|
|
40
|
+
* Resolves with the first request that brought a `code` and a `state`, or with `timeout` when
|
|
41
|
+
* none came in time. The listener is closed by then (nothing more is accepted), and what was
|
|
42
|
+
* left open is closed once the arrival is answered.
|
|
43
|
+
*/
|
|
44
|
+
readonly outcome: Promise<Arrival | "timeout">;
|
|
45
|
+
/** Stops listening and drops every connection; safe to call more than once. */
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export interface ListenOptions {
|
|
49
|
+
/** Milliseconds to wait for the approval. */
|
|
50
|
+
readonly timeoutMs: number;
|
|
51
|
+
/** The language of the page when the browser's `Accept-Language` names neither of ours. */
|
|
52
|
+
readonly fallbackLocale?: Locale;
|
|
53
|
+
}
|
|
54
|
+
/** Whether two texts are equal, in time that does not depend on where they differ. */
|
|
55
|
+
export declare function sameText(a: string, b: string): boolean;
|
|
56
|
+
/** Starts the listener on `127.0.0.1` at a free port. */
|
|
57
|
+
export declare function listenForApproval(options: ListenOptions): Promise<Approval>;
|
|
58
|
+
//# sourceMappingURL=login-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-listener.d.ts","sourceRoot":"","sources":["../src/login-listener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAA4C,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAG/F,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,QAAgB,CAAC;AAI9C,iEAAiE;AACjE,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAehD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,GAAE,MAAuB,GAAG,MAAM,CAgBhG;AAKD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAiBlE;AAED,4FAA4F;AAC5F,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC/C,+EAA+E;IAC/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAItD;AAOD,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CA2E3E"}
|