@procedures/mark 0.0.0-stage → 0.2.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 (91) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +799 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/args.d.ts +77 -0
  6. package/dist/args.d.ts.map +1 -0
  7. package/dist/args.js +351 -0
  8. package/dist/args.js.map +1 -0
  9. package/dist/ask.d.ts +48 -0
  10. package/dist/ask.d.ts.map +1 -0
  11. package/dist/ask.js +91 -0
  12. package/dist/ask.js.map +1 -0
  13. package/dist/bin.d.ts +9 -0
  14. package/dist/bin.d.ts.map +1 -0
  15. package/dist/bin.js +10 -0
  16. package/dist/bin.js.map +1 -0
  17. package/dist/cli.d.ts +61 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +535 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/client-mode.d.ts +21 -0
  22. package/dist/client-mode.d.ts.map +1 -0
  23. package/dist/client-mode.js +75 -0
  24. package/dist/client-mode.js.map +1 -0
  25. package/dist/ecosystem.d.ts +67 -0
  26. package/dist/ecosystem.d.ts.map +1 -0
  27. package/dist/ecosystem.js +212 -0
  28. package/dist/ecosystem.js.map +1 -0
  29. package/dist/failure.d.ts +16 -0
  30. package/dist/failure.d.ts.map +1 -0
  31. package/dist/failure.js +47 -0
  32. package/dist/failure.js.map +1 -0
  33. package/dist/format.d.ts +30 -0
  34. package/dist/format.d.ts.map +1 -0
  35. package/dist/format.js +125 -0
  36. package/dist/format.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +13 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/lockfile.d.ts +26 -0
  42. package/dist/lockfile.d.ts.map +1 -0
  43. package/dist/lockfile.js +68 -0
  44. package/dist/lockfile.js.map +1 -0
  45. package/dist/manifest-build.d.ts +7 -0
  46. package/dist/manifest-build.d.ts.map +1 -0
  47. package/dist/manifest-build.js +11 -0
  48. package/dist/manifest-build.js.map +1 -0
  49. package/dist/manifest.d.ts +57 -0
  50. package/dist/manifest.d.ts.map +1 -0
  51. package/dist/manifest.js +140 -0
  52. package/dist/manifest.js.map +1 -0
  53. package/dist/manifest.json +20960 -0
  54. package/dist/parse.d.ts +143 -0
  55. package/dist/parse.d.ts.map +1 -0
  56. package/dist/parse.js +509 -0
  57. package/dist/parse.js.map +1 -0
  58. package/dist/print.d.ts +42 -0
  59. package/dist/print.d.ts.map +1 -0
  60. package/dist/print.js +80 -0
  61. package/dist/print.js.map +1 -0
  62. package/dist/prompts.d.ts +58 -0
  63. package/dist/prompts.d.ts.map +1 -0
  64. package/dist/prompts.js +124 -0
  65. package/dist/prompts.js.map +1 -0
  66. package/dist/repl.d.ts +34 -0
  67. package/dist/repl.d.ts.map +1 -0
  68. package/dist/repl.js +101 -0
  69. package/dist/repl.js.map +1 -0
  70. package/dist/server-mode.d.ts +37 -0
  71. package/dist/server-mode.d.ts.map +1 -0
  72. package/dist/server-mode.js +167 -0
  73. package/dist/server-mode.js.map +1 -0
  74. package/package.json +97 -3
  75. package/src/args.ts +440 -0
  76. package/src/ask.ts +119 -0
  77. package/src/bin.ts +11 -0
  78. package/src/cli.ts +600 -0
  79. package/src/client-mode.ts +90 -0
  80. package/src/ecosystem.ts +260 -0
  81. package/src/failure.ts +47 -0
  82. package/src/format.ts +177 -0
  83. package/src/index.ts +31 -0
  84. package/src/lockfile.ts +85 -0
  85. package/src/manifest-build.ts +12 -0
  86. package/src/manifest.ts +162 -0
  87. package/src/parse.ts +670 -0
  88. package/src/print.ts +108 -0
  89. package/src/prompts.ts +181 -0
  90. package/src/repl.ts +121 -0
  91. package/src/server-mode.ts +205 -0
package/dist/args.js ADDED
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Command Line Splitting
3
+ *
4
+ * Splits the argv of `mark` into the global flags, the command path, and the input of the
5
+ * procedure. The rules (deep dive CLI-7, CLI-9, CLI-10, CLI-11):
6
+ *
7
+ * - A flag before the command path is a global flag.
8
+ * - After the path, a flag is the procedure's when the procedure declares it (its field name, the
9
+ * kebab-case name, or its short letter). Otherwise it is a global flag. Otherwise it is an error.
10
+ * So `mark docker compose down -v` gives `-v` to the procedure, not to `--version`.
11
+ * - Each value is converted by the type of its field: a string field keeps its text.
12
+ * - A repeated array flag collects its values. A repeated record flag (`--env A=1 --env B=2`) merges.
13
+ * - A boolean flag takes `true`/`false` after it, or `--flag=false`, or `--no-flag`.
14
+ * - A negative number is a value, not a flag. `--` ends the flags.
15
+ * - The positional fields take the arguments in order. A last array field takes the rest.
16
+ * An argument that no field takes is an error.
17
+ */
18
+ import { findGlobalFlag } from "@procedures/lib/cli-flags";
19
+ import { convertValue, fieldsOf, mergeValue, toCamel, toKebab, } from "./parse.js";
20
+ const NEGATIVE_NUMBER = /^-(\d+\.?\d*|\.\d+)([eE][-+]?\d+)?$/;
21
+ const ANY = { kind: "any" };
22
+ /** A token that is a flag (not a value, not a negative number, not "-" alone) */
23
+ function isFlag(token) {
24
+ return token.startsWith("-") && token !== "-" && !NEGATIVE_NUMBER.test(token);
25
+ }
26
+ /**
27
+ * Find a procedure matching the given path
28
+ */
29
+ export function findProcedure(procedures, path) {
30
+ return procedures.find((p) => p.path.length === path.length && p.path.every((seg, i) => seg === path[i]));
31
+ }
32
+ /**
33
+ * Find procedures that are children of the given path
34
+ */
35
+ export function findChildren(procedures, path) {
36
+ return procedures.filter((p) => p.path.length > path.length && path.every((seg, i) => seg === p.path[i]));
37
+ }
38
+ /**
39
+ * The flags a procedure declares: each field of its input schema (camelCase and kebab-case
40
+ * names) and the short letters of its metadata.
41
+ */
42
+ export function procedureFlags(procedure) {
43
+ const meta = (procedure?.metadata ?? {});
44
+ const schemaFields = procedure ? fieldsOf(procedure) : [];
45
+ const fields = new Map(schemaFields.map((field) => [field.name, field.fieldType]));
46
+ const long = new Map();
47
+ const short = new Map();
48
+ const addLong = (field) => {
49
+ const spec = { field, type: fields.get(field) ?? ANY };
50
+ long.set(field, spec);
51
+ long.set(toKebab(field), spec);
52
+ };
53
+ for (const field of fields.keys()) {
54
+ addLong(field);
55
+ }
56
+ for (const [field, letter] of Object.entries(meta.shorts ?? {})) {
57
+ if (!long.has(field)) {
58
+ addLong(field);
59
+ }
60
+ short.set(letter, { field, type: fields.get(field) ?? ANY });
61
+ }
62
+ return { long, short, fields, typed: schemaFields.length > 0, meta };
63
+ }
64
+ /** The state of one pass over the tokens */
65
+ class TokenReader {
66
+ tokens;
67
+ index = 0;
68
+ constructor(tokens) {
69
+ this.tokens = tokens;
70
+ }
71
+ get current() {
72
+ return this.tokens[this.index];
73
+ }
74
+ /** The value of a flag: the inline value, or the next token when it is not a flag */
75
+ takeValue(inline) {
76
+ if (inline !== undefined) {
77
+ return inline;
78
+ }
79
+ const next = this.tokens[this.index + 1];
80
+ if (next !== undefined && !isFlag(next)) {
81
+ this.index++;
82
+ return next;
83
+ }
84
+ return undefined;
85
+ }
86
+ /** The value of a boolean flag: the inline value, or a next token that is "true" or "false" */
87
+ takeBoolean(inline) {
88
+ if (inline !== undefined) {
89
+ return inline;
90
+ }
91
+ const next = this.tokens[this.index + 1];
92
+ if (next === "true" || next === "false") {
93
+ this.index++;
94
+ return next;
95
+ }
96
+ return undefined;
97
+ }
98
+ }
99
+ /** Split "--name=value" (or "-n=value") into the name and the inline value */
100
+ function splitInline(body) {
101
+ const eq = body.indexOf("=");
102
+ return eq === -1 ? { name: body, inline: undefined } : { name: body.slice(0, eq), inline: body.slice(eq + 1) };
103
+ }
104
+ /** Read one global flag. Returns an error message, or undefined. */
105
+ function readGlobal(flag, label, inline, reader, globals) {
106
+ const name = flag.long;
107
+ if (flag.takesValue) {
108
+ const value = reader.takeValue(inline);
109
+ if (value === undefined) {
110
+ return `${label} needs a value`;
111
+ }
112
+ globals[name] = value;
113
+ return undefined;
114
+ }
115
+ if (inline !== undefined && inline !== "true" && inline !== "false") {
116
+ return `${label} needs true or false, not "${inline}"`;
117
+ }
118
+ globals[name] = inline !== "false";
119
+ return undefined;
120
+ }
121
+ /**
122
+ * Read the global flags before the command path. This needs no procedures: `mark` reads them
123
+ * before it loads the procedures (`--version`, `--server`, `-i`).
124
+ */
125
+ export function parseLeadingGlobals(argv) {
126
+ const globals = {};
127
+ const errors = [];
128
+ const reader = new TokenReader(argv);
129
+ for (; reader.index < argv.length; reader.index++) {
130
+ const token = reader.current;
131
+ if (!isFlag(token) || token === "--") {
132
+ break;
133
+ }
134
+ const isLong = token.startsWith("--");
135
+ const { name, inline } = splitInline(token.slice(isLong ? 2 : 1));
136
+ const flag = isLong || name.length === 1 ? findGlobalFlag(name, !isLong) : undefined;
137
+ if (!flag) {
138
+ errors.push(`Unknown option before the command: ${token}`);
139
+ continue;
140
+ }
141
+ const error = readGlobal(flag, isLong ? `--${name}` : `-${name}`, inline, reader, globals);
142
+ if (error) {
143
+ errors.push(error);
144
+ }
145
+ }
146
+ const rest = argv.slice(reader.index);
147
+ if (rest[0] === "--") {
148
+ rest.shift();
149
+ }
150
+ return { globals, rest, errors };
151
+ }
152
+ /**
153
+ * The command path at the start of the tokens: the longest run of words that names a procedure
154
+ * or a group of procedures. The first word is part of the path even when it names nothing (the
155
+ * command is then unknown).
156
+ */
157
+ function readPath(tokens, procedures) {
158
+ const path = [];
159
+ for (const token of tokens) {
160
+ if (isFlag(token) || token === "--") {
161
+ break;
162
+ }
163
+ const testPath = [...path, token];
164
+ if (findProcedure(procedures, testPath)) {
165
+ path.push(token);
166
+ break;
167
+ }
168
+ if (findChildren(procedures, testPath).length > 0 || path.length === 0) {
169
+ path.push(token);
170
+ continue;
171
+ }
172
+ break;
173
+ }
174
+ return path;
175
+ }
176
+ /**
177
+ * Split a whole command line: global flags, the command path, and the procedure input
178
+ */
179
+ export function parseCommandLine(argv, procedures) {
180
+ const leading = parseLeadingGlobals(argv);
181
+ const globals = leading.globals;
182
+ const errors = [...leading.errors];
183
+ const path = readPath(leading.rest, procedures);
184
+ const procedure = findProcedure(procedures, path);
185
+ const flags = procedureFlags(procedure);
186
+ const input = {};
187
+ const fromFlag = new Set();
188
+ const positionals = [];
189
+ const setField = (spec, text, label) => {
190
+ const converted = convertValue(text, spec.type, label);
191
+ if (!converted.ok) {
192
+ errors.push(converted.error);
193
+ return;
194
+ }
195
+ input[spec.field] = mergeValue(input[spec.field], converted.value, spec.type);
196
+ fromFlag.add(spec.field);
197
+ };
198
+ /** Read one procedure flag. Returns false when the procedure does not declare it. */
199
+ const readProcedureFlag = (spec, label, inline, reader) => {
200
+ if (!spec) {
201
+ return false;
202
+ }
203
+ if (spec.type.kind === "boolean") {
204
+ setField(spec, reader.takeBoolean(inline) ?? "true", label);
205
+ return true;
206
+ }
207
+ const value = reader.takeValue(inline);
208
+ if (value === undefined) {
209
+ errors.push(`${label} needs a value`);
210
+ return true;
211
+ }
212
+ setField(spec, value, label);
213
+ return true;
214
+ };
215
+ /** A flag that neither the procedure nor the globals have */
216
+ const readOther = (name, label, inline, reader) => {
217
+ if (procedure && !flags.typed) {
218
+ // The schema has no readable fields: pass the flag through, as JSON or text
219
+ const value = reader.takeValue(inline);
220
+ setField({ field: toCamel(name), type: ANY }, value ?? "true", label);
221
+ return;
222
+ }
223
+ const where = path.length > 0 ? ` for mark ${path.join(" ")}` : "";
224
+ errors.push(`Unknown option${where}: ${label}`);
225
+ };
226
+ const reader = new TokenReader(leading.rest);
227
+ reader.index = path.length;
228
+ let onlyPositionals = false;
229
+ for (; reader.index < leading.rest.length; reader.index++) {
230
+ const token = reader.current;
231
+ if (onlyPositionals || !isFlag(token)) {
232
+ positionals.push(token);
233
+ continue;
234
+ }
235
+ if (token === "--") {
236
+ onlyPositionals = true;
237
+ continue;
238
+ }
239
+ if (token.startsWith("--")) {
240
+ const { name, inline } = splitInline(token.slice(2));
241
+ const label = `--${name}`;
242
+ if (readProcedureFlag(flags.long.get(name), label, inline, reader)) {
243
+ continue;
244
+ }
245
+ // --no-<flag> sets a boolean field to false
246
+ const negated = name.startsWith("no-") ? flags.long.get(name.slice(3)) : undefined;
247
+ if (negated?.type.kind === "boolean") {
248
+ if (inline !== undefined) {
249
+ errors.push(`${label} takes no value`);
250
+ }
251
+ else {
252
+ setField(negated, "false", label);
253
+ }
254
+ continue;
255
+ }
256
+ const global = findGlobalFlag(name, false);
257
+ if (global) {
258
+ const error = readGlobal(global, label, inline, reader, globals);
259
+ if (error)
260
+ errors.push(error);
261
+ continue;
262
+ }
263
+ readOther(name, label, inline, reader);
264
+ continue;
265
+ }
266
+ // Short flags: "-x", "-x=value", "-xvalue" (a flag with a value), or "-abc" (boolean flags)
267
+ const { name: body, inline } = splitInline(token.slice(1));
268
+ for (let k = 0; k < body.length; k++) {
269
+ const letter = body[k];
270
+ const label = `-${letter}`;
271
+ const last = k === body.length - 1;
272
+ const attached = last ? inline : body.slice(k + 1);
273
+ const spec = flags.short.get(letter);
274
+ const global = spec ? undefined : findGlobalFlag(letter, true);
275
+ const takesValue = spec ? spec.type.kind !== "boolean" : global?.takesValue === true;
276
+ if (!spec && !global) {
277
+ if (body.length === 1) {
278
+ readOther(letter, label, inline, reader);
279
+ }
280
+ else {
281
+ errors.push(`Unknown option ${label} in ${token}`);
282
+ }
283
+ break;
284
+ }
285
+ if (takesValue || last) {
286
+ // The rest of the token (or the next token) is the value of this flag
287
+ if (spec) {
288
+ readProcedureFlag(spec, label, attached === "" ? undefined : attached, reader);
289
+ }
290
+ else {
291
+ const error = readGlobal(global, label, attached === "" ? undefined : attached, reader, globals);
292
+ if (error)
293
+ errors.push(error);
294
+ }
295
+ break;
296
+ }
297
+ if (spec) {
298
+ setField(spec, "true", label);
299
+ }
300
+ else {
301
+ globals[global.long] = true;
302
+ }
303
+ }
304
+ }
305
+ // Positional fields take the arguments in order; a last array field takes the rest
306
+ const positionalFields = flags.meta.args ?? [];
307
+ let next = 0;
308
+ if (procedure) {
309
+ positionalFields.forEach((field, k) => {
310
+ if (next >= positionals.length) {
311
+ return;
312
+ }
313
+ const type = flags.fields.get(field) ?? ANY;
314
+ const many = type.kind === "array" && k === positionalFields.length - 1;
315
+ const texts = many ? positionals.slice(next) : [positionals[next]];
316
+ next += texts.length;
317
+ if (fromFlag.has(field)) {
318
+ errors.push(`${field} is given twice: as an argument and as --${toKebab(field)}`);
319
+ return;
320
+ }
321
+ let value;
322
+ if (many && texts.length > 1) {
323
+ const items = [];
324
+ for (const text of texts) {
325
+ const converted = convertValue(text, type.item ?? ANY, field);
326
+ if (!converted.ok) {
327
+ errors.push(converted.error);
328
+ return;
329
+ }
330
+ items.push(converted.value);
331
+ }
332
+ value = items;
333
+ }
334
+ else {
335
+ const converted = convertValue(texts[0], type, field);
336
+ if (!converted.ok) {
337
+ errors.push(converted.error);
338
+ return;
339
+ }
340
+ value = converted.value;
341
+ }
342
+ input[field] = value;
343
+ });
344
+ }
345
+ const extraArguments = positionals.slice(next);
346
+ if (procedure && extraArguments.length > 0) {
347
+ errors.push(`Unexpected argument${extraArguments.length > 1 ? "s" : ""} for mark ${path.join(" ")}: ${extraArguments.join(" ")}`);
348
+ }
349
+ return { path, procedure, input, globals, extraArguments, errors };
350
+ }
351
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
package/dist/ask.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Questions for missing arguments.
3
+ *
4
+ * When a person runs mark in a terminal and a required argument is missing, mark asks for it:
5
+ * the question shows the name, the type and the description of the field. mark does not ask
6
+ * when stdin or stdout is not a terminal, when the environment variable CI is set, with
7
+ * `--no-input`, or when the procedure sets `interactive: false` in its CLI metadata. Then a
8
+ * missing argument is an error of the input, as before.
9
+ */
10
+ import { type CLIMeta, type SchemaFieldInfo } from "./parse.js";
11
+ /** The answer to one question: the text of the person, or `cancelled` */
12
+ export type Answer = {
13
+ value: unknown;
14
+ } | {
15
+ cancelled: true;
16
+ };
17
+ /** A function that asks one question. Tests give a fake. */
18
+ export type Asker = (field: SchemaFieldInfo, message: string) => Promise<Answer>;
19
+ /** The terminal state that decides if mark can ask */
20
+ export interface Terminal {
21
+ stdinIsTTY: boolean;
22
+ stdoutIsTTY: boolean;
23
+ env: Record<string, string | undefined>;
24
+ }
25
+ export declare function processTerminal(): Terminal;
26
+ /** True when mark can ask for a missing argument */
27
+ export declare function canAsk(noInput: boolean, meta: CLIMeta, terminal: Terminal): boolean;
28
+ /** The required fields that the input does not give (a field with a default is not missing) */
29
+ export declare function missingFields(fields: readonly SchemaFieldInfo[], input: Record<string, unknown>): SchemaFieldInfo[];
30
+ /** The question of a field: its name, its type and its description */
31
+ export declare function questionOf(field: SchemaFieldInfo): string;
32
+ /** The result of the questions: the input with the answers, or the reason to stop */
33
+ export type Asked = {
34
+ ok: true;
35
+ input: Record<string, unknown>;
36
+ } | {
37
+ ok: false;
38
+ cancelled: boolean;
39
+ error: string;
40
+ };
41
+ /**
42
+ * Ask for each missing field, in order, and convert each answer by the type of its field. An
43
+ * array field takes the words of the answer.
44
+ */
45
+ export declare function askMissing(missing: readonly SchemaFieldInfo[], input: Record<string, unknown>, ask: Asker): Promise<Asked>;
46
+ /** The asker of the terminal: a yes/no question for a boolean, a choice for an enum, text otherwise */
47
+ export declare const terminalAsker: Asker;
48
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9E,yEAAyE;AACzE,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC;AAE9D,4DAA4D;AAC5D,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEjF,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACzC;AAED,wBAAgB,eAAe,IAAI,QAAQ,CAM1C;AAED,oDAAoD;AACpD,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CASnF;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,EAAE,CAEnH;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAIzD;AAED,qFAAqF;AACrF,MAAM,MAAM,KAAK,GACb;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,KAAK,CAAC,CA+BhB;AAED,uGAAuG;AACvG,eAAO,MAAM,aAAa,EAAE,KAc3B,CAAC"}
package/dist/ask.js ADDED
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Questions for missing arguments.
3
+ *
4
+ * When a person runs mark in a terminal and a required argument is missing, mark asks for it:
5
+ * the question shows the name, the type and the description of the field. mark does not ask
6
+ * when stdin or stdout is not a terminal, when the environment variable CI is set, with
7
+ * `--no-input`, or when the procedure sets `interactive: false` in its CLI metadata. Then a
8
+ * missing argument is an error of the input, as before.
9
+ */
10
+ import { convertValue } from "./parse.js";
11
+ export function processTerminal() {
12
+ return {
13
+ stdinIsTTY: process.stdin.isTTY === true,
14
+ stdoutIsTTY: process.stdout.isTTY === true,
15
+ env: process.env,
16
+ };
17
+ }
18
+ /** True when mark can ask for a missing argument */
19
+ export function canAsk(noInput, meta, terminal) {
20
+ if (noInput || meta.interactive === false) {
21
+ return false;
22
+ }
23
+ const ci = terminal.env["CI"];
24
+ if (ci !== undefined && ci !== "" && ci !== "false" && ci !== "0") {
25
+ return false;
26
+ }
27
+ return terminal.stdinIsTTY && terminal.stdoutIsTTY;
28
+ }
29
+ /** The required fields that the input does not give (a field with a default is not missing) */
30
+ export function missingFields(fields, input) {
31
+ return fields.filter((field) => field.required && field.defaultValue === undefined && input[field.name] === undefined);
32
+ }
33
+ /** The question of a field: its name, its type and its description */
34
+ export function questionOf(field) {
35
+ const many = field.fieldType.kind === "array" ? " (separate the values with spaces)" : "";
36
+ const description = field.description ? `: ${field.description}` : "";
37
+ return `${field.name} (${field.type})${description}${many}`;
38
+ }
39
+ /**
40
+ * Ask for each missing field, in order, and convert each answer by the type of its field. An
41
+ * array field takes the words of the answer.
42
+ */
43
+ export async function askMissing(missing, input, ask) {
44
+ const result = { ...input };
45
+ for (const field of missing) {
46
+ const answer = await ask(field, questionOf(field));
47
+ if ("cancelled" in answer) {
48
+ return { ok: false, cancelled: true, error: "Cancelled" };
49
+ }
50
+ if (typeof answer.value !== "string") {
51
+ result[field.name] = answer.value;
52
+ continue;
53
+ }
54
+ const kind = field.fieldType.kind;
55
+ if (kind === "array") {
56
+ const words = answer.value.trim().split(/\s+/).filter((word) => word.length > 0);
57
+ const item = field.fieldType.item ?? { kind: "any" };
58
+ const values = [];
59
+ for (const word of words) {
60
+ const converted = convertValue(word, item, field.name);
61
+ if (!converted.ok)
62
+ return { ok: false, cancelled: false, error: converted.error };
63
+ values.push(converted.value);
64
+ }
65
+ result[field.name] = values;
66
+ continue;
67
+ }
68
+ const converted = convertValue(answer.value, field.fieldType, field.name);
69
+ if (!converted.ok) {
70
+ return { ok: false, cancelled: false, error: converted.error };
71
+ }
72
+ result[field.name] = converted.value;
73
+ }
74
+ return { ok: true, input: result };
75
+ }
76
+ /** The asker of the terminal: a yes/no question for a boolean, a choice for an enum, text otherwise */
77
+ export const terminalAsker = async (field, message) => {
78
+ const { prompts } = await import("./prompts.js");
79
+ let value;
80
+ if (field.fieldType.kind === "boolean") {
81
+ value = await prompts.confirm(message);
82
+ }
83
+ else if (field.fieldType.kind === "enum" && field.enumValues) {
84
+ value = await prompts.select(message, field.enumValues.map((option) => ({ value: option, label: option })));
85
+ }
86
+ else {
87
+ value = await prompts.text(message);
88
+ }
89
+ return prompts.isCancel(value) ? { cancelled: true } : { value };
90
+ };
91
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * The `mark` executable.
4
+ *
5
+ * Importing `@procedures/mark` gives the functions and runs nothing (deep dive CLI-17).
6
+ * This file runs the CLI. `node dist/cli.js` also runs it, for the documented commands.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/bin.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * The `mark` executable.
4
+ *
5
+ * Importing `@procedures/mark` gives the functions and runs nothing (deep dive CLI-17).
6
+ * This file runs the CLI. `node dist/cli.js` also runs it, for the documented commands.
7
+ */
8
+ import { main } from "./cli.js";
9
+ await main(process.argv.slice(2));
10
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Mark CLI
4
+ *
5
+ * A generic CLI that reflects registered procedures.
6
+ * Uses custom procedure-based routing with modern terminal utilities.
7
+ */
8
+ import type { AnyProcedure } from "@procedures/client";
9
+ import { type ManifestCommand } from "./manifest.js";
10
+ import { type Asker, type Terminal } from "./ask.js";
11
+ /**
12
+ * CLI execution context, created once and reused
13
+ */
14
+ export interface CliContext {
15
+ client: InstanceType<typeof import("@procedures/client").Client>;
16
+ procedures: AnyProcedure[];
17
+ verbose: boolean;
18
+ }
19
+ /**
20
+ * The context of a run that starts from the manifest: the commands are known, the procedures
21
+ * are not loaded. `load()` loads them when the command runs in this process.
22
+ */
23
+ export interface ManifestContext {
24
+ commands: readonly ManifestCommand[];
25
+ verbose: boolean;
26
+ load: () => Promise<CliContext>;
27
+ }
28
+ /** The terminal and the asker of the questions for missing arguments (tests give fakes) */
29
+ export interface ExecuteOptions {
30
+ terminal?: Terminal;
31
+ ask?: Asker;
32
+ }
33
+ /**
34
+ * Initialize the CLI context (load ecosystem, create client)
35
+ * This is the expensive part (~4s). Call once, reuse many times.
36
+ */
37
+ export declare function initCli(verbose?: boolean): Promise<CliContext>;
38
+ /**
39
+ * Execute a single command given argv tokens.
40
+ * Reusable by both CLI entry point and REPL.
41
+ *
42
+ * The exit code is 1 for an unknown command, a problem of the command line, invalid input, a
43
+ * thrown error, and a result that reports a failure (`success: false`, or an `exitCode` that is
44
+ * not 0: see failure.ts). Before, all of these exited with 0 (deep dive CLI-8).
45
+ *
46
+ * With a ManifestContext, the help and a call to the CLI server need no procedures: they load
47
+ * only when the command runs in this process (roadmap 1.3).
48
+ */
49
+ export declare function executeArgs(argv: string[], ctx: CliContext | ManifestContext, options?: ExecuteOptions): Promise<void>;
50
+ /**
51
+ * Run the CLI
52
+ */
53
+ declare function run(argv: string[]): Promise<void>;
54
+ /**
55
+ * Run the CLI and report an error that escapes it as one line, with exit code 1. With
56
+ * `--verbose`, the stack follows. (Before, an error such as an invalid port showed only an
57
+ * unhandled-rejection stack: deep dive CLI-16.)
58
+ */
59
+ export declare function main(argv: readonly string[]): Promise<void>;
60
+ export { run };
61
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAGH,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK/D,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAqE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAmIxH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC,cAAc,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACjE,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CACjC;AAED,2FAA2F;AAC3F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,KAAK,CAAC;CACb;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAelE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,UAAU,GAAG,eAAe,EACjC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmNf;AAuDD;;GAEG;AACH,iBAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFhD;AAED;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjE;AA0BD,OAAO,EAAE,GAAG,EAAE,CAAC"}