@zitadel/cli 0.1.0 → 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.
@@ -1,4 +1,4 @@
1
- import { a as COMMAND_GROUPS, i as ADDITIONAL_COMMANDS_GROUP, s as compareInGroup, t as showSkillsHint } from "../../skills-hint-BSspFzhr.mjs";
1
+ import { A as compareInGroup, O as COMMAND_GROUPS, i as exploreAllCommands, k as CommandGroups, t as showSkillsHint } from "../../skills-hint-CBoak9HL.mjs";
2
2
  import { Help, toConfiguredId, ux } from "@oclif/core";
3
3
  //#region src/lib/oclif/help.ts
4
4
  /**
@@ -8,31 +8,30 @@ import { Help, toConfiguredId, ux } from "@oclif/core";
8
8
  const PLUGIN_SUMMARIES = { version: "Show the CLI version" };
9
9
  /**
10
10
  * Root help in the style of `gh --help`: a tagline, usage, the commands under
11
- * headed groups with oclif's utilities last, then flags, examples, and where
12
- * to go next. Only {@link showRootHelp} is replaced; per-command and
13
- * per-topic help (`start --help`, `schemas --help`) stay oclif's own. Wired
14
- * in via `oclif.helpClass` in `package.json`.
11
+ * headed groups, then flags and examples. A family of commands (`users`,
12
+ * `release`) is one row, and its own help lists the operations. Only
13
+ * {@link showRootHelp} is replaced; per-command and per-topic help
14
+ * (`start --help`, `schemas --help`) stay oclif's own, with a pointer back to
15
+ * the root screen added. Wired in via `oclif.helpClass` in `package.json`.
15
16
  */
16
17
  var ZitadelHelp = class extends Help {
17
18
  async showRootHelp() {
18
19
  const { bin } = this.config;
19
20
  const commands = this.rootCommands();
20
- const width = Math.max(0, ...commands.map((command) => this.displayName(command).length));
21
- const list = (entries) => entries.map((command) => `${this.displayName(command).padEnd(width)} ${this.oneLineSummary(command)}`).join("\n");
22
- const groups = COMMAND_GROUPS.map((group) => [group, byGroup(commands, group)]).filter(([, entries]) => entries.length > 0);
23
- const additional = commands.filter((command) => command.group === void 0).sort((a, b) => a.id.localeCompare(b.id));
21
+ const groups = COMMAND_GROUPS.map((group) => [group, this.rowsOf(this.commandsOf(commands, group))]).filter(([, rows]) => rows.length > 0);
22
+ const width = Math.max(0, ...groups.flatMap(([, rows]) => rows.map((row) => row.name.length)));
23
+ const list = (rows) => rows.map((row) => `${row.name.padEnd(width)} ${row.summary}`).join("\n");
24
24
  const sections = [
25
25
  this.render(this.config.pjson.oclif.description ?? this.config.pjson.description ?? ""),
26
26
  this.section("Usage", `${bin} <command> [flags]`),
27
- ...groups.map(([group, entries]) => this.section(group, list(entries))),
28
- ...additional.length > 0 ? [this.section(ADDITIONAL_COMMANDS_GROUP, list(additional))] : [],
27
+ `Run a command below. Use \`${bin} <command> --help\` to see its options.`,
28
+ ...groups.map(([group, rows]) => this.section(group, list(rows))),
29
29
  this.section("Flags", ["--help Show help for command", `--version Show ${bin} version`].join("\n")),
30
30
  this.section("Examples", [
31
31
  `$ ${bin} setup --framework next`,
32
32
  `$ ${bin} start`,
33
33
  `$ ${bin} doctor`
34
- ].join("\n")),
35
- this.section("Learn more", `Use \`${bin} <command> --help\` for more information about a command.`)
34
+ ].join("\n"))
36
35
  ];
37
36
  if (process.argv.length <= 2) await showSkillsHint({
38
37
  env: process.env,
@@ -40,6 +39,14 @@ var ZitadelHelp = class extends Help {
40
39
  });
41
40
  this.log(sections.join("\n\n"));
42
41
  }
42
+ async showCommandHelp(command) {
43
+ await super.showCommandHelp(command);
44
+ this.log(exploreAllCommands(this.config.version));
45
+ }
46
+ async showTopicHelp(topic) {
47
+ await super.showTopicHelp(topic);
48
+ this.log(exploreAllCommands(this.config.version));
49
+ }
43
50
  /**
44
51
  * The commands the root screen lists: every visible command, grouped or
45
52
  * not, whatever its depth. Alias entries and `help` itself are left out.
@@ -47,8 +54,50 @@ var ZitadelHelp = class extends Help {
47
54
  rootCommands() {
48
55
  return this.sortedCommands.filter((command) => command.id !== "help" && !command.aliases?.includes(command.id));
49
56
  }
50
- displayName(command) {
51
- return `${toConfiguredId(command.id, this.config)}:`;
57
+ /**
58
+ * The commands a group lists. oclif's own utilities declare no group and are
59
+ * listed with the last one.
60
+ */
61
+ commandsOf(commands, group) {
62
+ return commands.filter((command) => command.group === group || command.group === void 0 && group === CommandGroups.diagnostics);
63
+ }
64
+ /**
65
+ * The rows of one group. Commands sharing a first word (`users create`,
66
+ * `users get`) are one row named for it, described by the topic when it has
67
+ * a description and otherwise by the command of that name; a command on its
68
+ * own keeps its name. Rows follow `groupOrder` (the lowest of a family's
69
+ * commands), then the name.
70
+ */
71
+ rowsOf(commands) {
72
+ const families = /* @__PURE__ */ new Map();
73
+ for (const command of commands) {
74
+ const [family = command.id] = command.id.split(":");
75
+ families.set(family, [...families.get(family) ?? [], command]);
76
+ }
77
+ return [...families].map(([family, members]) => {
78
+ const order = Math.min(...members.map((member) => member.groupOrder ?? Number.MAX_SAFE_INTEGER));
79
+ if (!members.some((member) => member.id.includes(":"))) {
80
+ const [only] = members;
81
+ return {
82
+ name: toConfiguredId(family, this.config),
83
+ summary: this.oneLineSummary(only?.summary ?? only?.description, only?.id),
84
+ order
85
+ };
86
+ }
87
+ const topic = this.config.topics.find((candidate) => candidate.name === family);
88
+ const root = members.find((member) => member.id === family) ?? members[0];
89
+ return {
90
+ name: toConfiguredId(family, this.config),
91
+ summary: this.oneLineSummary(topic?.description ?? root?.summary ?? root?.description),
92
+ order
93
+ };
94
+ }).sort((a, b) => compareInGroup({
95
+ id: a.name,
96
+ groupOrder: a.order
97
+ }, {
98
+ id: b.name,
99
+ groupOrder: b.order
100
+ }));
52
101
  }
53
102
  /**
54
103
  * The summary as `gh` prints it: the first clause of the summary or
@@ -56,15 +105,12 @@ var ZitadelHelp = class extends Help {
56
105
  * than {@link summary} so a user theme's colour codes cannot end up inside
57
106
  * the clause; the theme is applied once the text is final.
58
107
  */
59
- oneLineSummary(command) {
60
- const source = PLUGIN_SUMMARIES[command.id] ?? command.summary ?? command.description ?? "";
108
+ oneLineSummary(text, id) {
109
+ const source = (id === void 0 ? void 0 : PLUGIN_SUMMARIES[id]) ?? text ?? "";
61
110
  const [clause = ""] = this.render(source).split(/[.:]\s|\n/, 1);
62
111
  return ux.colorize(this.config.theme?.commandSummary, clause.trim().replace(/\.$/, ""));
63
112
  }
64
113
  };
65
- function byGroup(commands, group) {
66
- return commands.filter((command) => command.group === group).sort(compareInGroup);
67
- }
68
114
  //#endregion
69
115
  export { ZitadelHelp as default };
70
116
 
@@ -1 +1 @@
1
- {"version":3,"file":"help.mjs","names":[],"sources":["../../../src/lib/oclif/help.ts"],"sourcesContent":["import { type Command, Help, toConfiguredId, ux } from \"@oclif/core\";\n\nimport { showSkillsHint } from \"../skills-hint\";\nimport {\n ADDITIONAL_COMMANDS_GROUP,\n COMMAND_GROUPS,\n type CommandGroup,\n compareInGroup,\n} from \"./groups\";\n\n/** A loaded command plus the root-help statics `BaseCommand` (`./base`) declares. */\ntype GroupedCommand = Command.Loadable & { group?: CommandGroup; groupOrder?: number };\n\n/**\n * Summaries for oclif plugin commands that ship without one. `version` prints\n * a blank line otherwise.\n */\nconst PLUGIN_SUMMARIES: Readonly<Record<string, string>> = {\n version: \"Show the CLI version\",\n};\n\n/**\n * Root help in the style of `gh --help`: a tagline, usage, the commands under\n * headed groups with oclif's utilities last, then flags, examples, and where\n * to go next. Only {@link showRootHelp} is replaced; per-command and\n * per-topic help (`start --help`, `schemas --help`) stay oclif's own. Wired\n * in via `oclif.helpClass` in `package.json`.\n */\nexport default class ZitadelHelp extends Help {\n protected override async showRootHelp(): Promise<void> {\n const { bin } = this.config;\n const commands = this.rootCommands();\n const width = Math.max(0, ...commands.map((command) => this.displayName(command).length));\n const list = (entries: readonly GroupedCommand[]): string =>\n entries\n .map(\n (command) => `${this.displayName(command).padEnd(width)} ${this.oneLineSummary(command)}`,\n )\n .join(\"\\n\");\n\n const groups = COMMAND_GROUPS.map((group) => [group, byGroup(commands, group)] as const).filter(\n ([, entries]) => entries.length > 0,\n );\n const additional = commands\n .filter((command) => command.group === undefined)\n .sort((a, b) => a.id.localeCompare(b.id));\n\n const sections = [\n this.render(this.config.pjson.oclif.description ?? this.config.pjson.description ?? \"\"),\n this.section(\"Usage\", `${bin} <command> [flags]`),\n ...groups.map(([group, entries]) => this.section(group, list(entries))),\n ...(additional.length > 0 ? [this.section(ADDITIONAL_COMMANDS_GROUP, list(additional))] : []),\n this.section(\n \"Flags\",\n [\"--help Show help for command\", `--version Show ${bin} version`].join(\"\\n\"),\n ),\n this.section(\n \"Examples\",\n [`$ ${bin} setup --framework next`, `$ ${bin} start`, `$ ${bin} doctor`].join(\"\\n\"),\n ),\n this.section(\n \"Learn more\",\n `Use \\`${bin} <command> --help\\` for more information about a command.`,\n ),\n ];\n // Only a bare `zitadel`, not `zitadel --help` or an unknown command's help.\n if (process.argv.length <= 2) {\n await showSkillsHint({\n env: process.env,\n interactive: Boolean(process.stdout.isTTY && process.stdin.isTTY),\n });\n }\n this.log(sections.join(\"\\n\\n\"));\n }\n\n /**\n * The commands the root screen lists: every visible command, grouped or\n * not, whatever its depth. Alias entries and `help` itself are left out.\n */\n private rootCommands(): GroupedCommand[] {\n return (this.sortedCommands as GroupedCommand[]).filter(\n (command) => command.id !== \"help\" && !command.aliases?.includes(command.id),\n );\n }\n\n private displayName(command: GroupedCommand): string {\n return `${toConfiguredId(command.id, this.config)}:`;\n }\n\n /**\n * The summary as `gh` prints it: the first clause of the summary or\n * description, with no trailing full stop. Built from the raw statics rather\n * than {@link summary} so a user theme's colour codes cannot end up inside\n * the clause; the theme is applied once the text is final.\n */\n private oneLineSummary(command: GroupedCommand): string {\n const source = PLUGIN_SUMMARIES[command.id] ?? command.summary ?? command.description ?? \"\";\n const [clause = \"\"] = this.render(source).split(/[.:]\\s|\\n/, 1);\n return ux.colorize(this.config.theme?.commandSummary, clause.trim().replace(/\\.$/, \"\"));\n }\n}\n\nfunction byGroup(commands: readonly GroupedCommand[], group: CommandGroup): GroupedCommand[] {\n return commands.filter((command) => command.group === group).sort(compareInGroup);\n}\n"],"mappings":";;;;;;;AAiBA,MAAM,mBAAqD,EACzD,SAAS,uBACX;;;;;;;;AASA,IAAqB,cAArB,cAAyC,KAAK;CAC5C,MAAyB,eAA8B;EACrD,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,SAAS,KAAK,YAAY,KAAK,YAAY,OAAO,CAAC,CAAC,MAAM,CAAC;EACxF,MAAM,QAAQ,YACZ,QACG,KACE,YAAY,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,OAAO,KAAK,EAAE,GAAG,KAAK,eAAe,OAAO,GACxF,CAAC,CACA,KAAK,IAAI;EAEd,MAAM,SAAS,eAAe,KAAK,UAAU,CAAC,OAAO,QAAQ,UAAU,KAAK,CAAC,CAAU,CAAC,CAAC,QACtF,GAAG,aAAa,QAAQ,SAAS,CACpC;EACA,MAAM,aAAa,SAChB,QAAQ,YAAY,QAAQ,UAAU,KAAA,CAAS,CAAC,CAChD,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;EAE1C,MAAM,WAAW;GACf,KAAK,OAAO,KAAK,OAAO,MAAM,MAAM,eAAe,KAAK,OAAO,MAAM,eAAe,EAAE;GACtF,KAAK,QAAQ,SAAS,GAAG,IAAI,mBAAmB;GAChD,GAAG,OAAO,KAAK,CAAC,OAAO,aAAa,KAAK,QAAQ,OAAO,KAAK,OAAO,CAAC,CAAC;GACtE,GAAI,WAAW,SAAS,IAAI,CAAC,KAAK,QAAQ,2BAA2B,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC;GAC3F,KAAK,QACH,SACA,CAAC,qCAAqC,oBAAoB,IAAI,SAAS,CAAC,CAAC,KAAK,IAAI,CACpF;GACA,KAAK,QACH,YACA;IAAC,KAAK,IAAI;IAA0B,KAAK,IAAI;IAAS,KAAK,IAAI;GAAQ,CAAC,CAAC,KAAK,IAAI,CACpF;GACA,KAAK,QACH,cACA,SAAS,IAAI,0DACf;EACF;EAEA,IAAI,QAAQ,KAAK,UAAU,GACzB,MAAM,eAAe;GACnB,KAAK,QAAQ;GACb,aAAa,QAAQ,QAAQ,OAAO,SAAS,QAAQ,MAAM,KAAK;EAClE,CAAC;EAEH,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC;CAChC;;;;;CAMA,eAAyC;EACvC,OAAQ,KAAK,eAAoC,QAC9C,YAAY,QAAQ,OAAO,UAAU,CAAC,QAAQ,SAAS,SAAS,QAAQ,EAAE,CAC7E;CACF;CAEA,YAAoB,SAAiC;EACnD,OAAO,GAAG,eAAe,QAAQ,IAAI,KAAK,MAAM,EAAE;CACpD;;;;;;;CAQA,eAAuB,SAAiC;EACtD,MAAM,SAAS,iBAAiB,QAAQ,OAAO,QAAQ,WAAW,QAAQ,eAAe;EACzF,MAAM,CAAC,SAAS,MAAM,KAAK,OAAO,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC;EAC9D,OAAO,GAAG,SAAS,KAAK,OAAO,OAAO,gBAAgB,OAAO,KAAK,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC;CACxF;AACF;AAEA,SAAS,QAAQ,UAAqC,OAAuC;CAC3F,OAAO,SAAS,QAAQ,YAAY,QAAQ,UAAU,KAAK,CAAC,CAAC,KAAK,cAAc;AAClF"}
1
+ {"version":3,"file":"help.mjs","names":[],"sources":["../../../src/lib/oclif/help.ts"],"sourcesContent":["import { type Command, Help, type Interfaces, toConfiguredId, ux } from \"@oclif/core\";\n\nimport { exploreAllCommands } from \"../journey-guidance\";\nimport { showSkillsHint } from \"../skills-hint\";\nimport { COMMAND_GROUPS, type CommandGroup, CommandGroups, compareInGroup } from \"./groups\";\n\n/** A loaded command plus the root-help statics `BaseCommand` (`./base`) declares. */\ntype GroupedCommand = Command.Loadable & { group?: CommandGroup; groupOrder?: number };\n\n/** One line of the root screen: a command, or a family of commands under one name. */\ntype Row = { name: string; summary: string; order: number };\n\n/**\n * Summaries for oclif plugin commands that ship without one. `version` prints\n * a blank line otherwise.\n */\nconst PLUGIN_SUMMARIES: Readonly<Record<string, string>> = {\n version: \"Show the CLI version\",\n};\n\n/**\n * Root help in the style of `gh --help`: a tagline, usage, the commands under\n * headed groups, then flags and examples. A family of commands (`users`,\n * `release`) is one row, and its own help lists the operations. Only\n * {@link showRootHelp} is replaced; per-command and per-topic help\n * (`start --help`, `schemas --help`) stay oclif's own, with a pointer back to\n * the root screen added. Wired in via `oclif.helpClass` in `package.json`.\n */\nexport default class ZitadelHelp extends Help {\n protected override async showRootHelp(): Promise<void> {\n const { bin } = this.config;\n const commands = this.rootCommands();\n const groups = COMMAND_GROUPS.map(\n (group) => [group, this.rowsOf(this.commandsOf(commands, group))] as const,\n ).filter(([, rows]) => rows.length > 0);\n const width = Math.max(0, ...groups.flatMap(([, rows]) => rows.map((row) => row.name.length)));\n const list = (rows: readonly Row[]): string =>\n rows.map((row) => `${row.name.padEnd(width)} ${row.summary}`).join(\"\\n\");\n\n const sections = [\n this.render(this.config.pjson.oclif.description ?? this.config.pjson.description ?? \"\"),\n this.section(\"Usage\", `${bin} <command> [flags]`),\n `Run a command below. Use \\`${bin} <command> --help\\` to see its options.`,\n ...groups.map(([group, rows]) => this.section(group, list(rows))),\n this.section(\n \"Flags\",\n [\"--help Show help for command\", `--version Show ${bin} version`].join(\"\\n\"),\n ),\n this.section(\n \"Examples\",\n [`$ ${bin} setup --framework next`, `$ ${bin} start`, `$ ${bin} doctor`].join(\"\\n\"),\n ),\n ];\n // Only a bare `zitadel`, not `zitadel --help` or an unknown command's help.\n if (process.argv.length <= 2) {\n await showSkillsHint({\n env: process.env,\n interactive: Boolean(process.stdout.isTTY && process.stdin.isTTY),\n });\n }\n this.log(sections.join(\"\\n\\n\"));\n }\n\n override async showCommandHelp(command: Command.Loadable): Promise<void> {\n await super.showCommandHelp(command);\n this.log(exploreAllCommands(this.config.version));\n }\n\n override async showTopicHelp(topic: Interfaces.Topic): Promise<void> {\n await super.showTopicHelp(topic);\n this.log(exploreAllCommands(this.config.version));\n }\n\n /**\n * The commands the root screen lists: every visible command, grouped or\n * not, whatever its depth. Alias entries and `help` itself are left out.\n */\n private rootCommands(): GroupedCommand[] {\n return (this.sortedCommands as GroupedCommand[]).filter(\n (command) => command.id !== \"help\" && !command.aliases?.includes(command.id),\n );\n }\n\n /**\n * The commands a group lists. oclif's own utilities declare no group and are\n * listed with the last one.\n */\n private commandsOf(commands: readonly GroupedCommand[], group: CommandGroup): GroupedCommand[] {\n return commands.filter(\n (command) =>\n command.group === group ||\n (command.group === undefined && group === CommandGroups.diagnostics),\n );\n }\n\n /**\n * The rows of one group. Commands sharing a first word (`users create`,\n * `users get`) are one row named for it, described by the topic when it has\n * a description and otherwise by the command of that name; a command on its\n * own keeps its name. Rows follow `groupOrder` (the lowest of a family's\n * commands), then the name.\n */\n private rowsOf(commands: readonly GroupedCommand[]): Row[] {\n const families = new Map<string, GroupedCommand[]>();\n for (const command of commands) {\n const [family = command.id] = command.id.split(\":\");\n families.set(family, [...(families.get(family) ?? []), command]);\n }\n const rows = [...families].map(([family, members]): Row => {\n const order = Math.min(\n ...members.map((member) => member.groupOrder ?? Number.MAX_SAFE_INTEGER),\n );\n const isFamily = members.some((member) => member.id.includes(\":\"));\n if (!isFamily) {\n const [only] = members;\n return {\n name: toConfiguredId(family, this.config),\n summary: this.oneLineSummary(only?.summary ?? only?.description, only?.id),\n order,\n };\n }\n const topic = this.config.topics.find((candidate) => candidate.name === family);\n const root = members.find((member) => member.id === family) ?? members[0];\n return {\n name: toConfiguredId(family, this.config),\n summary: this.oneLineSummary(topic?.description ?? root?.summary ?? root?.description),\n order,\n };\n });\n return rows.sort((a, b) =>\n compareInGroup({ id: a.name, groupOrder: a.order }, { id: b.name, groupOrder: b.order }),\n );\n }\n\n /**\n * The summary as `gh` prints it: the first clause of the summary or\n * description, with no trailing full stop. Built from the raw statics rather\n * than {@link summary} so a user theme's colour codes cannot end up inside\n * the clause; the theme is applied once the text is final.\n */\n private oneLineSummary(text: string | undefined, id?: string): string {\n const source = (id === undefined ? undefined : PLUGIN_SUMMARIES[id]) ?? text ?? \"\";\n const [clause = \"\"] = this.render(source).split(/[.:]\\s|\\n/, 1);\n return ux.colorize(this.config.theme?.commandSummary, clause.trim().replace(/\\.$/, \"\"));\n }\n}\n"],"mappings":"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"}