From 0e4e769812ad1156a93e04f0249f433ebdad0862 Mon Sep 17 00:00:00 2001 From: sohanemon Date: Fri, 24 Jul 2026 17:35:50 +0600 Subject: [PATCH 1/2] fix(cli): update commander-codegen to 0.0.3 refactor(cli): simplify option handling - extract values to separate object - merge values with answers --- bun.lockb | Bin 93000 -> 93000 bytes package.json | 2 +- src/lib/generated/cli.gen.ts | 110 +++++++++++++++++++++-------------- src/lib/utils/example.ts | 64 ++++++++++---------- tsdown.config.ts | 1 + 5 files changed, 100 insertions(+), 77 deletions(-) diff --git a/bun.lockb b/bun.lockb index 9bbe0b81f34639bb2438b706859bbce2d8f68cd9..c56c991539e64938dbb93e943e0112adcccddc06 100755 GIT binary patch delta 147 zcmV;E0Brxr)&+zXv3VsD9@x6d<$hrLar^GqaxZKXaD@H31-(up$8mw*+PZLU@WO$ExC}Nkm?sZGg}U1_^S)JZ_1T wy-jB`!qJduWZQu<=Juee^$0>l_4~8!rLar^F|(fXKXaEMC;=h2{$&A51;#2wKL7v# diff --git a/package.json b/package.json index 48de7f6..c9ad689 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "prebuild": "bun run generate:cli" }, "devDependencies": { - "commander-codegen": "^0.0.1", + "commander-codegen": "^0.0.3", "@biomejs/biome": "2.5.5", "@types/bun": "latest", "@types/inquirer": "^9.0.10", diff --git a/src/lib/generated/cli.gen.ts b/src/lib/generated/cli.gen.ts index cdd61b8..b355121 100644 --- a/src/lib/generated/cli.gen.ts +++ b/src/lib/generated/cli.gen.ts @@ -11,11 +11,12 @@ export function registerCommands(program: Command): void { .option('--name ', "name (string)") .option('--shout', "lets shout out") .action(async (opts) => { + const values = { name: opts.name, shout: opts.shout }; const missingQuestions = [ { type: 'input', name: 'name', message: "name (string)" } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { name: opts.name, shout: opts.shout, ...answers }; + const resolved = { ...values, ...answers }; const result = greet(resolved.name, resolved.shout); if (result !== undefined) console.log(result); }); @@ -25,11 +26,12 @@ export function registerCommands(program: Command): void { .description("Custom-named command") .option('--name ', "name (string)") .action(async (opts) => { + const values = { name: opts.name }; const missingQuestions = [ { type: 'input', name: 'name', message: "name (string)" } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { name: opts.name, ...answers }; + const resolved = { ...values, ...answers }; const result = sayHiInternal(resolved.name); if (result !== undefined) console.log(result); }); @@ -40,12 +42,13 @@ export function registerCommands(program: Command): void { .option('--a ', "first number") .option('--b ', "second number") .action(async (opts) => { + const values = { a: opts.a, b: opts.b }; const missingQuestions = [ { type: 'input', name: 'a', message: "first number", filter: (v) => Number(v) }, { type: 'input', name: 'b', message: "second number", filter: (v) => Number(v) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { a: opts.a, b: opts.b, ...answers }; + const resolved = { ...values, ...answers }; const result = add(resolved.a, resolved.b); if (result !== undefined) console.log(result); }); @@ -56,11 +59,12 @@ export function registerCommands(program: Command): void { .option('--value ', "the input value") .option('--factor ', "multiplier", 2) .action(async (opts) => { + const values = { value: opts.value, factor: opts.factor }; const missingQuestions = [ { type: 'input', name: 'value', message: "the input value", filter: (v) => Number(v) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { value: opts.value, factor: opts.factor, ...answers }; + const resolved = { ...values, ...answers }; const result = scale(resolved.value, resolved.factor); if (result !== undefined) console.log(result); }); @@ -70,11 +74,12 @@ export function registerCommands(program: Command): void { .description("Join a list of words") .option('--words ', "words to join", []) .action(async (opts) => { + const values = { words: opts.words }; const missingQuestions = [ { type: 'input', name: 'words', message: "words to join" + ' (comma-separated)', filter: (v) => v.split(',').map((s) => s.trim()) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { words: opts.words, ...answers }; + const resolved = { ...values, ...answers }; const result = joinWords(resolved.words); if (result !== undefined) console.log(result); }); @@ -94,11 +99,12 @@ export function registerCommands(program: Command): void { .description("Sum a list of numbers") .option('--values ', "numbers to sum", []) .action(async (opts) => { + const values = { values: opts.values }; const missingQuestions = [ { type: 'input', name: 'values', message: "numbers to sum" + ' (comma-separated)', filter: (v) => v.split(',').map((s) => s.trim()).map(Number) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { values: opts.values, ...answers }; + const resolved = { ...values, ...answers }; const result = sumAll(resolved.values); if (result !== undefined) console.log(result); }); @@ -108,11 +114,12 @@ export function registerCommands(program: Command): void { .description("Set log level") .addOption(new Option('--level ', "the log level").choices(["debug","info","error"])) .action(async (opts) => { + const values = { level: opts.level }; const missingQuestions = [ { type: 'select', name: 'level', message: "the log level", choices: ["debug","info","error"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { level: opts.level, ...answers }; + const resolved = { ...values, ...answers }; const result = setLevel(resolved.level); if (result !== undefined) console.log(result); }); @@ -123,11 +130,12 @@ export function registerCommands(program: Command): void { .option('--text ', "text (string)") .addOption(new Option('--format ', "output format").choices(["json","text"]).default('text')) .action(async (opts) => { + const values = { text: opts.text, format: opts.format }; const missingQuestions = [ { type: 'input', name: 'text', message: "text (string)" } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { text: opts.text, format: opts.format, ...answers }; + const resolved = { ...values, ...answers }; const result = formatOutput(resolved.text, resolved.format); if (result !== undefined) console.log(result); }); @@ -138,11 +146,12 @@ export function registerCommands(program: Command): void { .option('--name ', "name (string)") .option('--active', "active (boolean)") .action(async (opts) => { + const values = { name: opts.name, active: opts.active }; const missingQuestions = [ { type: 'input', name: 'name', message: "name (string)" } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { name: opts.name, active: opts.active, ...answers }; + const resolved = { ...values, ...answers }; const result = undocumented(resolved.name, resolved.active); if (result !== undefined) console.log(result); }); @@ -153,12 +162,13 @@ export function registerCommands(program: Command): void { .option('--user-name ', "the user's name") .option('--user-age ', "the user's age") .action(async (opts) => { + const values = { userName: opts.userName, userAge: opts.userAge }; const missingQuestions = [ { type: 'input', name: 'userName', message: "the user's name" }, { type: 'input', name: 'userAge', message: "the user's age", filter: (v) => Number(v) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { userName: opts.userName, userAge: opts.userAge, ...answers }; + const resolved = { ...values, ...answers }; const result = createUser({ name: resolved.userName, age: resolved.userAge }); if (result !== undefined) console.log(result); }); @@ -169,12 +179,13 @@ export function registerCommands(program: Command): void { .option('--config-retries ', "retry count") .option('--config-nested-deep-flag', "flag (boolean)") .action(async (opts) => { + const values = { configRetries: opts.configRetries, configNestedDeepFlag: opts.configNestedDeepFlag }; const missingQuestions = [ { type: 'input', name: 'configRetries', message: "retry count", filter: (v) => Number(v) }, { type: 'confirm', name: 'configNestedDeepFlag', message: "flag (boolean)", default: false } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { configRetries: opts.configRetries, configNestedDeepFlag: opts.configNestedDeepFlag, ...answers }; + const resolved = { ...values, ...answers }; const result = configure({ retries: resolved.configRetries, nested: { deep: { flag: resolved.configNestedDeepFlag } } }); if (result !== undefined) console.log(result); }); @@ -195,11 +206,12 @@ export function registerCommands(program: Command): void { .description("Fetch something asynchronously") .option('--id ', "the resource id") .action(async (opts) => { + const values = { id: opts.id }; const missingQuestions = [ { type: 'input', name: 'id', message: "the resource id" } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { id: opts.id, ...answers }; + const resolved = { ...values, ...answers }; const result = await fetchResource(resolved.id); if (result !== undefined) console.log(result); }); @@ -211,11 +223,12 @@ export function registerCommands(program: Command): void { .option('--loud', "loud (boolean)") .addHelpText('after', "\nExamples:\n $ greet-multi Alice --loud\n $ greet-multi Bob") .action(async (opts) => { + const values = { name: opts.name, loud: opts.loud }; const missingQuestions = [ { type: 'input', name: 'name', message: "target name" } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { name: opts.name, loud: opts.loud, ...answers }; + const resolved = { ...values, ...answers }; const result = greetMulti(resolved.name, resolved.loud); if (result !== undefined) console.log(result); }); @@ -237,12 +250,13 @@ export function registerCommands(program: Command): void { .addOption(new Option('--env ', "target environment").choices(["staging","prod"])) .option('--dryRun', "preview only, don't apply") .action(async (opts) => { + const values = { service: opts.service, env: opts.env, dryRun: opts.dryRun }; const missingQuestions = [ { type: 'input', name: 'service', message: "service name" }, { type: 'select', name: 'env', message: "target environment", choices: ["staging","prod"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { service: opts.service, env: opts.env, dryRun: opts.dryRun, ...answers }; + const resolved = { ...values, ...answers }; const result = deploy(resolved.service, resolved.env, resolved.dryRun); if (result !== undefined) console.log(result); }); @@ -252,11 +266,12 @@ export function registerCommands(program: Command): void { .description("Enable feature tags") .addOption(new Option('--tags ', "feature tags to enable").choices(["api","db","cache"])) .action(async (opts) => { + const values = { tags: opts.tags }; const missingQuestions = [ { type: 'checkbox', name: 'tags', message: "feature tags to enable", choices: ["api","db","cache"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { tags: opts.tags, ...answers }; + const resolved = { ...values, ...answers }; const result = enableTags(resolved.tags); if (result !== undefined) console.log(result); }); @@ -268,12 +283,13 @@ export function registerCommands(program: Command): void { .addOption(new Option('--mode ', "build mode").choices(["prod","dev"])) .option('--verbose', "print extra output", false) .action(async (opts) => { + const values = { name: opts.name, mode: opts.mode, verbose: opts.verbose }; const missingQuestions = [ { type: 'input', name: 'name', message: "build target name" }, { type: 'select', name: 'mode', message: "build mode", choices: ["prod","dev"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { name: opts.name, mode: opts.mode, verbose: opts.verbose, ...answers }; + const resolved = { ...values, ...answers }; const result = build(resolved.name, resolved.mode, resolved.verbose); if (result !== undefined) console.log(result); }); @@ -284,12 +300,13 @@ export function registerCommands(program: Command): void { .option('--count ', "how many to allocate") .addOption(new Option('--regions ', "regions to allocate in").choices(["us","eu","apac"])) .action(async (opts) => { + const values = { count: opts.count, regions: opts.regions }; const missingQuestions = [ { type: 'input', name: 'count', message: "how many to allocate", filter: (v) => Number(v) }, { type: 'checkbox', name: 'regions', message: "regions to allocate in", choices: ["us","eu","apac"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { count: opts.count, regions: opts.regions, ...answers }; + const resolved = { ...values, ...answers }; const result = allocate(resolved.count, resolved.regions); if (result !== undefined) console.log(result); }); @@ -310,11 +327,12 @@ export function registerCommands(program: Command): void { .description("Process a list of file paths") .option('--files ', "files to process", []) .action(async (opts) => { + const values = { files: opts.files }; const missingQuestions = [ { type: 'input', name: 'files', message: "files to process" + ' (comma-separated)', filter: (v) => v.split(',').map((s) => s.trim()) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { files: opts.files, ...answers }; + const resolved = { ...values, ...answers }; const result = processFiles(resolved.files); if (result !== undefined) console.log(result); }); @@ -325,12 +343,13 @@ export function registerCommands(program: Command): void { .option('--config-name ', "service name") .addOption(new Option('--config-mode ', "service mode").choices(["active","standby"])) .action(async (opts) => { + const values = { configName: opts.configName, configMode: opts.configMode }; const missingQuestions = [ { type: 'input', name: 'configName', message: "service name" }, { type: 'select', name: 'configMode', message: "service mode", choices: ["active","standby"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { configName: opts.configName, configMode: opts.configMode, ...answers }; + const resolved = { ...values, ...answers }; const result = configureService({ name: resolved.configName, mode: resolved.configMode }); if (result !== undefined) console.log(result); }); @@ -340,11 +359,12 @@ export function registerCommands(program: Command): void { .description("Deploy asynchronously") .addOption(new Option('--env ', "target environment").choices(["staging","prod"])) .action(async (opts) => { + const values = { env: opts.env }; const missingQuestions = [ { type: 'select', name: 'env', message: "target environment", choices: ["staging","prod"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { env: opts.env, ...answers }; + const resolved = { ...values, ...answers }; const result = await deployAsync(resolved.env); if (result !== undefined) console.log(result); }); @@ -354,11 +374,12 @@ export function registerCommands(program: Command): void { .description("Toggle a binary state") .addOption(new Option('--state ', "the state to set").choices(["on","off"])) .action(async (opts) => { + const values = { state: opts.state }; const missingQuestions = [ { type: 'select', name: 'state', message: "the state to set", choices: ["on","off"] } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { state: opts.state, ...answers }; + const resolved = { ...values, ...answers }; const result = setState(resolved.state); if (result !== undefined) console.log(result); }); @@ -368,11 +389,12 @@ export function registerCommands(program: Command): void { .description("Sum specific values") .option('--values ', "numbers to sum", []) .action(async (opts) => { + const values = { values: opts.values }; const missingQuestions = [ { type: 'input', name: 'values', message: "numbers to sum" + ' (comma-separated)', filter: (v) => v.split(',').map((s) => s.trim()).map(Number) } - ].filter((q) => (opts as Record)[q.name] === undefined); + ].filter((q) => (values as Record)[q.name] === undefined); const answers = missingQuestions.length > 0 ? await inquirer.prompt(missingQuestions) : {}; - const resolved = { values: opts.values, ...answers }; + const resolved = { ...values, ...answers }; const result = sumSpecific(resolved.values); if (result !== undefined) console.log(result); }); diff --git a/src/lib/utils/example.ts b/src/lib/utils/example.ts index 5e34130..8411797 100644 --- a/src/lib/utils/example.ts +++ b/src/lib/utils/example.ts @@ -2,7 +2,7 @@ /** * @alias g * @description Greet someone by name - * @param shout lets shout out + * @option shout lets shout out * @interactive */ export function greet(name: string, shout?: boolean) { @@ -22,8 +22,8 @@ export function sayHiInternal(name: string) { // 3. Required number /** * @description Add two numbers - * @param a first number - * @param b second number + * @option a first number + * @option b second number */ export function add(a: number, b: number) { return a + b; @@ -32,8 +32,8 @@ export function add(a: number, b: number) { // 4. Optional number with default value /** * @description Multiply with a configurable factor - * @param value the input value - * @param factor multiplier + * @option value the input value + * @option factor multiplier */ export function scale(value: number, factor: number = 2) { return value * factor; @@ -42,7 +42,7 @@ export function scale(value: number, factor: number = 2) { // 5. Required string array (variadic positional) /** * @description Join a list of words - * @param words words to join + * @option words words to join */ export function joinWords(words: string[]) { return words.join(' '); @@ -51,7 +51,7 @@ export function joinWords(words: string[]) { // 6. Optional string array (repeatable flag) /** * @description Print optional tags - * @param tags optional tags to include + * @option tags optional tags to include */ export function printTags(tags?: string[]) { return tags?.join(',') ?? ''; @@ -60,7 +60,7 @@ export function printTags(tags?: string[]) { // 7. Required number array /** * @description Sum a list of numbers - * @param values numbers to sum + * @option values numbers to sum */ export function sumAll(values: number[]) { return values.reduce((a, b) => a + b, 0); @@ -69,7 +69,7 @@ export function sumAll(values: number[]) { // 8. Required enum (string-literal union) as positional /** * @description Set log level - * @param level the log level + * @option level the log level */ export function setLevel(level: 'debug' | 'info' | 'error') { return `level set to ${level}`; @@ -78,7 +78,7 @@ export function setLevel(level: 'debug' | 'info' | 'error') { // 9. Optional enum with default /** * @description Format output - * @param format output format + * @option format output format */ export function formatOutput(text: string, format: 'json' | 'text' = 'text') { return format === 'json' ? JSON.stringify({ text }) : text; @@ -95,8 +95,8 @@ export function undocumented(name: string, active?: boolean) { // 11. Flat object param (your nested-object feature, one level) /** * @description Create a user - * @param user.name the user's name - * @param user.age the user's age + * @option user.name the user's name + * @option user.age the user's age */ export function createUser(user: { name: string; age: number }) { return `${user.name} (${user.age})`; @@ -105,7 +105,7 @@ export function createUser(user: { name: string; age: number }) { // 12. Deeply nested object param (2+ levels) /** * @description Complex nested config test - * @param config.retries retry count + * @option config.retries retry count */ export function configure(config: { retries: number; @@ -125,7 +125,7 @@ export function applySettings(settings?: { verbose: boolean; level: number }) { // 14. Async function — should generate `async` action + `await` call /** * @description Fetch something asynchronously - * @param id the resource id + * @option id the resource id */ export async function fetchResource(id: string) { return Promise.resolve(`resource-${id}`); @@ -134,7 +134,7 @@ export async function fetchResource(id: string) { // 15. Multiple @example tags — should render in --help via addHelpText /** * @description Command with examples - * @param name target name + * @option name target name * @example greet-multi Alice --loud * @example greet-multi Bob */ @@ -153,9 +153,9 @@ export function ping() { // 17. Mixed required positional + required enum + optional flag, ordering correct /** * @description Deploy to an environment - * @param service service name - * @param env target environment - * @param dryRun preview only, don't apply + * @option service service name + * @option env target environment + * @option dryRun preview only, don't apply */ export function deploy( service: string, @@ -169,7 +169,7 @@ export function deploy( // prompts via inquirer 'checkbox' when --tags isn't passed /** * @description Enable feature tags - * @param tags feature tags to enable + * @option tags feature tags to enable */ export function enableTags(tags: ('api' | 'db' | 'cache')[]) { return tags.join(','); @@ -180,9 +180,9 @@ export function enableTags(tags: ('api' | 'db' | 'cache')[]) { // should NOT prompt since it's optional (has a default). /** * @description Run the build - * @param name build target name - * @param mode build mode - * @param verbose print extra output + * @option name build target name + * @option mode build mode + * @option verbose print extra output */ export function build( name: string, @@ -195,8 +195,8 @@ export function build( // 20. Required number + required enum[] — mixed kind prompting in one command /** * @description Allocate resources - * @param count how many to allocate - * @param regions regions to allocate in + * @option count how many to allocate + * @option regions regions to allocate in */ export function allocate(count: number, regions: ('us' | 'eu' | 'apac')[]) { return `${count} in ${regions.join(',')}`; @@ -206,8 +206,8 @@ export function allocate(count: number, regions: ('us' | 'eu' | 'apac')[]) { // no prompting should ever trigger since nothing is required /** * @description List items with optional filters - * @param search optional search term - * @param limit max results + * @option search optional search term + * @option limit max results */ export function listItems(search?: string, limit: number = 10) { return `${search ?? 'all'}:${limit}`; @@ -217,7 +217,7 @@ export function listItems(search?: string, limit: number = 10) { // comma-separated 'input' prompt, NOT checkbox (only enum[] gets checkbox) /** * @description Process a list of file paths - * @param files files to process + * @option files files to process */ export function processFiles(files: string[]) { return files.length; @@ -227,8 +227,8 @@ export function processFiles(files: string[]) { // detection + prompting still works inside a flattened object path /** * @description Configure a service - * @param config.name service name - * @param config.mode service mode + * @option config.name service name + * @option config.mode service mode */ export function configureService(config: { name: string; @@ -241,7 +241,7 @@ export function configureService(config: { // both work together correctly /** * @description Deploy asynchronously - * @param env target environment + * @option env target environment */ export async function deployAsync(env: 'staging' | 'prod') { return Promise.resolve(`deployed to ${env}`); @@ -251,7 +251,7 @@ export async function deployAsync(env: 'staging' | 'prod') { /** * @name toggle * @description Toggle a binary state - * @param state the state to set + * @option state the state to set */ export function setState(state: 'on' | 'off') { return state; @@ -261,7 +261,7 @@ export function setState(state: 'on' | 'off') { // with .map(Number), not checkbox /** * @description Sum specific values - * @param values numbers to sum + * @option values numbers to sum */ export function sumSpecific(values: number[]) { return values.reduce((a, b) => a + b, 0); diff --git a/tsdown.config.ts b/tsdown.config.ts index c3f723e..982dd8b 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ dts: true, minify: true, treeshake: true, + external: ['bun'], entry: ['./src/cli.ts'], deps: { skipNodeModulesBundle: true }, exports: { From ec3feadfa4d7b19294dfb36c6cf8503aba160d0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Jul 2026 21:43:40 +0000 Subject: [PATCH 2/2] chore(deps): update dependency @ts-utilities/notify to ^0.0.11 --- bun.lockb | Bin 93000 -> 87250 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index c56c991539e64938dbb93e943e0112adcccddc06..1d7fdc8a442d2ebc02a27a1325a7b8e69c7bbe8f 100755 GIT binary patch delta 11812 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 delta 14737 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 diff --git a/package.json b/package.json index c9ad689..91a97dc 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "typescript": "^7.0.2" }, "dependencies": { - "@ts-utilities/notify": "^0.0.3", + "@ts-utilities/notify": "^0.0.11", "commander": "^15.0.0", "inquirer": "^14.0.2" },