@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,173 @@
|
|
|
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 { createHash, timingSafeEqual } from "node:crypto";
|
|
13
|
+
import { createServer } from "node:http";
|
|
14
|
+
import { DEFAULT_LOCALE, getLocale, resolveLocale } from "@meltemi/diagrams-i18n";
|
|
15
|
+
import { messages } from "./messages/index.js";
|
|
16
|
+
/** How long a person has to approve: five minutes, as the service's one-time code lives. */
|
|
17
|
+
export const LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
|
|
18
|
+
const BASE32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
19
|
+
/** RFC 4648 base32, upper case and without padding, of bytes. */
|
|
20
|
+
export function base32(bytes) {
|
|
21
|
+
let result = "";
|
|
22
|
+
let buffer = 0;
|
|
23
|
+
let bits = 0;
|
|
24
|
+
for (const byte of bytes) {
|
|
25
|
+
buffer = (buffer << 8) | byte;
|
|
26
|
+
bits += 8;
|
|
27
|
+
while (bits >= 5) {
|
|
28
|
+
result += BASE32[(buffer >>> (bits - 5)) & 31];
|
|
29
|
+
bits -= 5;
|
|
30
|
+
}
|
|
31
|
+
buffer &= (1 << bits) - 1;
|
|
32
|
+
}
|
|
33
|
+
if (bits > 0)
|
|
34
|
+
result += BASE32[(buffer << (5 - bits)) & 31];
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The six characters the approval page shows for a `state`: the first six of the base32 of its
|
|
39
|
+
* SHA-256, so that a person can tell their own terminal's request from somebody else's.
|
|
40
|
+
*/
|
|
41
|
+
export function approvalCheck(state) {
|
|
42
|
+
return base32(createHash("sha256").update(state).digest()).slice(0, 6);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The language of a page from an `Accept-Language` header: the first language, by preference, that
|
|
46
|
+
* is English or Spanish; the fallback when the header names neither.
|
|
47
|
+
*/
|
|
48
|
+
export function languageOf(header, fallback = DEFAULT_LOCALE) {
|
|
49
|
+
if (!header)
|
|
50
|
+
return fallback;
|
|
51
|
+
const preferences = header
|
|
52
|
+
.split(",")
|
|
53
|
+
.map((part, index) => {
|
|
54
|
+
const [tag = "", ...parameters] = part.trim().split(";");
|
|
55
|
+
const q = parameters.map((p) => /^\s*q\s*=\s*([0-9.]+)\s*$/i.exec(p)?.[1]).find(Boolean);
|
|
56
|
+
return { tag: tag.trim().toLowerCase(), q: q === undefined ? 1 : Number(q), index };
|
|
57
|
+
})
|
|
58
|
+
.filter((p) => p.tag !== "" && p.tag !== "*" && Number.isFinite(p.q) && p.q > 0)
|
|
59
|
+
.sort((a, b) => b.q - a.q || a.index - b.index);
|
|
60
|
+
for (const { tag } of preferences) {
|
|
61
|
+
const language = tag.split("-")[0];
|
|
62
|
+
if (language === "es" || language === "en")
|
|
63
|
+
return resolveLocale(tag);
|
|
64
|
+
}
|
|
65
|
+
return fallback;
|
|
66
|
+
}
|
|
67
|
+
const escape = (text) => text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
68
|
+
/** The small page the browser lands on: done, or that signing in did not finish. */
|
|
69
|
+
export function donePage(locale, finished) {
|
|
70
|
+
const t = messages(locale).cloud.login.page;
|
|
71
|
+
return `<!doctype html>
|
|
72
|
+
<html lang="${locale}">
|
|
73
|
+
<head>
|
|
74
|
+
<meta charset="utf-8">
|
|
75
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
76
|
+
<meta name="referrer" content="no-referrer">
|
|
77
|
+
<title>Meltemi Diagrams</title>
|
|
78
|
+
<style>body{font:16px/1.5 system-ui,sans-serif;max-width:32rem;margin:4rem auto;padding:0 1rem}</style>
|
|
79
|
+
</head>
|
|
80
|
+
<body>
|
|
81
|
+
<h1>Meltemi Diagrams</h1>
|
|
82
|
+
<p>${escape(finished ? t.done : t.failed)}</p>
|
|
83
|
+
</body>
|
|
84
|
+
</html>
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
87
|
+
/** Whether two texts are equal, in time that does not depend on where they differ. */
|
|
88
|
+
export function sameText(a, b) {
|
|
89
|
+
const left = Buffer.from(a);
|
|
90
|
+
const right = Buffer.from(b);
|
|
91
|
+
return left.length === right.length && timingSafeEqual(left, right);
|
|
92
|
+
}
|
|
93
|
+
function refuse(response, status, headers = {}) {
|
|
94
|
+
response.writeHead(status, { "Content-Type": "text/plain; charset=utf-8", ...headers });
|
|
95
|
+
response.end(`${status}\n`);
|
|
96
|
+
}
|
|
97
|
+
/** Starts the listener on `127.0.0.1` at a free port. */
|
|
98
|
+
export function listenForApproval(options) {
|
|
99
|
+
const server = createServer();
|
|
100
|
+
let arrived = false;
|
|
101
|
+
let settle;
|
|
102
|
+
const outcome = new Promise((resolve) => (settle = resolve));
|
|
103
|
+
let timer;
|
|
104
|
+
const closing = new Promise((resolve) => server.once("close", () => resolve()));
|
|
105
|
+
const close = async () => {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
if (server.listening)
|
|
108
|
+
server.close();
|
|
109
|
+
server.closeAllConnections();
|
|
110
|
+
await closing;
|
|
111
|
+
};
|
|
112
|
+
return new Promise((resolve, reject) => {
|
|
113
|
+
server.once("error", reject);
|
|
114
|
+
server.listen(0, "127.0.0.1", () => {
|
|
115
|
+
server.off("error", reject);
|
|
116
|
+
const address = server.address();
|
|
117
|
+
const port = typeof address === "object" && address ? address.port : 0;
|
|
118
|
+
server.on("request", (request, response) => {
|
|
119
|
+
// Only this computer's own address names the listener: a page that makes the browser
|
|
120
|
+
// call it under another name (DNS rebinding) is turned away.
|
|
121
|
+
if (request.headers.host !== `127.0.0.1:${port}`)
|
|
122
|
+
return refuse(response, 421);
|
|
123
|
+
if (request.method !== "GET")
|
|
124
|
+
return refuse(response, 405, { Allow: "GET" });
|
|
125
|
+
const url = new URL(request.url ?? "/", `http://127.0.0.1:${port}`);
|
|
126
|
+
if (url.pathname !== "/")
|
|
127
|
+
return refuse(response, 404);
|
|
128
|
+
const codes = url.searchParams.getAll("code");
|
|
129
|
+
const states = url.searchParams.getAll("state");
|
|
130
|
+
if (codes.length !== 1 || states.length !== 1 || !codes[0] || !states[0]) {
|
|
131
|
+
return refuse(response, 400);
|
|
132
|
+
}
|
|
133
|
+
if (arrived)
|
|
134
|
+
return refuse(response, 409, { Connection: "close" });
|
|
135
|
+
arrived = true;
|
|
136
|
+
// The first request with a code is the only one: stop listening at once.
|
|
137
|
+
server.close();
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
const locale = languageOf(request.headers["accept-language"], options.fallbackLocale ?? getLocale());
|
|
140
|
+
let replied = false;
|
|
141
|
+
settle({
|
|
142
|
+
code: codes[0],
|
|
143
|
+
state: states[0],
|
|
144
|
+
reply: (finished) => {
|
|
145
|
+
if (replied)
|
|
146
|
+
return;
|
|
147
|
+
replied = true;
|
|
148
|
+
const page = donePage(locale, finished);
|
|
149
|
+
response.writeHead(finished ? 200 : 400, {
|
|
150
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
151
|
+
"Content-Length": Buffer.byteLength(page),
|
|
152
|
+
"Cache-Control": "no-store",
|
|
153
|
+
"Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'",
|
|
154
|
+
"Referrer-Policy": "no-referrer",
|
|
155
|
+
"X-Content-Type-Options": "nosniff",
|
|
156
|
+
Connection: "close",
|
|
157
|
+
});
|
|
158
|
+
response.end(page, () => server.closeAllConnections());
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
timer = setTimeout(() => {
|
|
163
|
+
if (arrived)
|
|
164
|
+
return;
|
|
165
|
+
arrived = true;
|
|
166
|
+
void close();
|
|
167
|
+
settle("timeout");
|
|
168
|
+
}, options.timeoutMs);
|
|
169
|
+
resolve({ port, outcome, close });
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=login-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-listener.js","sourceRoot":"","sources":["../src/login-listener.ts"],"names":[],"mappings":"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"}
|