[READ-ONLY] Mirror of https://github.com/bombshell-dev/clack. Effortlessly build beautiful command-line apps bomb.sh/docs/clack/basics/getting-started/
cli command-line command-line-app node prompt prompts
5

Configure Feed

Select the types of activity you want to include in your feed.

fix: add missing null checks around values (#386)

authored by

James Garbutt and committed by
GitHub
(Sep 3, 2025, 12:27 PM +0100) 71b50295 3280bc0f

+144 -135
+6
.changeset/kind-yaks-clean.md
··· 1 + --- 2 + "@clack/prompts": patch 3 + "@clack/core": patch 4 + --- 5 + 6 + Add missing nullish checks around values.
+1 -1
.editorconfig
··· 7 7 trim_trailing_whitespace = true 8 8 insert_final_newline = true 9 9 10 - [*.yml] 10 + [*.{yml,json,yaml}] 11 11 indent_style = space 12 12 indent_size = 2
+1 -1
package.json
··· 9 9 "dev": "pnpm --filter @example/changesets run start", 10 10 "format": "biome check --write", 11 11 "lint": "biome lint --write --unsafe", 12 - "types": "biome lint --write --unsafe", 12 + "types": "tsc --noEmit", 13 13 "deps": "pnpm exec knip --production", 14 14 "test": "pnpm --color -r run test", 15 15 "pretest": "pnpm run build"
+5 -1
packages/core/src/prompts/multi-select.ts
··· 21 21 } 22 22 23 23 private toggleInvert() { 24 - const notSelected = this.options.filter((v) => !this.value.includes(v.value)); 24 + const value = this.value; 25 + if (!value) { 26 + return; 27 + } 28 + const notSelected = this.options.filter((v) => !value.includes(v.value)); 25 29 this.value = notSelected.map((v) => v.value); 26 30 } 27 31
+2 -1
packages/core/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.json" 2 + "extends": "../../tsconfig.json", 3 + "include": ["src"] 3 4 }
+5 -3
packages/prompts/src/note.ts
··· 1 1 import process from 'node:process'; 2 2 import type { Writable } from 'node:stream'; 3 3 import { stripVTControlCharacters as strip } from 'node:util'; 4 + import { getColumns } from '@clack/core'; 4 5 import { wrapAnsi } from 'fast-wrap-ansi'; 5 6 import color from 'picocolors'; 6 7 import { ··· 13 14 S_STEP_SUBMIT, 14 15 } from './common.js'; 15 16 17 + type FormatFn = (line: string) => string; 16 18 export interface NoteOptions extends CommonOptions { 17 - format?: (line: string) => string; 19 + format?: FormatFn; 18 20 } 19 21 20 22 const defaultNoteFormatter = (line: string): string => color.dim(line); 21 23 22 - const wrapWithFormat = (message: string, width: number, format: NoteOptions['format']): string => { 24 + const wrapWithFormat = (message: string, width: number, format: FormatFn): string => { 23 25 const wrapMsg = wrapAnsi(message, width).split('\n'); 24 26 const maxWidthNormal = wrapMsg.reduce((sum, ln) => Math.max(strip(ln).length, sum), 0); 25 27 const maxWidthFormat = wrapMsg ··· 32 34 export const note = (message = '', title = '', opts?: NoteOptions) => { 33 35 const output: Writable = opts?.output ?? process.stdout; 34 36 const format = opts?.format ?? defaultNoteFormatter; 35 - const wrapMsg = wrapWithFormat(message, output.columns - 6, format); 37 + const wrapMsg = wrapWithFormat(message, getColumns(output) - 6, format); 36 38 const lines = ['', ...wrapMsg.split('\n').map(format), '']; 37 39 const titleLen = strip(title).length; 38 40 const len =
+112 -120
packages/prompts/test/__snapshots__/note.test.ts.snap
··· 3 3 exports[`note (isCI = false) > don't overflow 1`] = ` 4 4 [ 5 5 "│ 6 - ◇ title ──────────────────────────────────────────────────────────────╮ 7 - │ │ 8 - │ test string test string test string test string test string test │ 9 - │ string test string test string test string test string test string │ 10 - │ test string test string test string test string test string test │ 11 - │ string test string test string test string test string test string │ 12 - │ test string test string test string test string test string test │ 13 - │ string test string test string test string test string │ 14 - │ test string test string test string test string test string test │ 15 - │ string test string test string test string test string test string │ 16 - │ test string test string test string test string test string test │ 17 - │ string test string test string test string test string test string │ 18 - │ test string test string test string test string test string test │ 19 - │ string test string test string test string test string │ 20 - │ test string test string test string test string test string test │ 21 - │ string test string test string test string test string test string │ 22 - │ test string test string test string test string test string test │ 23 - │ string test string test string test string test string test string │ 24 - │ test string test string test string test string test string test │ 25 - │ string test string test string test string test string │ 26 - │ test string test string test string test string test string test │ 27 - │ string test string test string test string test string test string │ 28 - │ test string test string test string test string test string test │ 29 - │ string test string test string test string test string test string │ 30 - │ test string test string test string test string test string test │ 31 - │ string test string test string test string test string │ 32 - │ │ 33 - ├──────────────────────────────────────────────────────────────────────╯ 6 + ◇ title ───────────────────────────────────────────────────────────────────╮ 7 + │ │ 8 + │ test string test string test string test string test string test string │ 9 + │ test string test string test string test string test string test string │ 10 + │ test string test string test string test string test string test string │ 11 + │ test string test string test string test string test string test string │ 12 + │ test string test string test string test string test string test string │ 13 + │ test string test string │ 14 + │ test string test string test string test string test string test string │ 15 + │ test string test string test string test string test string test string │ 16 + │ test string test string test string test string test string test string │ 17 + │ test string test string test string test string test string test string │ 18 + │ test string test string test string test string test string test string │ 19 + │ test string test string │ 20 + │ test string test string test string test string test string test string │ 21 + │ test string test string test string test string test string test string │ 22 + │ test string test string test string test string test string test string │ 23 + │ test string test string test string test string test string test string │ 24 + │ test string test string test string test string test string test string │ 25 + │ test string test string │ 26 + │ test string test string test string test string test string test string │ 27 + │ test string test string test string test string test string test string │ 28 + │ test string test string test string test string test string test string │ 29 + │ test string test string test string test string test string test string │ 30 + │ test string test string test string test string test string test string │ 31 + │ test string test string │ 32 + │ │ 33 + ├───────────────────────────────────────────────────────────────────────────╯ 34 34 ", 35 35 ] 36 36 `; ··· 38 38 exports[`note (isCI = false) > don't overflow with formatter 1`] = ` 39 39 [ 40 40 "│ 41 - ◇ title ────────────────────────────────────────────────────────────────╮ 42 - │ │ 43 - │ * test string test string test string test string test string test * │ 44 - │ * string test string test string test string test string test * │ 45 - │ * string test string test string test string test string test * │ 46 - │ * string test string test string test string test string test * │ 47 - │ * string test string test string test string test string test * │ 48 - │ * string test string test string test string test string test * │ 49 - │ * string test string * │ 50 - │ * test string test string test string test string test string test * │ 51 - │ * string test string test string test string test string test * │ 52 - │ * string test string test string test string test string test * │ 53 - │ * string test string test string test string test string test * │ 54 - │ * string test string test string test string test string test * │ 55 - │ * string test string test string test string test string test * │ 56 - │ * string test string * │ 57 - │ * test string test string test string test string test string test * │ 58 - │ * string test string test string test string test string test * │ 59 - │ * string test string test string test string test string test * │ 60 - │ * string test string test string test string test string test * │ 61 - │ * string test string test string test string test string test * │ 62 - │ * string test string test string test string test string test * │ 63 - │ * string test string * │ 64 - │ * test string test string test string test string test string test * │ 65 - │ * string test string test string test string test string test * │ 66 - │ * string test string test string test string test string test * │ 67 - │ * string test string test string test string test string test * │ 68 - │ * string test string test string test string test string test * │ 69 - │ * string test string test string test string test string test * │ 70 - │ * string test string * │ 71 - │ │ 72 - ├────────────────────────────────────────────────────────────────────────╯ 41 + ◇ title ──────────────────────────────────────────────────────────────────╮ 42 + │ │ 43 + │ * test string test string test string test string test string test * │ 44 + │ * string test string test string test string test string test string * │ 45 + │ * test string test string test string test string test string test * │ 46 + │ * string test string test string test string test string test string * │ 47 + │ * test string test string test string test string test string test * │ 48 + │ * string test string test string test string test string * │ 49 + │ * test string test string test string test string test string test * │ 50 + │ * string test string test string test string test string test string * │ 51 + │ * test string test string test string test string test string test * │ 52 + │ * string test string test string test string test string test string * │ 53 + │ * test string test string test string test string test string test * │ 54 + │ * string test string test string test string test string * │ 55 + │ * test string test string test string test string test string test * │ 56 + │ * string test string test string test string test string test string * │ 57 + │ * test string test string test string test string test string test * │ 58 + │ * string test string test string test string test string test string * │ 59 + │ * test string test string test string test string test string test * │ 60 + │ * string test string test string test string test string * │ 61 + │ * test string test string test string test string test string test * │ 62 + │ * string test string test string test string test string test string * │ 63 + │ * test string test string test string test string test string test * │ 64 + │ * string test string test string test string test string test string * │ 65 + │ * test string test string test string test string test string test * │ 66 + │ * string test string test string test string test string * │ 67 + │ │ 68 + ├──────────────────────────────────────────────────────────────────────────╯ 73 69 ", 74 70 ] 75 71 `; ··· 130 126 exports[`note (isCI = true) > don't overflow 1`] = ` 131 127 [ 132 128 "│ 133 - ◇ title ──────────────────────────────────────────────────────────────╮ 134 - │ │ 135 - │ test string test string test string test string test string test │ 136 - │ string test string test string test string test string test string │ 137 - │ test string test string test string test string test string test │ 138 - │ string test string test string test string test string test string │ 139 - │ test string test string test string test string test string test │ 140 - │ string test string test string test string test string │ 141 - │ test string test string test string test string test string test │ 142 - │ string test string test string test string test string test string │ 143 - │ test string test string test string test string test string test │ 144 - │ string test string test string test string test string test string │ 145 - │ test string test string test string test string test string test │ 146 - │ string test string test string test string test string │ 147 - │ test string test string test string test string test string test │ 148 - │ string test string test string test string test string test string │ 149 - │ test string test string test string test string test string test │ 150 - │ string test string test string test string test string test string │ 151 - │ test string test string test string test string test string test │ 152 - │ string test string test string test string test string │ 153 - │ test string test string test string test string test string test │ 154 - │ string test string test string test string test string test string │ 155 - │ test string test string test string test string test string test │ 156 - │ string test string test string test string test string test string │ 157 - │ test string test string test string test string test string test │ 158 - │ string test string test string test string test string │ 159 - │ │ 160 - ├──────────────────────────────────────────────────────────────────────╯ 129 + ◇ title ───────────────────────────────────────────────────────────────────╮ 130 + │ │ 131 + │ test string test string test string test string test string test string │ 132 + │ test string test string test string test string test string test string │ 133 + │ test string test string test string test string test string test string │ 134 + │ test string test string test string test string test string test string │ 135 + │ test string test string test string test string test string test string │ 136 + │ test string test string │ 137 + │ test string test string test string test string test string test string │ 138 + │ test string test string test string test string test string test string │ 139 + │ test string test string test string test string test string test string │ 140 + │ test string test string test string test string test string test string │ 141 + │ test string test string test string test string test string test string │ 142 + │ test string test string │ 143 + │ test string test string test string test string test string test string │ 144 + │ test string test string test string test string test string test string │ 145 + │ test string test string test string test string test string test string │ 146 + │ test string test string test string test string test string test string │ 147 + │ test string test string test string test string test string test string │ 148 + │ test string test string │ 149 + │ test string test string test string test string test string test string │ 150 + │ test string test string test string test string test string test string │ 151 + │ test string test string test string test string test string test string │ 152 + │ test string test string test string test string test string test string │ 153 + │ test string test string test string test string test string test string │ 154 + │ test string test string │ 155 + │ │ 156 + ├───────────────────────────────────────────────────────────────────────────╯ 161 157 ", 162 158 ] 163 159 `; ··· 165 161 exports[`note (isCI = true) > don't overflow with formatter 1`] = ` 166 162 [ 167 163 "│ 168 - ◇ title ────────────────────────────────────────────────────────────────╮ 169 - │ │ 170 - │ * test string test string test string test string test string test * │ 171 - │ * string test string test string test string test string test * │ 172 - │ * string test string test string test string test string test * │ 173 - │ * string test string test string test string test string test * │ 174 - │ * string test string test string test string test string test * │ 175 - │ * string test string test string test string test string test * │ 176 - │ * string test string * │ 177 - │ * test string test string test string test string test string test * │ 178 - │ * string test string test string test string test string test * │ 179 - │ * string test string test string test string test string test * │ 180 - │ * string test string test string test string test string test * │ 181 - │ * string test string test string test string test string test * │ 182 - │ * string test string test string test string test string test * │ 183 - │ * string test string * │ 184 - │ * test string test string test string test string test string test * │ 185 - │ * string test string test string test string test string test * │ 186 - │ * string test string test string test string test string test * │ 187 - │ * string test string test string test string test string test * │ 188 - │ * string test string test string test string test string test * │ 189 - │ * string test string test string test string test string test * │ 190 - │ * string test string * │ 191 - │ * test string test string test string test string test string test * │ 192 - │ * string test string test string test string test string test * │ 193 - │ * string test string test string test string test string test * │ 194 - │ * string test string test string test string test string test * │ 195 - │ * string test string test string test string test string test * │ 196 - │ * string test string test string test string test string test * │ 197 - │ * string test string * │ 198 - │ │ 199 - ├────────────────────────────────────────────────────────────────────────╯ 164 + ◇ title ──────────────────────────────────────────────────────────────────╮ 165 + │ │ 166 + │ * test string test string test string test string test string test * │ 167 + │ * string test string test string test string test string test string * │ 168 + │ * test string test string test string test string test string test * │ 169 + │ * string test string test string test string test string test string * │ 170 + │ * test string test string test string test string test string test * │ 171 + │ * string test string test string test string test string * │ 172 + │ * test string test string test string test string test string test * │ 173 + │ * string test string test string test string test string test string * │ 174 + │ * test string test string test string test string test string test * │ 175 + │ * string test string test string test string test string test string * │ 176 + │ * test string test string test string test string test string test * │ 177 + │ * string test string test string test string test string * │ 178 + │ * test string test string test string test string test string test * │ 179 + │ * string test string test string test string test string test string * │ 180 + │ * test string test string test string test string test string test * │ 181 + │ * string test string test string test string test string test string * │ 182 + │ * test string test string test string test string test string test * │ 183 + │ * string test string test string test string test string * │ 184 + │ * test string test string test string test string test string test * │ 185 + │ * string test string test string test string test string test string * │ 186 + │ * test string test string test string test string test string test * │ 187 + │ * string test string test string test string test string test string * │ 188 + │ * test string test string test string test string test string test * │ 189 + │ * string test string test string test string test string * │ 190 + │ │ 191 + ├──────────────────────────────────────────────────────────────────────────╯ 200 192 ", 201 193 ] 202 194 `;
+4 -4
packages/prompts/test/note.test.ts
··· 65 65 }); 66 66 67 67 test("don't overflow", () => { 68 - const input = `${'test string '.repeat(32)}\n`.repeat(4).trim(); 69 - prompts.note(input, 'title', { 68 + const message = `${'test string '.repeat(32)}\n`.repeat(4).trim(); 69 + prompts.note(message, 'title', { 70 70 input, 71 71 output: Object.assign(output, { columns: 75 }), 72 72 }); ··· 75 75 }); 76 76 77 77 test("don't overflow with formatter", () => { 78 - const input = `${'test string '.repeat(32)}\n`.repeat(4).trim(); 79 - prompts.note(input, 'title', { 78 + const message = `${'test string '.repeat(32)}\n`.repeat(4).trim(); 79 + prompts.note(message, 'title', { 80 80 format: (line) => colors.red(`* ${colors.cyan(line)} *`), 81 81 input, 82 82 output: Object.assign(output, { columns: 75 }),
+1 -1
packages/prompts/test/password.test.ts
··· 77 77 const result = prompts.password({ 78 78 message: 'foo', 79 79 validate: (value) => { 80 - if (value.length < 2) { 80 + if (!value || value.length < 2) { 81 81 return 'Password must be at least 2 characters'; 82 82 } 83 83
+2 -1
packages/prompts/tsconfig.json
··· 1 1 { 2 - "extends": "../../tsconfig.json" 2 + "extends": "../../tsconfig.json", 3 + "include": ["src"] 3 4 }
+5 -2
tsconfig.json
··· 13 13 "verbatimModuleSyntax": true, 14 14 "lib": ["ES2022"], 15 15 "paths": { 16 - "@clack/core": ["./packages/core/src"] 16 + "@clack/core": ["./packages/core/src/index.ts"], 17 + "@clack/prompts": ["./packages/prompts/src/index.ts"] 17 18 } 18 19 }, 19 - "include": ["packages"] 20 + "include": [ 21 + "packages/*/src/**/*" 22 + ] 20 23 }