cli-forge 0.7.0 → 0.8.1
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.
- package/bin/commands/generate-documentation.d.ts +1 -1
- package/bin/commands/generate-documentation.js +28 -23
- package/bin/commands/generate-documentation.js.map +1 -1
- package/bin/commands/init.d.ts +2 -2
- package/bin/commands/init.js +106 -21
- package/bin/commands/init.js.map +1 -1
- package/package.json +2 -2
- package/src/index.d.ts +2 -0
- package/src/index.js +6 -2
- package/src/index.js.map +1 -1
- package/src/lib/cli-option-groups.d.ts +7 -0
- package/src/lib/cli-option-groups.js +62 -0
- package/src/lib/cli-option-groups.js.map +1 -0
- package/src/lib/composable-builder.d.ts +3 -0
- package/src/lib/composable-builder.js +7 -0
- package/src/lib/composable-builder.js.map +1 -0
- package/src/lib/documentation.d.ts +11 -27
- package/src/lib/documentation.js +20 -1
- package/src/lib/documentation.js.map +1 -1
- package/src/lib/format-help.d.ts +2 -0
- package/src/lib/format-help.js +114 -0
- package/src/lib/format-help.js.map +1 -0
- package/src/lib/interactive-shell.d.ts +1 -1
- package/src/lib/interactive-shell.js +2 -1
- package/src/lib/interactive-shell.js.map +1 -1
- package/src/lib/{cli-forge.d.ts → internal-cli.d.ts} +23 -10
- package/src/lib/{cli-forge.js → internal-cli.js} +18 -159
- package/src/lib/internal-cli.js.map +1 -0
- package/src/lib/public-api.d.ts +7 -17
- package/src/lib/public-api.js +4 -4
- package/src/lib/public-api.js.map +1 -1
- package/src/lib/test-harness.js +2 -2
- package/src/lib/test-harness.js.map +1 -1
- package/src/lib/cli-forge.js.map +0 -1
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateDocumentationCommand = void 0;
|
|
4
4
|
exports.withGenerateDocumentationArgs = withGenerateDocumentationArgs;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
5
6
|
const node_fs_1 = require("node:fs");
|
|
6
7
|
const node_path_1 = require("node:path");
|
|
7
8
|
const posix_1 = require("node:path/posix");
|
|
8
|
-
const
|
|
9
|
+
const node_url_1 = require("node:url");
|
|
10
|
+
const src_1 = tslib_1.__importDefault(require("../../src"));
|
|
9
11
|
const documentation_1 = require("../../src/lib/documentation");
|
|
10
|
-
const cli_forge_1 = require("../../src/lib/cli-forge");
|
|
11
12
|
const fs_1 = require("../utils/fs");
|
|
12
|
-
const
|
|
13
|
+
const internal_cli_1 = require("../../src/lib/internal-cli");
|
|
13
14
|
function withGenerateDocumentationArgs(cmd) {
|
|
14
15
|
return cmd
|
|
15
16
|
.positional('cli', {
|
|
@@ -91,20 +92,22 @@ function formatOption(option, md) {
|
|
|
91
92
|
option.deprecated ? md.bold(md.italics('Deprecated')) : undefined,
|
|
92
93
|
md.bold('Type:') +
|
|
93
94
|
' ' +
|
|
94
|
-
(option.type === 'array'
|
|
95
|
+
('items' in option && option.type === 'array'
|
|
95
96
|
? `${option.items}[]`
|
|
96
97
|
: option.type),
|
|
97
98
|
option.description,
|
|
98
|
-
option.default
|
|
99
|
+
option.default !== undefined
|
|
100
|
+
? renderDefaultValueSection(option.default, md)
|
|
101
|
+
: undefined,
|
|
99
102
|
// No need to show required if it's required and has a default, as its not actually required to pass.
|
|
100
103
|
option.required && !option.default ? md.bold('Required') : undefined,
|
|
101
|
-
option.choices
|
|
104
|
+
'choices' in option && option.choices
|
|
102
105
|
? md.bold('Valid values:') +
|
|
103
106
|
' ' +
|
|
104
107
|
(() => {
|
|
105
108
|
const choicesAsString = (typeof option.choices === 'function'
|
|
106
109
|
? option.choices()
|
|
107
|
-
: option.choices).map((t) => t.toString());
|
|
110
|
+
: option.choices).map((t) => md.code(t.toString()));
|
|
108
111
|
return choicesAsString.join(', ');
|
|
109
112
|
})()
|
|
110
113
|
: undefined,
|
|
@@ -137,14 +140,14 @@ function isTruthy(value) {
|
|
|
137
140
|
}
|
|
138
141
|
async function importMarkdownFactory() {
|
|
139
142
|
try {
|
|
140
|
-
return await
|
|
143
|
+
return await import('markdown-factory');
|
|
141
144
|
}
|
|
142
145
|
catch {
|
|
143
146
|
throw new Error('Could not find markdown-factory. Please install it to generate markdown documentation.');
|
|
144
147
|
}
|
|
145
148
|
}
|
|
146
149
|
function isCLI(obj) {
|
|
147
|
-
if (obj instanceof
|
|
150
|
+
if (obj instanceof internal_cli_1.InternalCLI) {
|
|
148
151
|
return true;
|
|
149
152
|
}
|
|
150
153
|
if (typeof obj !== 'object' || !obj) {
|
|
@@ -156,7 +159,7 @@ function isCLI(obj) {
|
|
|
156
159
|
if (!('name' in obj.constructor)) {
|
|
157
160
|
return false;
|
|
158
161
|
}
|
|
159
|
-
return obj.constructor.name ===
|
|
162
|
+
return obj.constructor.name === internal_cli_1.InternalCLI.name;
|
|
160
163
|
}
|
|
161
164
|
function getExamplesFragment(examples, md) {
|
|
162
165
|
if (examples.length === 0) {
|
|
@@ -191,8 +194,8 @@ function readCLIFromModule(cliModule, args) {
|
|
|
191
194
|
return cli;
|
|
192
195
|
}
|
|
193
196
|
async function loadCLIModule(args) {
|
|
194
|
-
if (
|
|
195
|
-
args.cli = (0, node_path_1.
|
|
197
|
+
if ((0, node_path_1.isAbsolute)(args.cli)) {
|
|
198
|
+
args.cli = (0, node_path_1.relative)(process.cwd(), args.cli);
|
|
196
199
|
}
|
|
197
200
|
const cliPath = [
|
|
198
201
|
args.cli,
|
|
@@ -204,29 +207,22 @@ async function loadCLIModule(args) {
|
|
|
204
207
|
(0, node_path_1.join)(args.cli, 'index.js'),
|
|
205
208
|
(0, node_path_1.join)(args.cli, 'index.cjs'),
|
|
206
209
|
(0, node_path_1.join)(args.cli, 'index.mjs'),
|
|
207
|
-
].find((f) => (0, node_fs_1.existsSync)(f));
|
|
210
|
+
].find((f) => (0, node_fs_1.existsSync)((0, node_path_1.join)(process.cwd(), f)));
|
|
208
211
|
if (!cliPath) {
|
|
209
212
|
throw new Error(`Could not find CLI module at ${args.cli}
|
|
210
213
|
|
|
211
214
|
Ensure that the path is correct and that the CLI module exists.`);
|
|
212
215
|
}
|
|
213
216
|
try {
|
|
214
|
-
const tsx = (await
|
|
215
|
-
// For some reason the typescript language server doesn't like the import statement below.
|
|
216
|
-
// Its accurate, and in fact the full path with `/dist/` would error as its not part of
|
|
217
|
-
// the package.json's `exports` field.
|
|
218
|
-
//
|
|
219
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
220
|
-
//@ts-expect-error
|
|
221
|
-
'tsx/esm/api')));
|
|
217
|
+
const tsx = (await import('tsx/esm/api'));
|
|
222
218
|
return tsx.tsImport(cliPath, {
|
|
223
219
|
tsconfig: args.tsconfig,
|
|
224
|
-
parentURL: (0, node_url_1.pathToFileURL)(
|
|
220
|
+
parentURL: (0, node_url_1.pathToFileURL)((0, node_path_1.join)(process.cwd(), 'fake-file-for-import.ts')).toString(),
|
|
225
221
|
});
|
|
226
222
|
}
|
|
227
223
|
catch {
|
|
228
224
|
try {
|
|
229
|
-
return await
|
|
225
|
+
return await import(cliPath);
|
|
230
226
|
}
|
|
231
227
|
catch (e) {
|
|
232
228
|
if (cliPath.endsWith('.ts')) {
|
|
@@ -242,4 +238,13 @@ function getEpilogueFragment(epilogue, md) {
|
|
|
242
238
|
}
|
|
243
239
|
return md.blockQuote(epilogue);
|
|
244
240
|
}
|
|
241
|
+
function renderDefaultValueSection(defaultValue, md) {
|
|
242
|
+
const json = JSON.stringify(defaultValue, null, 2);
|
|
243
|
+
if (json.split('\n').length > 1) {
|
|
244
|
+
return md.lines(md.bold('Default:'), md.codeBlock(json, 'json'));
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
return md.bold('Default:') + ' ' + md.code(json);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
245
250
|
//# sourceMappingURL=generate-documentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-documentation.js","sourceRoot":"","sources":["../../../../../packages/cli-forge/bin/commands/generate-documentation.ts"],"names":[],"mappings":";;;AAwBA,sEA+BC
|
|
1
|
+
{"version":3,"file":"generate-documentation.js","sourceRoot":"","sources":["../../../../../packages/cli-forge/bin/commands/generate-documentation.ts"],"names":[],"mappings":"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"}
|
package/bin/commands/init.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare function withInitArgs<T extends ParsedArgs>(cmd: CLI<T>): CLI<T &
|
|
|
5
5
|
} & {
|
|
6
6
|
output: string;
|
|
7
7
|
} & {
|
|
8
|
-
format:
|
|
8
|
+
format: "ts" | "js";
|
|
9
9
|
} & {
|
|
10
10
|
initialVersion: string;
|
|
11
11
|
}>;
|
|
@@ -17,7 +17,7 @@ export declare const initCommand: CLI<{
|
|
|
17
17
|
} & {
|
|
18
18
|
output: string;
|
|
19
19
|
} & {
|
|
20
|
-
format:
|
|
20
|
+
format: "ts" | "js";
|
|
21
21
|
} & {
|
|
22
22
|
initialVersion: string;
|
|
23
23
|
}>;
|
package/bin/commands/init.js
CHANGED
|
@@ -2,14 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.initCommand = void 0;
|
|
4
4
|
exports.withInitArgs = withInitArgs;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
5
6
|
const node_child_process_1 = require("node:child_process");
|
|
6
7
|
const node_fs_1 = require("node:fs");
|
|
7
8
|
const node_path_1 = require("node:path");
|
|
8
|
-
const CLI_FORGE_PACKAGE_JSON = require("../../package.json");
|
|
9
|
-
const src_1 = require("../../src");
|
|
9
|
+
const CLI_FORGE_PACKAGE_JSON = tslib_1.__importStar(require("../../package.json"));
|
|
10
|
+
const src_1 = tslib_1.__importDefault(require("../../src"));
|
|
10
11
|
// import { CLI } from '../../src/lib/cli-forge';
|
|
11
12
|
const fs_1 = require("../utils/fs");
|
|
12
13
|
const CLI_FORGE_VERSION = CLI_FORGE_PACKAGE_JSON.version;
|
|
14
|
+
/**
|
|
15
|
+
* These are peer dependencies that **we** will call require/import on,
|
|
16
|
+
* but are not actually required at runtime. These are mostly optional,
|
|
17
|
+
* and used when running `cli-forge` commands rather than the user's CLI.
|
|
18
|
+
*/
|
|
13
19
|
const DEV_PEER_DEPS = Object.entries(CLI_FORGE_PACKAGE_JSON.peerDependencies).reduce((acc, [dep, version]) => {
|
|
14
20
|
if (
|
|
15
21
|
// The dev prop doesn't actually do anything for npm/pnpm/yarn,
|
|
@@ -47,39 +53,66 @@ function withInitArgs(cmd) {
|
|
|
47
53
|
}
|
|
48
54
|
exports.initCommand = (0, src_1.default)('init', {
|
|
49
55
|
description: 'Generate a new CLI',
|
|
50
|
-
examples: [
|
|
51
|
-
'cli-forge init {mycli}',
|
|
52
|
-
'cli-forge init {mycli} --format js',
|
|
53
|
-
'cli-forge init {mycli} --output packages/{mycli}',
|
|
54
|
-
'cli-forge init {mycli} --initial-version 1.0.0',
|
|
55
|
-
],
|
|
56
56
|
builder: (b) => withInitArgs(b),
|
|
57
57
|
handler: async (args) => {
|
|
58
|
-
args.output ??= process.cwd();
|
|
58
|
+
args.output ??= (0, node_path_1.join)(process.cwd(), args.cliName);
|
|
59
59
|
(0, fs_1.ensureDirSync)(args.output);
|
|
60
60
|
const packageJsonPath = (0, node_path_1.join)(args.output, 'package.json');
|
|
61
61
|
const cliPath = (0, node_path_1.join)(args.output, 'bin', `${args.cliName}.${args.format}`);
|
|
62
|
-
|
|
62
|
+
let packageJsonContent = readJsonOr(packageJsonPath, {
|
|
63
63
|
name: args.cliName,
|
|
64
64
|
version: args.initialVersion,
|
|
65
65
|
});
|
|
66
|
-
packageJsonContent
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
packageJsonContent = mergePackageJsonContents(packageJsonContent, {
|
|
67
|
+
name: args.cliName,
|
|
68
|
+
version: args.initialVersion,
|
|
69
|
+
bin: {
|
|
70
|
+
[args.cliName]: (0, node_path_1.relative)(args.output, cliPath),
|
|
71
|
+
},
|
|
72
|
+
dependencies: {
|
|
73
|
+
'cli-forge': CLI_FORGE_VERSION,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
70
76
|
if (args.format === 'ts') {
|
|
71
|
-
const latestTypescriptVersion = (0, node_child_process_1.execSync)('npm show typescript version')
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
const latestTypescriptVersion = (0, node_child_process_1.execSync)('npm show typescript version')
|
|
78
|
+
.toString()
|
|
79
|
+
.trim();
|
|
80
|
+
const latestTsConfigNodeVersion = (0, node_child_process_1.execSync)('npm show @tsconfig/node-lts version')
|
|
81
|
+
.toString()
|
|
82
|
+
.trim();
|
|
83
|
+
packageJsonContent = mergePackageJsonContents(packageJsonContent, {
|
|
84
|
+
scripts: {
|
|
85
|
+
build: 'tsx scripts/build.ts',
|
|
86
|
+
},
|
|
87
|
+
devDependencies: Object.fromEntries(Object.entries({
|
|
88
|
+
typescript: latestTypescriptVersion,
|
|
89
|
+
'@tsconfig/node-lts': latestTsConfigNodeVersion,
|
|
90
|
+
...DEV_PEER_DEPS,
|
|
91
|
+
}).sort(([a], [b]) => a.localeCompare(b))),
|
|
92
|
+
});
|
|
93
|
+
(0, fs_1.ensureDirSync)((0, node_path_1.join)(args.output, 'scripts'));
|
|
94
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(args.output, 'scripts/build.ts'), `import { execSync } from 'node:child_process';
|
|
95
|
+
import { cpSync } from 'node:fs';
|
|
96
|
+
|
|
97
|
+
execSync('tsc --build tsconfig.json', { stdio: 'inherit' });
|
|
98
|
+
cpSync('package.json', 'dist/package.json');
|
|
99
|
+
`);
|
|
100
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(args.output, 'tsconfig.json'), JSON.stringify({
|
|
101
|
+
extends: '@tsconfig/node-lts',
|
|
102
|
+
compilerOptions: {
|
|
103
|
+
rootDir: '.',
|
|
104
|
+
outDir: 'dist',
|
|
105
|
+
},
|
|
106
|
+
include: ['src/**/*.ts', 'bin/**/*.ts'],
|
|
107
|
+
exclude: ['**/*.{spec,test}.ts'],
|
|
108
|
+
}, null, 2));
|
|
77
109
|
}
|
|
78
110
|
(0, node_fs_1.writeFileSync)(packageJsonPath, JSON.stringify(packageJsonContent, null, 2));
|
|
79
111
|
(0, fs_1.ensureDirSync)((0, node_path_1.dirname)(cliPath));
|
|
80
112
|
(0, node_fs_1.writeFileSync)(cliPath, args.format === 'ts'
|
|
81
113
|
? TS_CLI_CONTENTS(args.cliName)
|
|
82
114
|
: JS_CLI_CONTENTS(args.cliName));
|
|
115
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(args.output, 'README.md'), README_CONTENTS(args.cliName, args.format));
|
|
83
116
|
const installCommand = (0, node_fs_1.existsSync)((0, node_path_1.join)(args.output, 'yarn.lock'))
|
|
84
117
|
? 'yarn'
|
|
85
118
|
: (0, node_fs_1.existsSync)((0, node_path_1.join)(args.output, 'pnpm-lock.yaml'))
|
|
@@ -87,7 +120,9 @@ exports.initCommand = (0, src_1.default)('init', {
|
|
|
87
120
|
: (0, node_fs_1.existsSync)((0, node_path_1.join)(args.output, 'bun.lockb'))
|
|
88
121
|
? 'bun'
|
|
89
122
|
: 'npm';
|
|
90
|
-
(0, node_child_process_1.execSync)(`${installCommand} install
|
|
123
|
+
(0, node_child_process_1.execSync)(`${installCommand} install`, {
|
|
124
|
+
cwd: args.output,
|
|
125
|
+
});
|
|
91
126
|
},
|
|
92
127
|
});
|
|
93
128
|
const COMMON_CONTENTS = (name) => `const myCLI = cli('${name}')
|
|
@@ -97,6 +132,28 @@ const COMMON_CONTENTS = (name) => `const myCLI = cli('${name}')
|
|
|
97
132
|
console.log('hello', args.name);
|
|
98
133
|
}
|
|
99
134
|
})`;
|
|
135
|
+
const README_CONTENTS = (name, format) => `# ${name}
|
|
136
|
+
|
|
137
|
+
${format === 'ts' ? 'TypeScript' : 'JavaScript'} CLI generated by [cli-forge](https://craigory.dev/cli-forge)
|
|
138
|
+
|
|
139
|
+
## Usage
|
|
140
|
+
|
|
141
|
+
// Fill this in with usage instructions
|
|
142
|
+
|
|
143
|
+
## Development
|
|
144
|
+
|
|
145
|
+
${format === 'ts' ? 'To build the CLI, run `npm run build`' : ''}
|
|
146
|
+
|
|
147
|
+
To run the CLI, use the following command:
|
|
148
|
+
|
|
149
|
+
\`\`\`shell
|
|
150
|
+
${format === 'ts' ? 'npm run build && node ./dist/bin' : 'node ./bin'}/${name} hello world
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
${format === 'ts'
|
|
154
|
+
? `> Hint: you can also use \`npx tsx ./bin/${name} hello world\` to run the CLI without building it first`
|
|
155
|
+
: ''}
|
|
156
|
+
`;
|
|
100
157
|
const JS_CLI_CONTENTS = (name) => `const { cli } = require('cli-forge');
|
|
101
158
|
|
|
102
159
|
${COMMON_CONTENTS(name)}
|
|
@@ -126,4 +183,32 @@ function readJsonOr(filePath, alt) {
|
|
|
126
183
|
return alt;
|
|
127
184
|
}
|
|
128
185
|
}
|
|
186
|
+
function mergePackageJsonContents(original, updates, overwriteExistingValues = false) {
|
|
187
|
+
const first = overwriteExistingValues ? original : updates;
|
|
188
|
+
const second = overwriteExistingValues ? updates : original;
|
|
189
|
+
const merged = {
|
|
190
|
+
name: original.name ?? updates.name,
|
|
191
|
+
...first,
|
|
192
|
+
...second,
|
|
193
|
+
};
|
|
194
|
+
if (first.bin && second.bin) {
|
|
195
|
+
merged.bin = {
|
|
196
|
+
...first.bin,
|
|
197
|
+
...second.bin,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if (first.dependencies && second.dependencies) {
|
|
201
|
+
merged.dependencies = {
|
|
202
|
+
...first.dependencies,
|
|
203
|
+
...second.dependencies,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (first.devDependencies && second.devDependencies) {
|
|
207
|
+
merged.devDependencies = {
|
|
208
|
+
...first.devDependencies,
|
|
209
|
+
...second.devDependencies,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return merged;
|
|
213
|
+
}
|
|
129
214
|
//# sourceMappingURL=init.js.map
|
package/bin/commands/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../packages/cli-forge/bin/commands/init.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../packages/cli-forge/bin/commands/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = exports.TestHarness = void 0;
|
|
3
|
+
exports.makeComposableBuilder = exports.chain = exports.default = exports.TestHarness = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
var test_harness_1 = require("./lib/test-harness");
|
|
6
6
|
Object.defineProperty(exports, "TestHarness", { enumerable: true, get: function () { return test_harness_1.TestHarness; } });
|
|
7
7
|
tslib_1.__exportStar(require("./lib/public-api"), exports);
|
|
8
8
|
var public_api_1 = require("./lib/public-api");
|
|
9
|
-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return public_api_1.default; } });
|
|
9
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(public_api_1).default; } });
|
|
10
|
+
var parser_1 = require("@cli-forge/parser");
|
|
11
|
+
Object.defineProperty(exports, "chain", { enumerable: true, get: function () { return parser_1.chain; } });
|
|
12
|
+
var composable_builder_1 = require("./lib/composable-builder");
|
|
13
|
+
Object.defineProperty(exports, "makeComposableBuilder", { enumerable: true, get: function () { return composable_builder_1.makeComposableBuilder; } });
|
|
10
14
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/cli-forge/src/index.ts"],"names":[],"mappings":";;;;AAAA,mDAAiD;AAAxC,2GAAA,WAAW,OAAA;AACpB,2DAAiC;AACjC,+CAA2C;AAAlC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/cli-forge/src/index.ts"],"names":[],"mappings":";;;;AAAA,mDAAiD;AAAxC,2GAAA,WAAW,OAAA;AACpB,2DAAiC;AACjC,+CAA2C;AAAlC,8HAAA,OAAO,OAAA;AAChB,4CAA0C;AAAjC,+FAAA,KAAK,OAAA;AACd,+DAAiE;AAAxD,2HAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InternalOptionConfig } from '@cli-forge/parser';
|
|
2
|
+
import { InternalCLI } from './internal-cli';
|
|
3
|
+
export declare function readOptionGroupsForCLI(parentCLI: InternalCLI<any>): {
|
|
4
|
+
label: string;
|
|
5
|
+
sortOrder: number;
|
|
6
|
+
keys: Array<InternalOptionConfig>;
|
|
7
|
+
}[];
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readOptionGroupsForCLI = readOptionGroupsForCLI;
|
|
4
|
+
function readOptionGroupsForCLI(parentCLI) {
|
|
5
|
+
function registerGroupsFromCLI(cli) {
|
|
6
|
+
for (const { label, keys, sortOrder } of cli.registeredOptionGroups) {
|
|
7
|
+
groups[label] ??= {
|
|
8
|
+
keys: new Set(),
|
|
9
|
+
sortOrder: Number.MAX_SAFE_INTEGER,
|
|
10
|
+
};
|
|
11
|
+
if (sortOrder) {
|
|
12
|
+
groups[label].sortOrder = sortOrder;
|
|
13
|
+
}
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
groups[label].keys.add(key);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const groups = {};
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
21
|
+
let command = parentCLI;
|
|
22
|
+
registerGroupsFromCLI(command);
|
|
23
|
+
for (const subcommand of parentCLI.commandChain) {
|
|
24
|
+
command = command?.registeredCommands[subcommand];
|
|
25
|
+
registerGroupsFromCLI(command);
|
|
26
|
+
}
|
|
27
|
+
const parserOptions = parentCLI.parser.configuredOptions;
|
|
28
|
+
for (const key in parserOptions) {
|
|
29
|
+
const option = parserOptions[key];
|
|
30
|
+
if (option.group) {
|
|
31
|
+
groups[option.group] ??= {
|
|
32
|
+
keys: new Set(),
|
|
33
|
+
sortOrder: Number.MAX_SAFE_INTEGER,
|
|
34
|
+
};
|
|
35
|
+
groups[option.group].keys.add(key);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const groupedOptions = [];
|
|
39
|
+
for (const label in groups) {
|
|
40
|
+
const entry = {
|
|
41
|
+
sortOrder: groups[label].sortOrder,
|
|
42
|
+
keys: [],
|
|
43
|
+
label,
|
|
44
|
+
};
|
|
45
|
+
for (const key of groups[label].keys) {
|
|
46
|
+
const option = parserOptions[key];
|
|
47
|
+
entry.keys.push(option);
|
|
48
|
+
delete parserOptions[key];
|
|
49
|
+
}
|
|
50
|
+
groupedOptions.push(entry);
|
|
51
|
+
}
|
|
52
|
+
groupedOptions.sort((a, b) => {
|
|
53
|
+
if (a.sortOrder === b.sortOrder) {
|
|
54
|
+
return a.label.localeCompare(b.label);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return a.sortOrder - b.sortOrder;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return groupedOptions;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=cli-option-groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-option-groups.js","sourceRoot":"","sources":["../../../../../packages/cli-forge/src/lib/cli-option-groups.ts"],"names":[],"mappings":";;AAGA,wDAiEC;AAjED,SAAgB,sBAAsB,CAAC,SAA2B;IAChE,SAAS,qBAAqB,CAAC,GAAgB;QAC7C,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,KAAK;gBAChB,IAAI,EAAE,IAAI,GAAG,EAAE;gBACf,SAAS,EAAE,MAAM,CAAC,gBAAgB;aACnC,CAAC;YACF,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC;YACtC,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAA6D,EAAE,CAAC;IAC5E,4DAA4D;IAC5D,IAAI,OAAO,GAAqB,SAAS,CAAC;IAC1C,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,GAAG,OAAO,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAClD,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,aAAa,GACjB,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;gBACvB,IAAI,EAAE,IAAI,GAAG,EAAE;gBACf,SAAS,EAAE,MAAM,CAAC,gBAAgB;aACnC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAIf,EAAE,CAAC;IAER,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS;YAClC,IAAI,EAAE,EAA4B;YAClC,KAAK;SACN,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composable-builder.js","sourceRoot":"","sources":["../../../../../packages/cli-forge/src/lib/composable-builder.ts"],"names":[],"mappings":";;AAGA,sDAKC;AALD,SAAgB,qBAAqB,CACnC,EAAsC;IAEtC,OAAO,CAA2B,IAAgB,EAAE,EAAE,CACpD,EAAE,CAAC,IAAI,CAAoB,CAAC;AAChC,CAAC"}
|
|
@@ -1,39 +1,23 @@
|
|
|
1
|
-
import { OptionConfig } from '@cli-forge/parser';
|
|
2
|
-
import { InternalCLI } from './cli
|
|
1
|
+
import { OptionConfig, OptionConfigToType } from '@cli-forge/parser';
|
|
2
|
+
import { InternalCLI } from './internal-cli';
|
|
3
3
|
export type Documentation = {
|
|
4
4
|
name: string;
|
|
5
5
|
description?: string;
|
|
6
6
|
epilogue?: string;
|
|
7
7
|
usage: string;
|
|
8
8
|
examples: string[];
|
|
9
|
-
options: Readonly<Record<string,
|
|
10
|
-
|
|
11
|
-
}>>;
|
|
12
|
-
positionals: readonly Readonly<OptionConfig & {
|
|
13
|
-
key: string;
|
|
14
|
-
}>[];
|
|
9
|
+
options: Readonly<Record<string, NormalizedOptionConfig>>;
|
|
10
|
+
positionals: readonly Readonly<NormalizedOptionConfig>[];
|
|
15
11
|
groupedOptions: Array<{
|
|
16
12
|
label: string;
|
|
17
|
-
keys: Array<
|
|
18
|
-
key: string;
|
|
19
|
-
}>;
|
|
13
|
+
keys: Array<NormalizedOptionConfig>;
|
|
20
14
|
}>;
|
|
21
15
|
subcommands: Documentation[];
|
|
22
16
|
};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
usage: string;
|
|
27
|
-
epilogue: string | undefined;
|
|
28
|
-
examples: string[];
|
|
29
|
-
groupedOptions: {
|
|
30
|
-
label: string;
|
|
31
|
-
sortOrder: number;
|
|
32
|
-
keys: Array<import("@cli-forge/parser").InternalOptionConfig>;
|
|
33
|
-
}[];
|
|
34
|
-
options: Record<string, OptionConfig & {
|
|
35
|
-
key: string;
|
|
36
|
-
}>;
|
|
37
|
-
positionals: readonly Readonly<import("@cli-forge/parser").InternalOptionConfig>[];
|
|
38
|
-
subcommands: Documentation[];
|
|
17
|
+
declare function normalizeOptionConfigForDocumentation<T extends OptionConfig>(option: T, key: string): Omit<T, "default"> & {
|
|
18
|
+
key: string;
|
|
19
|
+
default?: OptionConfigToType<T> | string | undefined;
|
|
39
20
|
};
|
|
21
|
+
type NormalizedOptionConfig<T extends OptionConfig = OptionConfig> = ReturnType<typeof normalizeOptionConfigForDocumentation<T>>;
|
|
22
|
+
export declare function generateDocumentation(cli: InternalCLI, commandChain?: string[]): Documentation;
|
|
23
|
+
export {};
|
package/src/lib/documentation.js
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateDocumentation = generateDocumentation;
|
|
4
|
+
const parser_1 = require("@cli-forge/parser");
|
|
5
|
+
function normalizeOptionConfigForDocumentation(option, key) {
|
|
6
|
+
const { default: declaredDefault, ...rest } = option;
|
|
7
|
+
let resolvedDefault;
|
|
8
|
+
if (declaredDefault !== undefined) {
|
|
9
|
+
const [defaultValue, description] = (0, parser_1.readDefaultValue)(option);
|
|
10
|
+
resolvedDefault = description ?? defaultValue;
|
|
11
|
+
}
|
|
12
|
+
const result = { ...rest, key };
|
|
13
|
+
if (resolvedDefault !== undefined) {
|
|
14
|
+
result.default = resolvedDefault;
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
4
18
|
function generateDocumentation(cli, commandChain = []) {
|
|
5
19
|
// Ensure current command's options are built.
|
|
6
20
|
if (cli.configuration?.builder) {
|
|
21
|
+
// The cli instance here is typed a bit too well
|
|
22
|
+
// for the builder function, so we need to cast it to
|
|
23
|
+
// a more generic form.
|
|
7
24
|
cli.configuration.builder(cli);
|
|
8
25
|
}
|
|
9
26
|
const parser = cli.getParser();
|
|
10
27
|
const groupedOptions = cli.getGroupedOptions();
|
|
11
|
-
const options = Object.fromEntries(Object.entries(parser.configuredOptions)
|
|
28
|
+
const options = Object.fromEntries(Object.entries(parser.configuredOptions)
|
|
29
|
+
.filter(([, c]) => !c.hidden)
|
|
30
|
+
.map(([k, v]) => [k, normalizeOptionConfigForDocumentation(v, k)]));
|
|
12
31
|
const positionals = parser.configuredPositionals;
|
|
13
32
|
for (const positional of positionals) {
|
|
14
33
|
delete options[positional.key];
|