rman 1.3.0 → 2.0.0-beta.3

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 (187) hide show
  1. package/README.md +65 -31
  2. package/builtins/platforms/node/augmentation/rmanrc.augmentation.d.ts +83 -0
  3. package/builtins/platforms/node/augmentation/system-info.augmentation.d.ts +26 -0
  4. package/builtins/platforms/node/augmentation/system-info.augmentation.js +79 -0
  5. package/builtins/platforms/node/commands/ci.command.d.ts +133 -0
  6. package/builtins/platforms/node/commands/ci.command.js +60 -0
  7. package/builtins/platforms/node/commands/clean.command.d.ts +185 -0
  8. package/builtins/platforms/node/commands/clean.command.js +74 -0
  9. package/builtins/platforms/node/index.d.ts +8 -0
  10. package/builtins/platforms/node/index.js +8 -0
  11. package/builtins/platforms/node/node-config.interface.d.ts +76 -0
  12. package/builtins/platforms/node/node-config.interface.js +7 -0
  13. package/builtins/platforms/node/node-manifest.provider.d.ts +68 -0
  14. package/builtins/platforms/node/node-manifest.provider.js +125 -0
  15. package/builtins/platforms/node/node.platform.d.ts +53 -0
  16. package/builtins/platforms/node/node.platform.js +134 -0
  17. package/builtins/platforms/node/services/ci.service.d.ts +47 -0
  18. package/builtins/platforms/node/services/ci.service.js +213 -0
  19. package/builtins/platforms/node/services/clean.service.d.ts +53 -0
  20. package/builtins/platforms/node/services/clean.service.js +237 -0
  21. package/builtins/platforms/node/services/publish.service.d.ts +114 -0
  22. package/builtins/platforms/node/services/publish.service.js +371 -0
  23. package/builtins/platforms/node/services/version-plan.service.d.ts +44 -0
  24. package/builtins/platforms/node/services/version-plan.service.js +58 -0
  25. package/builtins/platforms/node/utils/workspace-range.d.ts +26 -0
  26. package/builtins/platforms/node/utils/workspace-range.js +28 -0
  27. package/builtins/presets/index.d.ts +15 -0
  28. package/builtins/presets/index.js +57 -0
  29. package/builtins/presets/node.d.ts +16 -0
  30. package/builtins/presets/node.js +57 -0
  31. package/{services → builtins/publish-targets/docker}/docker-publish.service.d.ts +52 -31
  32. package/{services → builtins/publish-targets/docker}/docker-publish.service.js +49 -26
  33. package/builtins/publish-targets/docker/docker.target.d.ts +54 -0
  34. package/builtins/publish-targets/docker/docker.target.js +40 -0
  35. package/builtins/publish-targets/docker/index.d.ts +2 -0
  36. package/builtins/publish-targets/docker/index.js +2 -0
  37. package/builtins/publish-targets/npm/index.d.ts +2 -0
  38. package/builtins/publish-targets/npm/index.js +2 -0
  39. package/builtins/publish-targets/npm/npm-publish-target.d.ts +73 -0
  40. package/builtins/publish-targets/npm/npm-publish-target.js +95 -0
  41. package/builtins/publish-targets/npm/npm-view.d.ts +48 -0
  42. package/builtins/publish-targets/npm/npm-view.js +71 -0
  43. package/cli.d.ts +8 -0
  44. package/cli.js +228 -93
  45. package/commands/build.command.d.ts +177 -3
  46. package/commands/build.command.js +20 -10
  47. package/commands/changelog.command.d.ts +296 -3
  48. package/commands/changelog.command.js +127 -43
  49. package/commands/config.command.d.ts +44 -3
  50. package/commands/config.command.js +53 -24
  51. package/commands/diff.command.d.ts +37 -3
  52. package/commands/diff.command.js +25 -16
  53. package/commands/exec.command.d.ts +193 -3
  54. package/commands/exec.command.js +60 -58
  55. package/commands/github-release.command.d.ts +154 -3
  56. package/commands/github-release.command.js +67 -37
  57. package/commands/import.command.d.ts +36 -3
  58. package/commands/import.command.js +28 -20
  59. package/commands/info.command.d.ts +35 -7
  60. package/commands/info.command.js +36 -30
  61. package/commands/lint.command.d.ts +176 -0
  62. package/commands/lint.command.js +34 -0
  63. package/commands/list.command.d.ts +163 -3
  64. package/commands/list.command.js +109 -71
  65. package/commands/publish.command.d.ts +231 -0
  66. package/commands/publish.command.js +304 -0
  67. package/commands/run.command.d.ts +186 -6
  68. package/commands/run.command.js +26 -72
  69. package/commands/test.command.d.ts +173 -3
  70. package/commands/test.command.js +16 -10
  71. package/commands/version.command.d.ts +330 -3
  72. package/commands/version.command.js +292 -78
  73. package/commands.d.ts +32 -0
  74. package/commands.js +28 -0
  75. package/constants.js +1 -1
  76. package/core/application.d.ts +116 -0
  77. package/core/application.js +160 -0
  78. package/core/classes/package.d.ts +219 -0
  79. package/core/classes/package.js +214 -0
  80. package/core/classes/registry.d.ts +30 -0
  81. package/core/classes/registry.js +47 -0
  82. package/core/{repository.d.ts → classes/repository.d.ts} +69 -20
  83. package/core/{repository.js → classes/repository.js} +195 -75
  84. package/core/classes/service.d.ts +49 -0
  85. package/core/classes/service.js +40 -0
  86. package/core/{version-scheme.d.ts → classes/version-scheme.d.ts} +23 -1
  87. package/core/{version-scheme.js → classes/version-scheme.js} +29 -1
  88. package/core/classes/workspace.d.ts +275 -0
  89. package/core/classes/workspace.js +537 -0
  90. package/core/command-builder.d.ts +14 -0
  91. package/core/command-builder.js +94 -0
  92. package/core/config/config-file-scope.d.ts +107 -0
  93. package/core/config/config-file-scope.js +226 -0
  94. package/core/config/config-interpolator.d.ts +164 -0
  95. package/core/config/config-interpolator.js +577 -0
  96. package/core/config/config-paths.d.ts +65 -0
  97. package/core/config/config-paths.js +78 -0
  98. package/core/config/config-reader.d.ts +192 -0
  99. package/core/config/config-reader.js +727 -0
  100. package/core/{merge-config.d.ts → config/merge-config.d.ts} +33 -34
  101. package/core/config/merge-config.js +260 -0
  102. package/core/{resolve-target.d.ts → config/resolve-config-target.d.ts} +1 -1
  103. package/core/{resolve-target.js → config/resolve-config-target.js} +1 -1
  104. package/core/{custom-command.d.ts → interfaces/custom-command.d.ts} +46 -10
  105. package/core/{custom-command.js → interfaces/custom-command.js} +44 -17
  106. package/core/{manifest.d.ts → interfaces/manifest.d.ts} +49 -27
  107. package/core/interfaces/manifest.js +132 -0
  108. package/core/interfaces/plugin.d.ts +174 -0
  109. package/core/interfaces/plugin.js +124 -0
  110. package/core/interfaces/publish-target.d.ts +136 -0
  111. package/core/interfaces/publish-target.js +43 -0
  112. package/core/{run-step.d.ts → interfaces/run-step.d.ts} +4 -4
  113. package/core/interfaces/run-step.js +1 -0
  114. package/core/plugin-loader.d.ts +25 -0
  115. package/core/plugin-loader.js +53 -0
  116. package/index.d.ts +122 -24
  117. package/index.js +66 -16
  118. package/interfaces/config-scope.interface.d.ts +223 -0
  119. package/interfaces/config-scope.interface.js +1 -0
  120. package/interfaces/rman-config.interface.d.ts +821 -203
  121. package/interfaces/rman-config.interface.js +78 -1
  122. package/package.json +3 -1
  123. package/services/change-hash.service.d.ts +42 -8
  124. package/services/change-hash.service.js +92 -13
  125. package/services/changelog.service.d.ts +91 -52
  126. package/services/changelog.service.js +460 -74
  127. package/services/config-service.d.ts +8 -0
  128. package/services/config-service.js +3 -0
  129. package/services/exec.service.d.ts +23 -12
  130. package/services/exec.service.js +14 -9
  131. package/services/github-release.service.d.ts +45 -34
  132. package/services/github-release.service.js +15 -12
  133. package/services/import.service.d.ts +25 -14
  134. package/services/import.service.js +9 -5
  135. package/services/list.service.d.ts +67 -13
  136. package/services/list.service.js +62 -15
  137. package/services/run.service.d.ts +35 -22
  138. package/services/run.service.js +316 -233
  139. package/services/system-info.d.ts +1 -1
  140. package/services/version-plan.service.d.ts +35 -8
  141. package/services/version-plan.service.js +96 -36
  142. package/services/version.service.d.ts +34 -14
  143. package/services/version.service.js +35 -16
  144. package/services.d.ts +1 -1
  145. package/services.js +1 -1
  146. package/utils/bin-path.d.ts +6 -7
  147. package/utils/bin-path.js +7 -18
  148. package/utils/branch-guard.d.ts +30 -1
  149. package/utils/branch-guard.js +31 -0
  150. package/utils/color-yaml.d.ts +8 -0
  151. package/utils/color-yaml.js +86 -0
  152. package/utils/exec.d.ts +10 -0
  153. package/utils/exec.js +1 -1
  154. package/utils/git.d.ts +26 -0
  155. package/utils/git.js +65 -0
  156. package/utils/logger.d.ts +2 -2
  157. package/utils/logger.js +1 -1
  158. package/utils/package-filter.d.ts +135 -8
  159. package/utils/package-filter.js +204 -16
  160. package/utils/printable-config.d.ts +9 -1
  161. package/utils/printable-config.js +46 -1
  162. package/utils/progress-panel.d.ts +9 -0
  163. package/utils/progress-panel.js +23 -1
  164. package/utils/release-version.d.ts +1 -1
  165. package/utils/run-bin.d.ts +10 -0
  166. package/utils/run-bin.js +1 -1
  167. package/utils/run-options.d.ts +97 -0
  168. package/utils/run-options.js +81 -0
  169. package/utils/version-group.d.ts +31 -0
  170. package/utils/version-group.js +43 -0
  171. package/utils/version-stamp.d.ts +1 -1
  172. package/utils/version-stamp.js +1 -1
  173. package/commands/changed.command.d.ts +0 -3
  174. package/commands/changed.command.js +0 -29
  175. package/core/config.d.ts +0 -409
  176. package/core/config.js +0 -939
  177. package/core/extends-config.d.ts +0 -27
  178. package/core/extends-config.js +0 -89
  179. package/core/manifest.js +0 -150
  180. package/core/merge-config.js +0 -219
  181. package/core/package.d.ts +0 -83
  182. package/core/package.js +0 -106
  183. package/core/plugin.d.ts +0 -112
  184. package/core/plugin.js +0 -189
  185. package/core/workspace.d.ts +0 -68
  186. package/core/workspace.js +0 -83
  187. /package/{core/run-step.js → builtins/platforms/node/augmentation/rmanrc.augmentation.js} +0 -0
@@ -0,0 +1,176 @@
1
+ import { type RmanConfig } from '../interfaces/rman-config.interface.js';
2
+ declare const COMMAND: "lint";
3
+ declare const config: {
4
+ parallel: {
5
+ target: "cli";
6
+ describe: string;
7
+ coerce: (v: unknown) => boolean | number | undefined;
8
+ };
9
+ bail: {
10
+ target: "cli";
11
+ describe: string;
12
+ type: "boolean";
13
+ };
14
+ topo: {
15
+ target: "cli";
16
+ describe: string;
17
+ type: "boolean";
18
+ };
19
+ progress: {
20
+ target: "cli";
21
+ describe: string;
22
+ type: "boolean";
23
+ };
24
+ changed: {
25
+ target: "cli";
26
+ alias: string;
27
+ describe: string;
28
+ type: "boolean";
29
+ };
30
+ changedSince: {
31
+ target: "cli";
32
+ cliName: string;
33
+ describe: string;
34
+ type: "string";
35
+ conflicts: string;
36
+ };
37
+ fromRoot: {
38
+ target: "cli";
39
+ cliName: string;
40
+ alias: string;
41
+ describe: string;
42
+ type: "boolean";
43
+ };
44
+ allowBranch: {
45
+ target: "cli";
46
+ cliName: string;
47
+ describe: string;
48
+ type: "string";
49
+ };
50
+ ignoreBranch: {
51
+ target: "cli";
52
+ cliName: string;
53
+ describe: string;
54
+ type: "string";
55
+ };
56
+ scope: {
57
+ target: "cli";
58
+ describe: string;
59
+ type: "string";
60
+ };
61
+ ignore: {
62
+ target: "cli";
63
+ describe: string;
64
+ type: "string";
65
+ };
66
+ platform: {
67
+ target: "cli";
68
+ describe: string;
69
+ type: "string";
70
+ };
71
+ deps: {
72
+ target: "cli";
73
+ describe: string;
74
+ type: "boolean";
75
+ };
76
+ dependents: {
77
+ target: "cli";
78
+ describe: string;
79
+ type: "boolean";
80
+ };
81
+ };
82
+ type Args = RmanConfig.ArgsOf<typeof config, typeof COMMAND>;
83
+ /**
84
+ * `rman lint` - an alias for `rman run lint`, the third of the trio beside `build` and `test`.
85
+ */
86
+ declare const lintCommand: (app: import("../index.js").RmanApplication) => {
87
+ command: "lint";
88
+ describe: string;
89
+ /** Read, not owned - see the note above. */
90
+ configKeys: string[];
91
+ config: {
92
+ parallel: {
93
+ target: "cli";
94
+ describe: string;
95
+ coerce: (v: unknown) => boolean | number | undefined;
96
+ };
97
+ bail: {
98
+ target: "cli";
99
+ describe: string;
100
+ type: "boolean";
101
+ };
102
+ topo: {
103
+ target: "cli";
104
+ describe: string;
105
+ type: "boolean";
106
+ };
107
+ progress: {
108
+ target: "cli";
109
+ describe: string;
110
+ type: "boolean";
111
+ };
112
+ changed: {
113
+ target: "cli";
114
+ alias: string;
115
+ describe: string;
116
+ type: "boolean";
117
+ };
118
+ changedSince: {
119
+ target: "cli";
120
+ cliName: string;
121
+ describe: string;
122
+ type: "string";
123
+ conflicts: string;
124
+ };
125
+ fromRoot: {
126
+ target: "cli";
127
+ cliName: string;
128
+ alias: string;
129
+ describe: string;
130
+ type: "boolean";
131
+ };
132
+ allowBranch: {
133
+ target: "cli";
134
+ cliName: string;
135
+ describe: string;
136
+ type: "string";
137
+ };
138
+ ignoreBranch: {
139
+ target: "cli";
140
+ cliName: string;
141
+ describe: string;
142
+ type: "string";
143
+ };
144
+ scope: {
145
+ target: "cli";
146
+ describe: string;
147
+ type: "string";
148
+ };
149
+ ignore: {
150
+ target: "cli";
151
+ describe: string;
152
+ type: "string";
153
+ };
154
+ platform: {
155
+ target: "cli";
156
+ describe: string;
157
+ type: "string";
158
+ };
159
+ deps: {
160
+ target: "cli";
161
+ describe: string;
162
+ type: "boolean";
163
+ };
164
+ dependents: {
165
+ target: "cli";
166
+ describe: string;
167
+ type: "boolean";
168
+ };
169
+ };
170
+ examples: {
171
+ command: string;
172
+ description: string;
173
+ }[];
174
+ handler: (args: Args) => Promise<void>;
175
+ };
176
+ export default lintCommand;
@@ -0,0 +1,34 @@
1
+ import { registerCommand } from '../interfaces/rman-config.interface.js';
2
+ import { assertAllowedBranch, readBranchGuardOptions } from '../utils/branch-guard.js';
3
+ import { readRunOptions, runOptions } from '../utils/run-options.js';
4
+ const COMMAND = 'lint';
5
+ const config = runOptions;
6
+ /**
7
+ * `rman lint` - an alias for `rman run lint`, the third of the trio beside `build` and `test`.
8
+ */
9
+ /* **Core, not the `node` preset, and the test is what the command *knows*.** It knows a script
10
+ * name and nothing else: a Cargo repository declaring `lint: 'cargo clippy'` and a Go one
11
+ * declaring `golangci-lint run` are served by exactly this file. That is the line `clean` is on the
12
+ * other side of - everything `clean` knows how to delete is a TypeScript fact - and it is why
13
+ * `build` and `test` are here too.
14
+ *
15
+ * **It owns no config key**, for the reason `build` documents: `lint` is `run lint` under another
16
+ * name, so its settings are `run.lint`, which belongs to `run`. Two commands cannot contribute
17
+ * under one top-level key - interface merging is not a deep merge - and these three never needed
18
+ * to. */
19
+ const lintCommand = registerCommand(app => {
20
+ const repository = app.repository;
21
+ return {
22
+ command: COMMAND,
23
+ describe: 'Alias for "run lint"',
24
+ /** Read, not owned - see the note above. */
25
+ configKeys: ['run.lint'],
26
+ config,
27
+ examples: [{ command: '$0 lint', description: '# Lints packages' }],
28
+ handler: async (args) => {
29
+ await assertAllowedBranch(repository, readBranchGuardOptions(args));
30
+ await app.getService('run').runScript('lint', { ...readRunOptions(args), commandName: 'lint' });
31
+ },
32
+ };
33
+ });
34
+ export default lintCommand;
@@ -1,3 +1,163 @@
1
- import type { Argv } from 'yargs';
2
- import type { Repository } from '../core/repository.js';
3
- export declare function initCli(repository: Repository, program: Argv): void;
1
+ import { type RmanConfig } from '../interfaces/rman-config.interface.js';
2
+ /** `[options...]` is yargs-meaningless - its variadic marker is two dots, and this command declares
3
+ * no positional for it. Left as it is rather than fixed in passing: dropping it makes
4
+ * `rman list foo` start failing, which is a behaviour change and belongs in its own commit. */
5
+ declare const COMMAND: "list [options...]";
6
+ declare const config: {
7
+ short: {
8
+ target: "cli";
9
+ alias: string;
10
+ describe: string;
11
+ type: "boolean";
12
+ };
13
+ parseable: {
14
+ target: "cli";
15
+ alias: string;
16
+ describe: string;
17
+ type: "boolean";
18
+ };
19
+ toposort: {
20
+ target: "cli";
21
+ alias: string;
22
+ describe: string;
23
+ type: "boolean";
24
+ };
25
+ graph: {
26
+ target: "cli";
27
+ alias: string;
28
+ describe: string;
29
+ type: "boolean";
30
+ /** Declared on the option instead of as separate `.conflicts()` calls - what a flag is and what
31
+ * it cannot be combined with end up in one place. */
32
+ conflicts: string[];
33
+ };
34
+ json: {
35
+ target: "cli";
36
+ alias: string;
37
+ describe: string;
38
+ type: "boolean";
39
+ };
40
+ changed: {
41
+ target: "cli";
42
+ alias: string;
43
+ describe: string;
44
+ type: "boolean";
45
+ };
46
+ changedSince: {
47
+ target: "cli";
48
+ cliName: string;
49
+ describe: string;
50
+ type: "string";
51
+ conflicts: string;
52
+ };
53
+ scope: {
54
+ target: "cli";
55
+ describe: string;
56
+ type: "string";
57
+ };
58
+ ignore: {
59
+ target: "cli";
60
+ describe: string;
61
+ type: "string";
62
+ };
63
+ platform: {
64
+ target: "cli";
65
+ describe: string;
66
+ type: "string";
67
+ };
68
+ deps: {
69
+ target: "cli";
70
+ describe: string;
71
+ type: "boolean";
72
+ };
73
+ dependents: {
74
+ target: "cli";
75
+ describe: string;
76
+ type: "boolean";
77
+ };
78
+ };
79
+ type Args = RmanConfig.ArgsOf<typeof config, typeof COMMAND>;
80
+ declare const listCommand: (app: import("../index.js").RmanApplication) => {
81
+ command: "list [options...]";
82
+ aliases: string[];
83
+ describe: string;
84
+ config: {
85
+ short: {
86
+ target: "cli";
87
+ alias: string;
88
+ describe: string;
89
+ type: "boolean";
90
+ };
91
+ parseable: {
92
+ target: "cli";
93
+ alias: string;
94
+ describe: string;
95
+ type: "boolean";
96
+ };
97
+ toposort: {
98
+ target: "cli";
99
+ alias: string;
100
+ describe: string;
101
+ type: "boolean";
102
+ };
103
+ graph: {
104
+ target: "cli";
105
+ alias: string;
106
+ describe: string;
107
+ type: "boolean";
108
+ /** Declared on the option instead of as separate `.conflicts()` calls - what a flag is and what
109
+ * it cannot be combined with end up in one place. */
110
+ conflicts: string[];
111
+ };
112
+ json: {
113
+ target: "cli";
114
+ alias: string;
115
+ describe: string;
116
+ type: "boolean";
117
+ };
118
+ changed: {
119
+ target: "cli";
120
+ alias: string;
121
+ describe: string;
122
+ type: "boolean";
123
+ };
124
+ changedSince: {
125
+ target: "cli";
126
+ cliName: string;
127
+ describe: string;
128
+ type: "string";
129
+ conflicts: string;
130
+ };
131
+ scope: {
132
+ target: "cli";
133
+ describe: string;
134
+ type: "string";
135
+ };
136
+ ignore: {
137
+ target: "cli";
138
+ describe: string;
139
+ type: "string";
140
+ };
141
+ platform: {
142
+ target: "cli";
143
+ describe: string;
144
+ type: "string";
145
+ };
146
+ deps: {
147
+ target: "cli";
148
+ describe: string;
149
+ type: "boolean";
150
+ };
151
+ dependents: {
152
+ target: "cli";
153
+ describe: string;
154
+ type: "boolean";
155
+ };
156
+ };
157
+ examples: {
158
+ command: string;
159
+ description: string;
160
+ }[];
161
+ handler: (args: Args) => Promise<void>;
162
+ };
163
+ export default listCommand;
@@ -1,7 +1,91 @@
1
1
  import colors from 'ansi-colors';
2
2
  import EasyTable from 'easy-table';
3
- import { ListService } from '../services/list.service.js';
4
- import { applyPackageFilterOptions, readPackageFilterOptions } from '../utils/package-filter.js';
3
+ import { registerCommand } from '../interfaces/rman-config.interface.js';
4
+ import { packageFilterOptions, readPackageFilterOptions } from '../utils/package-filter.js';
5
+ /** `[options...]` is yargs-meaningless - its variadic marker is two dots, and this command declares
6
+ * no positional for it. Left as it is rather than fixed in passing: dropping it makes
7
+ * `rman list foo` start failing, which is a behaviour change and belongs in its own commit. */
8
+ const COMMAND = 'list [options...]';
9
+ const config = {
10
+ ...packageFilterOptions,
11
+ short: { target: 'cli', alias: 's', describe: 'Do not show extended information', type: 'boolean' },
12
+ parseable: { target: 'cli', alias: 'p', describe: 'Show parseable output', type: 'boolean' },
13
+ toposort: {
14
+ target: 'cli',
15
+ alias: 't',
16
+ describe: 'Sort packages in topological order (dependencies before dependents) instead of lexical by directory',
17
+ type: 'boolean',
18
+ },
19
+ graph: {
20
+ target: 'cli',
21
+ alias: 'g',
22
+ describe: 'Show dependency graph as a JSON-formatted adjacency list',
23
+ type: 'boolean',
24
+ /** Declared on the option instead of as separate `.conflicts()` calls - what a flag is and what
25
+ * it cannot be combined with end up in one place. */
26
+ conflicts: ['parseable', 'json'],
27
+ },
28
+ json: { target: 'cli', alias: 'j', describe: 'Show output in JSON format', type: 'boolean' },
29
+ changed: {
30
+ target: 'cli',
31
+ alias: 'c',
32
+ describe: 'Only list packages you have touched but not pushed - uncommitted, or committed and not yet on the upstream branch. Not a release question; see "version --json" for that',
33
+ type: 'boolean',
34
+ },
35
+ changedSince: {
36
+ target: 'cli',
37
+ cliName: 'changed-since',
38
+ describe: 'Only list packages that have changed since the given git commit/hash',
39
+ type: 'string',
40
+ conflicts: 'changed',
41
+ },
42
+ };
43
+ const listCommand = registerCommand(app => {
44
+ return {
45
+ command: COMMAND,
46
+ aliases: ['ls'],
47
+ describe: 'Lists packages in repository',
48
+ config,
49
+ examples: [
50
+ { command: '$0 list', description: '# List all packages' },
51
+ { command: '$0 list --json', description: '# List all packages in JSON format' },
52
+ ],
53
+ handler: async (args) => {
54
+ /**
55
+ * **Only the table asks for the root**, and that is why the option exists rather than the
56
+ * service always including it. The table draws a tree, which needs the row its members are
57
+ * nested under; the other four forms are the inventory a script parses, and the inventory is
58
+ * the workspace members - which is also what the count line reports.
59
+ */
60
+ const table = !args.graph && !args.json && !args.parseable && !args.short;
61
+ const items = await app.getService('list').getPackages({
62
+ ...readPackageFilterOptions(args),
63
+ toposort: args.toposort,
64
+ changed: args.changed,
65
+ changedSince: args.changedSince,
66
+ includeRoot: table,
67
+ });
68
+ if (args.graph)
69
+ printGraph(items);
70
+ else if (args.json)
71
+ console.log(JSON.stringify(items, undefined, 2));
72
+ else if (args.parseable)
73
+ printParseable(items);
74
+ else if (args.short)
75
+ for (const it of items)
76
+ console.log(it.name);
77
+ /**
78
+ * **Whether a root row was added is asked here, not inferred from the rows.** `isRoot` is
79
+ * true of the one package in a *single-package* repository too - it genuinely is the root -
80
+ * so counting rows that are not the root reported `0 Package(s) found` there (measured). The
81
+ * condition is the same one the service applies, and it is one line.
82
+ */
83
+ else
84
+ printTable(items, table && app.repository.monorepo);
85
+ },
86
+ };
87
+ });
88
+ export default listCommand;
5
89
  function statusLabel(status) {
6
90
  switch (status) {
7
91
  case 'dirty':
@@ -14,11 +98,31 @@ function statusLabel(status) {
14
98
  return '';
15
99
  }
16
100
  }
17
- function printTable(items) {
101
+ /**
102
+ * **The tree, as a table**: the root first, then each package indented by how far below it sits.
103
+ *
104
+ * Indentation rather than box-drawing characters, which was the cheaper answer to the same
105
+ * question and stays legible when the output is pasted somewhere without a monospace font, copied
106
+ * into a `--scope` argument, or read by eye for the one name someone is looking for. The nesting is
107
+ * `Item.depth`, a fact about the package - so `--toposort` reorders the rows and leaves each one's
108
+ * indentation telling the truth about where it lives.
109
+ *
110
+ * **`Platform` is a column because a package's technology is now a per-package answer.** A polyglot
111
+ * repository is the whole point of the walk finding nested packages of another platform, and until
112
+ * this column existed `rman list` was the one place that showed every package and could not say
113
+ * which technology each belonged to. Blank rather than a word when none claimed it: `Package.provider`
114
+ * is an empty string there, and inventing `unknown` would read as a technology's name.
115
+ *
116
+ * **The count is the members**, root excluded, which is what `repository.packages` means and what
117
+ * every other form of this command reports.
118
+ */
119
+ function printTable(items, withRoot) {
18
120
  const table = new EasyTable();
19
121
  for (const it of items) {
20
- table.cell('Package', colors.yellowBright(it.name));
122
+ const indent = ' '.repeat(it.depth);
123
+ table.cell('Package', indent + (it.isRoot ? colors.whiteBright(it.selector) : colors.yellowBright(it.selector)));
21
124
  table.cell('Version', colors.yellow(it.version));
125
+ table.cell('Platform', it.platform ? colors.cyan(it.platform) : '');
22
126
  table.cell('Private', it.private ? colors.magentaBright('yes') : '');
23
127
  table.cell('Changed', statusLabel(it.status));
24
128
  table.cell('Path', it.location);
@@ -26,7 +130,7 @@ function printTable(items) {
26
130
  }
27
131
  console.log(table.toString().trim());
28
132
  console.log('');
29
- console.log(colors.gray(`${items.length} Package(s) found`));
133
+ console.log(colors.gray(`${items.length - (withRoot ? 1 : 0)} Package(s) found`));
30
134
  }
31
135
  function printParseable(items) {
32
136
  for (const it of items) {
@@ -45,69 +149,3 @@ function printGraph(items) {
45
149
  graph[it.name] = it.dependencies;
46
150
  console.log(JSON.stringify(graph, undefined, 2));
47
151
  }
48
- export function initCli(repository, program) {
49
- program.command({
50
- command: 'list [options...]',
51
- aliases: ['ls'],
52
- describe: 'Lists packages in repository',
53
- builder: cmd => applyPackageFilterOptions(cmd)
54
- .example('$0 list', '# List all packages')
55
- .example('$0 list --json', '# List all packages in JSON format')
56
- .conflicts('graph', ['parseable', 'json'])
57
- .conflicts('short', ['parseable', 'json'])
58
- .conflicts('changed', 'changed-since')
59
- .option('short', {
60
- alias: 's',
61
- describe: 'Do not show extended information',
62
- type: 'boolean',
63
- })
64
- .option('parseable', {
65
- alias: 'p',
66
- describe: 'Show parseable output',
67
- type: 'boolean',
68
- })
69
- .option('toposort', {
70
- alias: 't',
71
- describe: 'Sort packages in topological order (dependencies before dependents) instead of lexical by directory',
72
- type: 'boolean',
73
- })
74
- .option('graph', {
75
- alias: 'g',
76
- describe: 'Show dependency graph as a JSON-formatted adjacency list',
77
- type: 'boolean',
78
- })
79
- .option('json', {
80
- alias: 'j',
81
- describe: 'Show output in JSON format',
82
- type: 'boolean',
83
- })
84
- .option('changed', {
85
- alias: 'c',
86
- describe: 'Only list packages that have changed since the last publish (dirty or committed but not yet published)',
87
- type: 'boolean',
88
- })
89
- .option('changed-since', {
90
- describe: 'Only list packages that have changed since the given git commit/hash',
91
- type: 'string',
92
- }),
93
- handler: async (args) => {
94
- const items = await ListService.getPackages(repository, {
95
- ...readPackageFilterOptions(args),
96
- toposort: args.toposort,
97
- changed: args.changed,
98
- changedSince: args.changedSince,
99
- });
100
- if (args.graph)
101
- printGraph(items);
102
- else if (args.json)
103
- console.log(JSON.stringify(items, undefined, 2));
104
- else if (args.parseable)
105
- printParseable(items);
106
- else if (args.short)
107
- for (const it of items)
108
- console.log(it.name);
109
- else
110
- printTable(items);
111
- },
112
- });
113
- }