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
@@ -1,3 +1,154 @@
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
+ declare const COMMAND: "github-release";
3
+ declare const config: {
4
+ yes: {
5
+ target: "cli";
6
+ alias: string;
7
+ describe: string;
8
+ type: "boolean";
9
+ };
10
+ dryRun: {
11
+ target: "cli";
12
+ cliName: string;
13
+ describe: string;
14
+ type: "boolean";
15
+ };
16
+ json: {
17
+ target: "cli";
18
+ alias: string;
19
+ describe: string;
20
+ type: "boolean";
21
+ };
22
+ ignoreDirty: {
23
+ target: "cli";
24
+ cliName: string;
25
+ describe: string;
26
+ type: "boolean";
27
+ };
28
+ repository: {
29
+ target: "both";
30
+ describe: string;
31
+ type: "string";
32
+ };
33
+ /** Config-only: details of the release, with no reason to be a flag. `target: 'config'` is what
34
+ * says so, and it is the whole point of the field - a key can exist in `.rmanrc` without
35
+ * existing on the command line. */
36
+ draft: {
37
+ target: "config";
38
+ describe: string;
39
+ type: "boolean";
40
+ };
41
+ prerelease: {
42
+ target: "config";
43
+ describe: string;
44
+ type: "boolean";
45
+ };
46
+ assets: {
47
+ target: "config";
48
+ describe: string;
49
+ /** `type: 'string'` plus `array: true`, not `type: 'array'`: the latter loses the element type
50
+ * and the contribution would read `unknown[]`. This is what keeps `assets` a `string[]` and is
51
+ * why the key needs no `Extra`. */
52
+ type: "string";
53
+ array: true;
54
+ };
55
+ allowBranch: {
56
+ target: "cli";
57
+ cliName: string;
58
+ describe: string;
59
+ type: "string";
60
+ };
61
+ ignoreBranch: {
62
+ target: "cli";
63
+ cliName: string;
64
+ describe: string;
65
+ type: "string";
66
+ };
67
+ };
68
+ type Args = RmanConfig.ArgsOf<typeof config, typeof COMMAND>;
69
+ declare const githubReleaseCommand: (app: import("../index.js").RmanApplication) => {
70
+ command: "github-release";
71
+ /** `githubRelease`, not `github-release`: a config key is camelCase and a command name is
72
+ * hyphenated, and this is the one command out of the whole set where the two differ. */
73
+ configKey: "githubRelease";
74
+ describe: string;
75
+ /** Read, not owned - the release tag's pattern is `version`'s key. */
76
+ configKeys: string[];
77
+ config: {
78
+ yes: {
79
+ target: "cli";
80
+ alias: string;
81
+ describe: string;
82
+ type: "boolean";
83
+ };
84
+ dryRun: {
85
+ target: "cli";
86
+ cliName: string;
87
+ describe: string;
88
+ type: "boolean";
89
+ };
90
+ json: {
91
+ target: "cli";
92
+ alias: string;
93
+ describe: string;
94
+ type: "boolean";
95
+ };
96
+ ignoreDirty: {
97
+ target: "cli";
98
+ cliName: string;
99
+ describe: string;
100
+ type: "boolean";
101
+ };
102
+ repository: {
103
+ target: "both";
104
+ describe: string;
105
+ type: "string";
106
+ };
107
+ /** Config-only: details of the release, with no reason to be a flag. `target: 'config'` is what
108
+ * says so, and it is the whole point of the field - a key can exist in `.rmanrc` without
109
+ * existing on the command line. */
110
+ draft: {
111
+ target: "config";
112
+ describe: string;
113
+ type: "boolean";
114
+ };
115
+ prerelease: {
116
+ target: "config";
117
+ describe: string;
118
+ type: "boolean";
119
+ };
120
+ assets: {
121
+ target: "config";
122
+ describe: string;
123
+ /** `type: 'string'` plus `array: true`, not `type: 'array'`: the latter loses the element type
124
+ * and the contribution would read `unknown[]`. This is what keeps `assets` a `string[]` and is
125
+ * why the key needs no `Extra`. */
126
+ type: "string";
127
+ array: true;
128
+ };
129
+ allowBranch: {
130
+ target: "cli";
131
+ cliName: string;
132
+ describe: string;
133
+ type: "string";
134
+ };
135
+ ignoreBranch: {
136
+ target: "cli";
137
+ cliName: string;
138
+ describe: string;
139
+ type: "string";
140
+ };
141
+ };
142
+ examples: {
143
+ command: string;
144
+ description: string;
145
+ }[];
146
+ handler: (args: Args) => Promise<void>;
147
+ };
148
+ export default githubReleaseCommand;
149
+ declare module '../interfaces/rman-config.interface.js' {
150
+ namespace RmanConfig {
151
+ interface CommandConfigs extends RmanConfig.CommandContribution<ReturnType<typeof githubReleaseCommand>> {
152
+ }
153
+ }
154
+ }
@@ -1,44 +1,73 @@
1
1
  import readline from 'node:readline/promises';
2
2
  import colors from 'ansi-colors';
3
- import { GithubReleaseService } from '../services/github-release.service.js';
4
- import { applyBranchGuardOptions, assertAllowedBranch, readBranchGuardOptions } from '../utils/branch-guard.js';
5
- export function initCli(repository, program) {
6
- program.command({
7
- command: 'github-release',
8
- configKeys: ['githubRelease', 'version.releaseTagPattern'],
3
+ import { registerCommand } from '../interfaces/rman-config.interface.js';
4
+ import { assertAllowedBranch, branchGuardOptions, readBranchGuardOptions } from '../utils/branch-guard.js';
5
+ const COMMAND = 'github-release';
6
+ const config = {
7
+ ...branchGuardOptions,
8
+ yes: {
9
+ target: 'cli',
10
+ alias: 'y',
11
+ describe: 'Skip the confirmation prompt and create the release immediately',
12
+ type: 'boolean',
13
+ },
14
+ dryRun: {
15
+ target: 'cli',
16
+ cliName: 'dry-run',
17
+ describe: 'Only show the plan - never creates anything, regardless of --yes',
18
+ type: 'boolean',
19
+ },
20
+ json: { target: 'cli', alias: 'j', describe: 'Print the plan as JSON instead of text', type: 'boolean' },
21
+ ignoreDirty: {
22
+ target: 'cli',
23
+ cliName: 'ignore-dirty',
24
+ describe: 'Release anyway when the working tree has uncommitted changes, instead of aborting',
25
+ type: 'boolean',
26
+ },
27
+ repository: {
28
+ target: 'both',
29
+ describe: 'The "owner/repo" the release is created in - default: .rmanrc "githubRelease.repository", ' +
30
+ 'falling back to the "origin" remote.',
31
+ type: 'string',
32
+ },
33
+ /** Config-only: details of the release, with no reason to be a flag. `target: 'config'` is what
34
+ * says so, and it is the whole point of the field - a key can exist in `.rmanrc` without
35
+ * existing on the command line. */
36
+ draft: { target: 'config', describe: 'Create the release as a draft', type: 'boolean' },
37
+ prerelease: { target: 'config', describe: 'Mark the release as a prerelease', type: 'boolean' },
38
+ assets: {
39
+ target: 'config',
40
+ describe: "Files to attach to the release, as glob patterns relative to the package's own directory " +
41
+ '(e.g. ["dist/*.tar.gz"]). Read from every package, since one release covers the whole ' +
42
+ 'source tree. A release with no assets at all is still perfectly valid.',
43
+ /** `type: 'string'` plus `array: true`, not `type: 'array'`: the latter loses the element type
44
+ * and the contribution would read `unknown[]`. This is what keeps `assets` a `string[]` and is
45
+ * why the key needs no `Extra`. */
46
+ type: 'string',
47
+ array: true,
48
+ },
49
+ };
50
+ const githubReleaseCommand = registerCommand(app => {
51
+ const repository = app.repository;
52
+ return {
53
+ command: COMMAND,
54
+ /** `githubRelease`, not `github-release`: a config key is camelCase and a command name is
55
+ * hyphenated, and this is the one command out of the whole set where the two differ. */
56
+ configKey: 'githubRelease',
9
57
  describe: "Creates the repository's GitHub Release for the version that just shipped",
10
- builder: cmd => applyBranchGuardOptions(cmd)
11
- .example('$0 github-release', '# Show what would be released, then ask for confirmation')
12
- .example('$0 github-release --yes', '# Create it immediately, no confirmation (CI)')
13
- .example('$0 github-release --dry-run', '# Only show the plan')
14
- .option('yes', {
15
- alias: 'y',
16
- describe: 'Skip the confirmation prompt and create the release immediately',
17
- type: 'boolean',
18
- })
19
- .option('dry-run', {
20
- describe: 'Only show the plan - never creates anything, regardless of --yes',
21
- type: 'boolean',
22
- })
23
- .option('json', {
24
- alias: 'j',
25
- describe: 'Print the plan as JSON instead of text',
26
- type: 'boolean',
27
- })
28
- .option('repository', {
29
- describe: 'The "owner/repo" the release is created in - default: .rmanrc "githubRelease.repository", ' +
30
- 'falling back to the "origin" remote.',
31
- type: 'string',
32
- })
33
- .option('ignore-dirty', {
34
- describe: 'Release anyway when the working tree has uncommitted changes, instead of aborting',
35
- type: 'boolean',
36
- }),
58
+ /** Read, not owned - the release tag's pattern is `version`'s key. */
59
+ configKeys: ['version.releaseTagPattern'],
60
+ config,
61
+ examples: [
62
+ { command: '$0 github-release', description: '# Show what would be released, then ask for confirmation' },
63
+ { command: '$0 github-release --yes', description: '# Create it immediately, no confirmation (CI)' },
64
+ { command: '$0 github-release --dry-run', description: '# Only show the plan' },
65
+ ],
37
66
  handler: async (args) => {
38
67
  await assertAllowedBranch(repository, readBranchGuardOptions(args));
39
68
  // No package filtering: a release belongs to the repository, not to a package, so there is
40
69
  // nothing for --scope/--ignore to narrow down.
41
- const plan = await GithubReleaseService.getPlan(repository, {
70
+ const plan = await app.getService('githubRelease').getPlan({
42
71
  ignoreDirty: args.ignoreDirty,
43
72
  repository: args.repository,
44
73
  });
@@ -93,7 +122,7 @@ export function initCli(repository, program) {
93
122
  }
94
123
  if (!proceed)
95
124
  return;
96
- const applied = await GithubReleaseService.applyPlan(repository, plan);
125
+ const applied = await app.getService('githubRelease').applyPlan(plan);
97
126
  const failed = applied.find(e => e.status === 'error');
98
127
  if (failed) {
99
128
  console.log(colors.red('failed'), colors.cyan(failed.tag ?? ''), colors.red(failed.reason ?? ''));
@@ -106,8 +135,9 @@ export function initCli(repository, program) {
106
135
  console.log(colors.green('released'), colors.cyan(e.tag ?? ''));
107
136
  }
108
137
  },
109
- });
110
- }
138
+ };
139
+ });
140
+ export default githubReleaseCommand;
111
141
  async function confirm(question) {
112
142
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
113
143
  try {
@@ -1,3 +1,36 @@
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
+ declare const COMMAND: "import <path>";
3
+ declare const config: {
4
+ dest: {
5
+ target: "cli";
6
+ describe: string;
7
+ type: "string";
8
+ };
9
+ };
10
+ type Args = RmanConfig.ArgsOf<typeof config, typeof COMMAND>;
11
+ declare const importCommand: (app: import("../index.js").RmanApplication) => {
12
+ command: "import <path>";
13
+ describe: string;
14
+ config: {
15
+ dest: {
16
+ target: "cli";
17
+ describe: string;
18
+ type: "string";
19
+ };
20
+ };
21
+ positionals: {
22
+ path: {
23
+ describe: string;
24
+ type: "string";
25
+ };
26
+ };
27
+ examples: ({
28
+ command: string;
29
+ description?: undefined;
30
+ } | {
31
+ command: string;
32
+ description: string;
33
+ })[];
34
+ handler: (args: Args) => Promise<void>;
35
+ };
36
+ export default importCommand;
@@ -1,27 +1,35 @@
1
1
  import path from 'node:path';
2
2
  import colors from 'ansi-colors';
3
- import { ImportService } from '../services/import.service.js';
4
- export function initCli(repository, program) {
5
- program.command({
6
- command: 'import <path>',
3
+ import { registerCommand } from '../interfaces/rman-config.interface.js';
4
+ const COMMAND = 'import <path>';
5
+ const config = {
6
+ dest: {
7
+ target: 'cli',
8
+ describe: 'Subdirectory the new package is placed under (default: "packages")',
9
+ type: 'string',
10
+ },
11
+ };
12
+ const importCommand = registerCommand(app => {
13
+ const repository = app.repository;
14
+ return {
15
+ command: COMMAND,
7
16
  describe: 'Imports an external git repository as a new package, preserving its full commit history',
8
- builder: cmd => cmd
9
- .example('$0 import ../my-old-repo', '')
10
- .example('$0 import ../my-old-repo --dest libs', '# Under libs/ instead of packages/')
11
- .positional('path', {
12
- describe: 'Path to a local clone of the repository to import (not a URL - clone it first)',
13
- type: 'string',
14
- })
15
- .option('dest', {
16
- describe: 'Subdirectory the new package is placed under (default: "packages")',
17
- type: 'string',
18
- }),
17
+ config,
18
+ positionals: {
19
+ path: {
20
+ describe: 'Path to a local clone of the repository to import (not a URL - clone it first)',
21
+ type: 'string',
22
+ },
23
+ },
24
+ examples: [
25
+ { command: '$0 import ../my-old-repo' },
26
+ { command: '$0 import ../my-old-repo --dest libs', description: '# Under libs/ instead of packages/' },
27
+ ],
19
28
  handler: async (args) => {
20
- const result = await ImportService.importRepo(repository, args.path, {
21
- dest: args.dest,
22
- });
29
+ const result = await app.getService('import').importRepo(args.path, { dest: args.dest });
23
30
  console.log(colors.green('imported'), colors.cyan(result.name), '->', path.relative(repository.dirname, result.targetDir), colors.gray(`(${result.commitCount} commit(s))`));
24
31
  console.log(colors.gray('Add it to your workspaces glob if it is not already covered, then reinstall ("ci").'));
25
32
  },
26
- });
27
- }
33
+ };
34
+ });
35
+ export default importCommand;
@@ -1,12 +1,40 @@
1
- import type { Argv } from 'yargs';
2
- import type { Repository } from '../core/repository.js';
1
+ import { type RmanConfig } from '../interfaces/rman-config.interface.js';
2
+ declare const COMMAND: "info";
3
+ declare const config: {
4
+ json: {
5
+ target: "cli";
6
+ alias: string;
7
+ describe: string;
8
+ type: "boolean";
9
+ };
10
+ };
11
+ type Args = RmanConfig.ArgsOf<typeof config, typeof COMMAND>;
12
+ /** Reports; declares no config key of its own. */
13
+ declare const infoCommand: (app: import("../index.js").RmanApplication) => {
14
+ command: "info";
15
+ describe: string;
16
+ config: {
17
+ json: {
18
+ target: "cli";
19
+ alias: string;
20
+ describe: string;
21
+ type: "boolean";
22
+ };
23
+ };
24
+ examples: {
25
+ command: string;
26
+ description: string;
27
+ }[];
28
+ handler: (args: Args) => Promise<void>;
29
+ };
30
+ export default infoCommand;
3
31
  /**
4
32
  * `rman info` - environment and repository, and back in the core because most of what it reports
5
33
  * (OS, CPU, shell, git, the repository's own shape) is true of any repository.
6
34
  *
7
- * The Node half is not here at all: installing `rman-node` augments `SystemInfo` and the package
8
- * manager, `npmPackages` and this plugin's own version start appearing. Without it nothing
9
- * npm-shaped is asked for or printed, which is the right answer for a repository in any other
10
- * language.
35
+ * The Node half is not written here: registering the `node` built-in augments `SystemInfo` in
36
+ * place, and the package manager and `npmPackages` start appearing. A repository that never names
37
+ * it - or that detection reads as something else - asks for and prints nothing npm-shaped, which is
38
+ * the right answer in any other language. **Bundled is not the same as on**: the built-in ships
39
+ * inside rman, and this is one of the places that difference is visible.
11
40
  */
12
- export declare function initCli(repository: Repository, program: Argv): void;
@@ -1,6 +1,37 @@
1
1
  import colors from 'ansi-colors';
2
2
  import semver from 'semver';
3
+ import { registerCommand } from '../interfaces/rman-config.interface.js';
3
4
  import { SystemInfo } from '../services/system-info.js';
5
+ const COMMAND = 'info';
6
+ const config = {
7
+ json: { target: 'cli', alias: 'j', describe: 'Print output as JSON', type: 'boolean' },
8
+ };
9
+ /** Reports; declares no config key of its own. */
10
+ const infoCommand = registerCommand(app => {
11
+ const repository = app.repository;
12
+ return {
13
+ command: COMMAND,
14
+ describe: 'Prints local environment and repository information',
15
+ config,
16
+ examples: [
17
+ { command: '$0 info', description: '# Prints information' },
18
+ { command: '$0 info --json', description: '# Prints information in JSON format' },
19
+ ],
20
+ handler: async (args) => {
21
+ /** Only the repository - which package manager to report, if any, is a question the core
22
+ * cannot ask. `rman-node`'s augmentation reads `.rmanrc "packageManager"` off this. */
23
+ const systemInfo = await SystemInfo.getSystemInfo({ repository });
24
+ const repositoryInfo = SystemInfo.getRepositoryInfo(repository);
25
+ if (args.json) {
26
+ console.log(JSON.stringify({ ...systemInfo, repository: repositoryInfo }, undefined, 2));
27
+ return;
28
+ }
29
+ printSystemInfo(systemInfo);
30
+ printRepositoryInfo(repositoryInfo);
31
+ },
32
+ };
33
+ });
34
+ export default infoCommand;
4
35
  function printSystemInfo(systemInfo) {
5
36
  const maxName = Object.keys(systemInfo).reduce((l, p) => Object.keys(systemInfo[p]).reduce((i, x) => Math.max(i, x.length), l), 0);
6
37
  for (const [categoryName, category] of Object.entries(systemInfo)) {
@@ -39,34 +70,9 @@ function printRepositoryInfo(info) {
39
70
  * `rman info` - environment and repository, and back in the core because most of what it reports
40
71
  * (OS, CPU, shell, git, the repository's own shape) is true of any repository.
41
72
  *
42
- * The Node half is not here at all: installing `rman-node` augments `SystemInfo` and the package
43
- * manager, `npmPackages` and this plugin's own version start appearing. Without it nothing
44
- * npm-shaped is asked for or printed, which is the right answer for a repository in any other
45
- * language.
73
+ * The Node half is not written here: registering the `node` built-in augments `SystemInfo` in
74
+ * place, and the package manager and `npmPackages` start appearing. A repository that never names
75
+ * it - or that detection reads as something else - asks for and prints nothing npm-shaped, which is
76
+ * the right answer in any other language. **Bundled is not the same as on**: the built-in ships
77
+ * inside rman, and this is one of the places that difference is visible.
46
78
  */
47
- export function initCli(repository, program) {
48
- program.command({
49
- command: 'info',
50
- describe: 'Prints local environment and repository information',
51
- builder: cmd => cmd
52
- .example('$0 info', '# Prints information')
53
- .example('$0 info --json', '# Prints information in JSON format')
54
- .option('json', {
55
- alias: 'j',
56
- describe: 'Print output as JSON',
57
- type: 'boolean',
58
- }),
59
- handler: async (args) => {
60
- /** Only the repository - which package manager to report, if any, is a question the core
61
- * cannot ask. `rman-node`'s augmentation reads `.rmanrc "packageManager"` off this. */
62
- const systemInfo = await SystemInfo.getSystemInfo({ repository });
63
- const repositoryInfo = SystemInfo.getRepositoryInfo(repository);
64
- if (args.json) {
65
- console.log(JSON.stringify({ ...systemInfo, repository: repositoryInfo }, undefined, 2));
66
- return;
67
- }
68
- printSystemInfo(systemInfo);
69
- printRepositoryInfo(repositoryInfo);
70
- },
71
- });
72
- }