@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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -2
  3. package/dist/assets-command.d.ts +16 -0
  4. package/dist/assets-command.d.ts.map +1 -0
  5. package/dist/assets-command.js +145 -0
  6. package/dist/assets-command.js.map +1 -0
  7. package/dist/assist-command.d.ts +19 -0
  8. package/dist/assist-command.d.ts.map +1 -0
  9. package/dist/assist-command.js +268 -0
  10. package/dist/assist-command.js.map +1 -0
  11. package/dist/auth-command.d.ts +14 -0
  12. package/dist/auth-command.d.ts.map +1 -0
  13. package/dist/auth-command.js +233 -0
  14. package/dist/auth-command.js.map +1 -0
  15. package/dist/bin.d.ts +3 -0
  16. package/dist/bin.d.ts.map +1 -0
  17. package/dist/bin.js +60 -0
  18. package/dist/bin.js.map +1 -0
  19. package/dist/build-command.d.ts +23 -0
  20. package/dist/build-command.d.ts.map +1 -0
  21. package/dist/build-command.js +123 -0
  22. package/dist/build-command.js.map +1 -0
  23. package/dist/cli.d.ts +46 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +823 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/cloud-client.d.ts +246 -0
  28. package/dist/cloud-client.d.ts.map +1 -0
  29. package/dist/cloud-client.js +591 -0
  30. package/dist/cloud-client.js.map +1 -0
  31. package/dist/cloud-command.d.ts +56 -0
  32. package/dist/cloud-command.d.ts.map +1 -0
  33. package/dist/cloud-command.js +81 -0
  34. package/dist/cloud-command.js.map +1 -0
  35. package/dist/cloud-context.d.ts +106 -0
  36. package/dist/cloud-context.d.ts.map +1 -0
  37. package/dist/cloud-context.js +185 -0
  38. package/dist/cloud-context.js.map +1 -0
  39. package/dist/cloud-errors.d.ts +37 -0
  40. package/dist/cloud-errors.d.ts.map +1 -0
  41. package/dist/cloud-errors.js +46 -0
  42. package/dist/cloud-errors.js.map +1 -0
  43. package/dist/cloud-host.d.ts +72 -0
  44. package/dist/cloud-host.d.ts.map +1 -0
  45. package/dist/cloud-host.js +129 -0
  46. package/dist/cloud-host.js.map +1 -0
  47. package/dist/cloud-manifest.d.ts +12 -0
  48. package/dist/cloud-manifest.d.ts.map +1 -0
  49. package/dist/cloud-manifest.js +21 -0
  50. package/dist/cloud-manifest.js.map +1 -0
  51. package/dist/cloud-paths.d.ts +48 -0
  52. package/dist/cloud-paths.d.ts.map +1 -0
  53. package/dist/cloud-paths.js +104 -0
  54. package/dist/cloud-paths.js.map +1 -0
  55. package/dist/credentials.d.ts +107 -0
  56. package/dist/credentials.d.ts.map +1 -0
  57. package/dist/credentials.js +243 -0
  58. package/dist/credentials.js.map +1 -0
  59. package/dist/export-command.d.ts +35 -0
  60. package/dist/export-command.d.ts.map +1 -0
  61. package/dist/export-command.js +524 -0
  62. package/dist/export-command.js.map +1 -0
  63. package/dist/import-command.d.ts +20 -0
  64. package/dist/import-command.d.ts.map +1 -0
  65. package/dist/import-command.js +254 -0
  66. package/dist/import-command.js.map +1 -0
  67. package/dist/index.d.ts +4 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +4 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/init-command.d.ts +28 -0
  72. package/dist/init-command.d.ts.map +1 -0
  73. package/dist/init-command.js +199 -0
  74. package/dist/init-command.js.map +1 -0
  75. package/dist/login-listener.d.ts +58 -0
  76. package/dist/login-listener.d.ts.map +1 -0
  77. package/dist/login-listener.js +173 -0
  78. package/dist/login-listener.js.map +1 -0
  79. package/dist/messages/en.d.ts +533 -0
  80. package/dist/messages/en.d.ts.map +1 -0
  81. package/dist/messages/en.js +803 -0
  82. package/dist/messages/en.js.map +1 -0
  83. package/dist/messages/es.d.ts +3 -0
  84. package/dist/messages/es.d.ts.map +1 -0
  85. package/dist/messages/es.js +764 -0
  86. package/dist/messages/es.js.map +1 -0
  87. package/dist/messages/index.d.ts +442 -0
  88. package/dist/messages/index.d.ts.map +1 -0
  89. package/dist/messages/index.js +42 -0
  90. package/dist/messages/index.js.map +1 -0
  91. package/dist/messages/push-pull-en.d.ts +84 -0
  92. package/dist/messages/push-pull-en.d.ts.map +1 -0
  93. package/dist/messages/push-pull-en.js +146 -0
  94. package/dist/messages/push-pull-en.js.map +1 -0
  95. package/dist/messages/push-pull-es.d.ts +7 -0
  96. package/dist/messages/push-pull-es.d.ts.map +1 -0
  97. package/dist/messages/push-pull-es.js +144 -0
  98. package/dist/messages/push-pull-es.js.map +1 -0
  99. package/dist/open-url.d.ts +11 -0
  100. package/dist/open-url.d.ts.map +1 -0
  101. package/dist/open-url.js +36 -0
  102. package/dist/open-url.js.map +1 -0
  103. package/dist/plugins-command.d.ts +15 -0
  104. package/dist/plugins-command.d.ts.map +1 -0
  105. package/dist/plugins-command.js +106 -0
  106. package/dist/plugins-command.js.map +1 -0
  107. package/dist/preview.d.ts +54 -0
  108. package/dist/preview.d.ts.map +1 -0
  109. package/dist/preview.js +249 -0
  110. package/dist/preview.js.map +1 -0
  111. package/dist/project-errors.d.ts +17 -0
  112. package/dist/project-errors.d.ts.map +1 -0
  113. package/dist/project-errors.js +85 -0
  114. package/dist/project-errors.js.map +1 -0
  115. package/dist/projects-command.d.ts +13 -0
  116. package/dist/projects-command.d.ts.map +1 -0
  117. package/dist/projects-command.js +85 -0
  118. package/dist/projects-command.js.map +1 -0
  119. package/dist/publish-command.d.ts +41 -0
  120. package/dist/publish-command.d.ts.map +1 -0
  121. package/dist/publish-command.js +311 -0
  122. package/dist/publish-command.js.map +1 -0
  123. package/dist/pull-command.d.ts +21 -0
  124. package/dist/pull-command.d.ts.map +1 -0
  125. package/dist/pull-command.js +300 -0
  126. package/dist/pull-command.js.map +1 -0
  127. package/dist/push-command.d.ts +31 -0
  128. package/dist/push-command.d.ts.map +1 -0
  129. package/dist/push-command.js +391 -0
  130. package/dist/push-command.js.map +1 -0
  131. package/dist/push-review.d.ts +16 -0
  132. package/dist/push-review.d.ts.map +1 -0
  133. package/dist/push-review.js +72 -0
  134. package/dist/push-review.js.map +1 -0
  135. package/dist/push-set.d.ts +126 -0
  136. package/dist/push-set.d.ts.map +1 -0
  137. package/dist/push-set.js +289 -0
  138. package/dist/push-set.js.map +1 -0
  139. package/dist/push-validation.d.ts +20 -0
  140. package/dist/push-validation.d.ts.map +1 -0
  141. package/dist/push-validation.js +70 -0
  142. package/dist/push-validation.js.map +1 -0
  143. package/dist/redact.d.ts +9 -0
  144. package/dist/redact.d.ts.map +1 -0
  145. package/dist/redact.js +22 -0
  146. package/dist/redact.js.map +1 -0
  147. package/dist/review-command.d.ts +44 -0
  148. package/dist/review-command.d.ts.map +1 -0
  149. package/dist/review-command.js +348 -0
  150. package/dist/review-command.js.map +1 -0
  151. package/package.json +56 -3
  152. package/templates/c4/diagrams/views.meltemi +16 -0
  153. package/templates/c4/models/system.meltemi +23 -0
  154. package/templates/ci/github.yml +96 -0
  155. package/templates/ci/gitlab.yml +53 -0
  156. package/templates/flow/diagrams/overview.meltemi +15 -0
  157. package/templates/free/diagrams/slide.meltemi +39 -0
  158. package/templates/purchase/diagrams/architecture.meltemi +36 -0
  159. package/templates/purchase/diagrams/executive.meltemi +52 -0
  160. package/templates/purchase/diagrams/payment.meltemi +42 -0
  161. package/templates/purchase/models/commerce.meltemi +30 -0
  162. package/templates/purchase/stories/purchase.meltemi +38 -0
  163. package/templates/sequence/diagrams/sign-in.meltemi +36 -0
@@ -0,0 +1,233 @@
1
+ /**
2
+ * `login`, `logout` and `whoami` (`cli-cloud`, "Signing in from the command line").
3
+ *
4
+ * What `logout` does when the service cannot be asked (offline, a server error): the entry is KEPT
5
+ * and the command fails with exit code 1 (`logout.not-revoked`), because forgetting a token that is
6
+ * still alive would leave one nobody can revoke from this computer. Only an answer that settles the
7
+ * matter lets it go: the token revoked (204), or the service saying it does not know the token
8
+ * (`token.invalid`). Nobody is stuck with an entry they cannot remove: the message names the file.
9
+ */
10
+ import { randomBytes } from "node:crypto";
11
+ import { parseArgs } from "node:util";
12
+ import { getLocale } from "@meltemi/diagrams-i18n";
13
+ import { messages } from "./messages/index.js";
14
+ import { cloudHost, newClient, openCloud, usage, usageError, } from "./cloud-context.js";
15
+ import { CloudError, EXIT_OK, EXIT_USAGE, isCloudError } from "./cloud-errors.js";
16
+ import { environmentToken } from "./credentials.js";
17
+ import { LOGIN_TIMEOUT_MS, approvalCheck, listenForApproval, sameText } from "./login-listener.js";
18
+ import { openUrl } from "./open-url.js";
19
+ /** A token as the service makes them: `mdg_` and base64url characters. */
20
+ const TOKEN_SHAPE = /^mdg_[A-Za-z0-9_-]{4,512}$/;
21
+ /** The options of the three commands: `--host` and `--help`, and `login`'s own. */
22
+ function parse(context, args, help, withLogin) {
23
+ let parsed;
24
+ try {
25
+ parsed = parseArgs({
26
+ args: [...args],
27
+ options: {
28
+ host: { type: "string" },
29
+ ...(withLogin
30
+ ? {
31
+ "no-browser": { type: "boolean", default: false },
32
+ token: { type: "boolean", default: false },
33
+ }
34
+ : {}),
35
+ help: { type: "boolean", short: "h", default: false },
36
+ },
37
+ allowPositionals: true,
38
+ strict: true,
39
+ });
40
+ }
41
+ catch (error) {
42
+ return usageError(context, error, help);
43
+ }
44
+ const values = parsed.values;
45
+ if (values.help) {
46
+ context.stdout(help);
47
+ return EXIT_OK;
48
+ }
49
+ if (parsed.positionals.length > 0) {
50
+ return usage(context, messages().cloud.noArguments(context.command), help);
51
+ }
52
+ return {
53
+ host: values.host,
54
+ noBrowser: values["no-browser"] === true,
55
+ token: values.token === true,
56
+ };
57
+ }
58
+ // ------------------------------------------------------------------------------------- login
59
+ export const loginCommand = async (args, context) => {
60
+ const help = messages().help.login;
61
+ const options = parse(context, args, help, true);
62
+ if (typeof options === "number")
63
+ return options;
64
+ if (environmentToken(context.env) !== undefined) {
65
+ throw new CloudError("login.environment-token", "MELTEMI_TOKEN is set.");
66
+ }
67
+ const host = cloudHost(context, { host: options.host });
68
+ // Read the file and make its folder first: a token made now must have somewhere to go.
69
+ context.credentials.prepare();
70
+ // Both flows keep the entry before they return it.
71
+ const entry = options.token
72
+ ? await loginWithToken(context, host)
73
+ : await loginInBrowser(context, host, options.noBrowser);
74
+ context.stdout(`${messages().cloud.login.signedIn(entry.user.name, host)}\n`);
75
+ return EXIT_OK;
76
+ };
77
+ /** `--token`: the token comes from standard input; its id and owner from `GET /api/session`. */
78
+ async function loginWithToken(context, host) {
79
+ if (context.stdin === undefined) {
80
+ throw new CloudError("login.token-input", "--token reads standard input.", {
81
+ exitCode: EXIT_USAGE,
82
+ });
83
+ }
84
+ // A byte order mark is what some shells put in front of what they pipe.
85
+ const input = await context.stdin();
86
+ const token = (input.charCodeAt(0) === 0xfeff ? input.slice(1) : input).trim();
87
+ if (token === "")
88
+ throw new CloudError("login.no-token", "No token was given.");
89
+ if (!TOKEN_SHAPE.test(token))
90
+ throw new CloudError("login.not-a-token", "Not an API token.");
91
+ const { user, token: identity } = await newClient(context, host, token).session();
92
+ const entry = { token, id: identity.id, user: { sub: user.sub, name: user.name } };
93
+ context.credentials.save(host, entry);
94
+ return entry;
95
+ }
96
+ /** The browser flow: approve in the browser, receive the code here, exchange it, learn who it is. */
97
+ async function loginInBrowser(context, host, noBrowser) {
98
+ const t = messages().cloud.login;
99
+ const state = randomBytes(32).toString("base64url");
100
+ let listener;
101
+ try {
102
+ listener = await listenForApproval({
103
+ timeoutMs: context.hooks.loginTimeoutMs ?? LOGIN_TIMEOUT_MS,
104
+ fallbackLocale: getLocale(),
105
+ });
106
+ }
107
+ catch (error) {
108
+ throw new CloudError("login.listener", "Cannot listen.", {
109
+ details: { reason: error.message },
110
+ });
111
+ }
112
+ try {
113
+ // Built here, from the host and numbers and letters of our own, never from what a server says.
114
+ const url = new URL("/cli-auth", host);
115
+ url.searchParams.set("port", String(listener.port));
116
+ url.searchParams.set("state", state);
117
+ // The check first, so that the person recognises their own request on the page.
118
+ context.stdout(`${t.check(approvalCheck(state))}\n${t.checkNote}\n`);
119
+ if (noBrowser) {
120
+ context.stdout(`${t.visit(url.href)}\n`);
121
+ }
122
+ else {
123
+ context.stdout(`${t.opening(url.href)}\n`);
124
+ try {
125
+ await (context.hooks.openBrowser ?? openUrl)(url.href);
126
+ }
127
+ catch {
128
+ context.stdout(`${t.openFailed}\n`);
129
+ }
130
+ }
131
+ context.stdout(`${t.waiting}\n`);
132
+ const arrival = await listener.outcome;
133
+ if (arrival === "timeout")
134
+ throw new CloudError("login.timeout", "No approval arrived.");
135
+ if (!sameText(arrival.state, state)) {
136
+ arrival.reply(false);
137
+ throw new CloudError("login.state-mismatch", "The state does not match.");
138
+ }
139
+ try {
140
+ const entry = await finishLogin(context, host, arrival.code, state);
141
+ arrival.reply(true);
142
+ return entry;
143
+ }
144
+ catch (error) {
145
+ arrival.reply(false);
146
+ throw error;
147
+ }
148
+ }
149
+ finally {
150
+ await listener.close();
151
+ }
152
+ }
153
+ /**
154
+ * Exchanges the one-time code (once; it is a secret and is never printed) and asks who the token is
155
+ * for. A token that could not be completed is revoked again, so that none is left that nobody holds.
156
+ */
157
+ async function finishLogin(context, host, code, state) {
158
+ const issued = await newClient(context, host).exchangeCode(code, state);
159
+ const client = newClient(context, host, issued.token);
160
+ const revoke = () => client.deleteToken(issued.id).then(() => true, () => false);
161
+ let entry;
162
+ try {
163
+ const { user } = await client.session();
164
+ entry = { token: issued.token, id: issued.id, user: { sub: user.sub, name: user.name } };
165
+ // Kept before the browser is answered: the page says "done" only when it is.
166
+ context.credentials.save(host, entry);
167
+ }
168
+ catch (error) {
169
+ const revoked = await revoke();
170
+ if (isCloudError(error) && error.code.startsWith("credentials.")) {
171
+ const reason = String(error.details["reason"] ?? error.message);
172
+ throw new CloudError(revoked ? "login.not-stored" : "login.not-stored-not-revoked", `The token could not be kept: ${reason}`, { details: { reason } });
173
+ }
174
+ throw error;
175
+ }
176
+ return entry;
177
+ }
178
+ // ------------------------------------------------------------------------------------ logout
179
+ export const logoutCommand = async (args, context) => {
180
+ const help = messages().help.logout;
181
+ const options = parse(context, args, help, false);
182
+ if (typeof options === "number")
183
+ return options;
184
+ const t = messages().cloud.logout;
185
+ const host = cloudHost(context, { host: options.host });
186
+ const note = environmentToken(context.env) !== undefined ? `${t.environment}\n` : "";
187
+ const entry = context.credentials.entry(host);
188
+ if (entry === undefined) {
189
+ context.stdout(`${t.none(host)}\n${note}`);
190
+ return EXIT_OK;
191
+ }
192
+ const client = newClient(context, host, entry.token);
193
+ try {
194
+ try {
195
+ await client.deleteToken(entry.id);
196
+ }
197
+ catch (error) {
198
+ // The stored id is not this token's (the file was edited): the token knows its own.
199
+ if (!isCloudError(error, "not-found"))
200
+ throw error;
201
+ await client.deleteToken((await client.session()).token.id);
202
+ }
203
+ }
204
+ catch (error) {
205
+ if (isCloudError(error, "token.invalid")) {
206
+ context.credentials.remove(host);
207
+ context.stdout(`${t.alreadyRevoked(host)}\n${note}`);
208
+ return EXIT_OK;
209
+ }
210
+ const reason = error instanceof Error ? error.message : String(error);
211
+ throw new CloudError("logout.not-revoked", `The token could not be revoked: ${reason}`, {
212
+ details: { host, reason, path: context.credentials.path },
213
+ });
214
+ }
215
+ context.credentials.remove(host);
216
+ context.stdout(`${t.done(host)}\n${note}`);
217
+ return EXIT_OK;
218
+ };
219
+ // ------------------------------------------------------------------------------------ whoami
220
+ export const whoamiCommand = async (args, context) => {
221
+ const help = messages().help.whoami;
222
+ const options = parse(context, args, help, false);
223
+ if (typeof options === "number")
224
+ return options;
225
+ const t = messages().cloud.whoami;
226
+ const { host, client, token } = openCloud(context, { host: options.host });
227
+ const { user } = await client.session();
228
+ context.stdout(`${t.who(user.name, user.handle)}\n${t.host(host)}\n`);
229
+ if (token.source === "environment")
230
+ context.stdout(`${t.environment}\n`);
231
+ return EXIT_OK;
232
+ };
233
+ //# sourceMappingURL=auth-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-command.js","sourceRoot":"","sources":["../src/auth-command.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ import { createInterface } from "node:readline/promises";
3
+ import { CLI_NAME, run } from "./cli.js";
4
+ import { messages } from "./messages/index.js";
5
+ import { redactSecrets } from "./redact.js";
6
+ const redact = (message) => redactSecrets(message, process.env);
7
+ /** The most standard input is read for: a token is a few dozen characters. */
8
+ const MAX_INPUT = 8 * 1024;
9
+ /**
10
+ * What a person or a pipe gives `login --token`: one line typed at a terminal, else the first
11
+ * kilobytes of standard input. The token never comes from an argument.
12
+ */
13
+ async function readStandardInput() {
14
+ if (process.stdin.isTTY) {
15
+ const terminal = createInterface({ input: process.stdin, output: process.stderr });
16
+ try {
17
+ return await terminal.question(messages().cloud.login.tokenPrompt);
18
+ }
19
+ finally {
20
+ terminal.close();
21
+ }
22
+ }
23
+ process.stdin.setEncoding("utf8");
24
+ let text = "";
25
+ for await (const chunk of process.stdin) {
26
+ text += chunk;
27
+ if (text.length > MAX_INPUT)
28
+ break;
29
+ }
30
+ return text.slice(0, MAX_INPUT);
31
+ }
32
+ process.on("uncaughtException", (error) => {
33
+ process.stderr.write(`${messages().common.internalError(CLI_NAME, redact(error.message))}\n`);
34
+ if (process.env.MELTEMI_DEBUG)
35
+ process.stderr.write(`${redact(error.stack ?? "")}\n`);
36
+ process.exit(70);
37
+ });
38
+ process.exitCode = await run(process.argv.slice(2), {
39
+ stdout: (text) => process.stdout.write(text),
40
+ stderr: (text) => process.stderr.write(text),
41
+ cwd: process.cwd(),
42
+ env: process.env,
43
+ locale: Intl.DateTimeFormat().resolvedOptions().locale,
44
+ stdin: readStandardInput,
45
+ // Only a person at a terminal can answer.
46
+ ...(process.stdin.isTTY
47
+ ? {
48
+ ask: async (question) => {
49
+ const terminal = createInterface({ input: process.stdin, output: process.stderr });
50
+ try {
51
+ return await terminal.question(question);
52
+ }
53
+ finally {
54
+ terminal.close();
55
+ }
56
+ },
57
+ }
58
+ : {}),
59
+ });
60
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Diagnostic } from "@meltemi/diagrams-language";
2
+ import { type ProjectSessions } from "@meltemi/diagrams-editor/node";
3
+ import { type Workspace } from "@meltemi/diagrams-project";
4
+ /** What the build command needs from the CLI: output, paths, projects and diagnostics. */
5
+ export interface BuildContext {
6
+ readonly name: string;
7
+ readonly stdout: (text: string) => void;
8
+ readonly stderr: (text: string) => void;
9
+ readonly cwd: string;
10
+ /** A path as printed: relative to the working folder. */
11
+ readonly display: (path: string) => string;
12
+ readonly projects: () => ProjectSessions;
13
+ /** The generator the catalog names, such as `Meltemi Diagrams 1.0.0`. */
14
+ readonly generator: string;
15
+ /** Prints the manifest and asset diagnostics of a project; returns whether there are errors. */
16
+ readonly printProject: (workspace: Workspace) => boolean;
17
+ readonly printDiagnostics: (path: string, diagnostics: readonly Diagnostic[]) => void;
18
+ }
19
+ /** A size for people: bytes, KB or MB, with the decimal sign of the interface language. */
20
+ export declare function formatSize(bytes: number): string;
21
+ /** `meltemi-diagrams build catalog`. */
22
+ export declare function buildCommand(args: readonly string[], context: BuildContext): number;
23
+ //# sourceMappingURL=build-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-command.d.ts","sourceRoot":"","sources":["../src/build-command.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG1E,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,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,QAAQ,EAAE,MAAM,eAAe,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gGAAgG;IAChG,QAAQ,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC;IACzD,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,UAAU,EAAE,KAAK,IAAI,CAAC;CACvF;AAMD,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAyGnF"}
@@ -0,0 +1,123 @@
1
+ import { mkdirSync, statSync, writeFileSync } from "node:fs";
2
+ import { dirname, isAbsolute, resolve } from "node:path";
3
+ import { parseArgs } from "node:util";
4
+ import { catalogScript } from "@meltemi/diagrams-catalog/node";
5
+ import { buildCatalog } from "@meltemi/diagrams-editor/node";
6
+ import { decimal, getLocale } from "@meltemi/diagrams-i18n";
7
+ import { toProjectPath } from "@meltemi/diagrams-project";
8
+ import { argumentsError, messages } from "./messages/index.js";
9
+ const EXIT_OK = 0;
10
+ const EXIT_FINDINGS = 1;
11
+ const EXIT_USAGE = 2;
12
+ /** A size for people: bytes, KB or MB, with the decimal sign of the interface language. */
13
+ export function formatSize(bytes) {
14
+ if (bytes < 1024)
15
+ return `${bytes} B`;
16
+ if (bytes < 1024 * 1024)
17
+ return `${Math.round(bytes / 1024)} KB`;
18
+ const megabytes = bytes / (1024 * 1024);
19
+ const locale = getLocale();
20
+ // English keeps its one fixed decimal ("2.0 MB"); Spanish writes "2 MB" and "2,5 MB".
21
+ return `${locale === "en" ? megabytes.toFixed(1) : decimal(locale, megabytes)} MB`;
22
+ }
23
+ /** `meltemi-diagrams build catalog`. */
24
+ export function buildCommand(args, context) {
25
+ const [target, ...rest] = args;
26
+ if (target === undefined || target === "-h" || target === "--help") {
27
+ context.stdout(messages().help.build);
28
+ return target === undefined ? EXIT_USAGE : EXIT_OK;
29
+ }
30
+ if (target !== "catalog") {
31
+ context.stderr(`${context.name} build: ${messages().build.unknownTarget(target)}\n`);
32
+ return EXIT_USAGE;
33
+ }
34
+ let values;
35
+ let positionals;
36
+ try {
37
+ const parsed = parseArgs({
38
+ args: [...rest],
39
+ options: {
40
+ out: { type: "string" },
41
+ title: { type: "string" },
42
+ source: { type: "boolean", default: false },
43
+ help: { type: "boolean", short: "h", default: false },
44
+ },
45
+ allowPositionals: true,
46
+ strict: true,
47
+ });
48
+ values = parsed.values;
49
+ positionals = parsed.positionals;
50
+ }
51
+ catch (error) {
52
+ context.stderr(`${context.name} build catalog: ${argumentsError(error)}\n`);
53
+ return EXIT_USAGE;
54
+ }
55
+ if (values.help) {
56
+ context.stdout(messages().help.build);
57
+ return EXIT_OK;
58
+ }
59
+ if (positionals.length > 1) {
60
+ context.stderr(`${context.name} build catalog: ${messages().common.oneProject}\n`);
61
+ return EXIT_USAGE;
62
+ }
63
+ if (values.title !== undefined && values.title.trim() === "") {
64
+ context.stderr(`${context.name} build catalog: ${messages().build.title}\n`);
65
+ return EXIT_USAGE;
66
+ }
67
+ const path = positionals[0] ?? ".";
68
+ const absolute = toProjectPath(resolve(context.cwd, path));
69
+ let isDirectory;
70
+ try {
71
+ isDirectory = statSync(absolute).isDirectory();
72
+ }
73
+ catch {
74
+ context.stderr(`${context.name} build catalog: ${messages().common.pathNotFound(path)}\n`);
75
+ return EXIT_USAGE;
76
+ }
77
+ const projects = context.projects();
78
+ const workspace = isDirectory ? projects.forFolder(absolute) : projects.forFile(absolute);
79
+ const out = values.out === undefined
80
+ ? undefined
81
+ : toProjectPath(isAbsolute(values.out) ? values.out : resolve(context.cwd, values.out));
82
+ let errors = context.printProject(workspace);
83
+ const build = buildCatalog(workspace, projects, {
84
+ ...(out !== undefined ? { out } : {}),
85
+ ...(values.title !== undefined ? { title: values.title.trim() } : {}),
86
+ ...(values.source ? { source: true } : {}),
87
+ generator: context.generator,
88
+ script: catalogScript,
89
+ });
90
+ for (const [file, diagnostics] of [...build.diagnostics].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) {
91
+ context.printDiagnostics(context.display(file), diagnostics);
92
+ errors ||= diagnostics.some((d) => d.severity === "error");
93
+ }
94
+ const t = messages().build;
95
+ for (const entry of build.skipped) {
96
+ context.stderr(`${context.name} build catalog: ${t.skipped(`${context.display(entry.path)}#${entry.id}`, entry.reason)}\n`);
97
+ }
98
+ for (const warning of build.warnings) {
99
+ context.stderr(`${context.name} build catalog: ${t.warning(warning)}\n`);
100
+ }
101
+ const { entries, entities } = build.data;
102
+ if (entries.length === 0) {
103
+ context.stderr(`${context.name} build catalog: ${t.empty(context.display(workspace.root))}\n`);
104
+ return build.skipped.length > 0 ? EXIT_FINDINGS : EXIT_USAGE;
105
+ }
106
+ try {
107
+ mkdirSync(dirname(build.out), { recursive: true });
108
+ writeFileSync(build.out, build.html);
109
+ }
110
+ catch (error) {
111
+ context.stderr(`${context.name} build catalog: ${messages().common.cannotWrite(context.display(build.out), error.message)}\n`);
112
+ return EXIT_USAGE;
113
+ }
114
+ const diagrams = entries.filter((e) => e.kind === "diagram").length;
115
+ const parts = [
116
+ t.diagrams(diagrams),
117
+ t.stories(entries.length - diagrams),
118
+ ...(entities.length > 0 ? [t.entities(entities.length)] : []),
119
+ ];
120
+ context.stdout(`${t.wrote(context.display(build.out), parts, formatSize(Buffer.byteLength(build.html)))}\n`);
121
+ return errors || build.skipped.length > 0 ? EXIT_FINDINGS : EXIT_OK;
122
+ }
123
+ //# sourceMappingURL=build-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-command.js","sourceRoot":"","sources":["../src/build-command.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ import { type Locale } from "@meltemi/diagrams-i18n";
2
+ import type { CloudHooks } from "./cloud-context.js";
3
+ export { FONT_POLICIES, MOTION_MODES, WRITABLE_FORMATS, exportFileName } from "./export-command.js";
4
+ /** Command name (decision 0002). */
5
+ export declare const CLI_NAME = "meltemi-diagrams";
6
+ /** Short alias installed next to the full command name. */
7
+ export declare const CLI_ALIAS = "mdg";
8
+ /** Extension of `.meltemi` sources (decision 0002). */
9
+ export declare const MELTEMI_EXTENSION = ".meltemi";
10
+ export declare const CLI_VERSION = "1.9.0";
11
+ export declare const EXIT_OK = 0;
12
+ export declare const EXIT_FINDINGS = 1;
13
+ export declare const EXIT_USAGE = 2;
14
+ /** The cloud commands: not signed in, or the service refused the token (run `login`). */
15
+ export declare const EXIT_AUTH = 3;
16
+ export interface CliIo {
17
+ readonly stdout: (text: string) => void;
18
+ readonly stderr: (text: string) => void;
19
+ readonly cwd: string;
20
+ /** Where `assist` reads provider settings and keys; the process environment by default. */
21
+ readonly env?: Readonly<Record<string, string | undefined>>;
22
+ /** Asks a question in a terminal; absent when nobody can answer. */
23
+ readonly ask?: (question: string) => Promise<string>;
24
+ /** Reads standard input, for `login --token`; the binary passes it. */
25
+ readonly stdin?: () => Promise<string>;
26
+ /** What the cloud commands use besides the process: tests replace the network and the browser. */
27
+ readonly cloud?: CloudHooks;
28
+ /**
29
+ * The system's language, for messages when neither `--lang` nor the environment names one;
30
+ * the binary passes it. Written files never depend on it.
31
+ */
32
+ readonly locale?: string;
33
+ }
34
+ /**
35
+ * Takes `--lang <en|es>` (or `--lang=<en|es>`) out of the arguments, wherever it is written:
36
+ * every command accepts it.
37
+ */
38
+ export declare function takeLang(argv: readonly string[]): {
39
+ args: string[];
40
+ lang: Locale | undefined;
41
+ } | {
42
+ error: string;
43
+ };
44
+ /** Runs the command line and returns the exit code; `assist`, which waits for a model, a promise of it. */
45
+ export declare function run(input: readonly string[], io: CliIo): number | Promise<number>;
46
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,MAAM,EACZ,MAAM,wBAAwB,CAAC;AAmChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEpG,oCAAoC;AACpC,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAC3C,2DAA2D;AAC3D,eAAO,MAAM,SAAS,QAAQ,CAAC;AAC/B,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,yFAAyF;AACzF,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B,MAAM,WAAW,KAAK;IACpB,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,2FAA2F;IAC3F,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC5D,oEAAoE;IACpE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,kGAAkG;IAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAcD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAclE;AAED,2GAA2G;AAC3G,wBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6JjF"}