[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.

Format with Biome (#213)

authored by

Nate Moore and committed by
GitHub
(Dec 13, 2024, 11:32 PM -0600) 166c23cc 3825c6b7

+259 -250
-3
.prettierignore
··· 1 - .github/workflows/**/*.yml 2 - .changeset/**/*.md 3 - pnpm-lock.yaml
-16
.prettierrc.cjs
··· 1 - module.exports = { 2 - printWidth: 100, 3 - semi: true, 4 - singleQuote: true, 5 - tabWidth: 2, 6 - trailingComma: 'es5', 7 - useTabs: true, 8 - overrides: [ 9 - { 10 - files: ['.*', '*.json', '*.md', '*.toml', '*.yml'], 11 - options: { 12 - useTabs: false, 13 - }, 14 - }, 15 - ], 16 - };
+41
biome.json
··· 1 + { 2 + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 + "vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, 4 + "files": { "ignoreUnknown": false, "ignore": ["**/dist/**"] }, 5 + "formatter": { 6 + "enabled": true, 7 + "useEditorconfig": true, 8 + "formatWithErrors": false, 9 + "indentStyle": "tab", 10 + "indentWidth": 2, 11 + "lineEnding": "lf", 12 + "lineWidth": 100, 13 + "attributePosition": "auto", 14 + "bracketSpacing": true, 15 + "ignore": [".github/workflows/**/*.yml", ".changeset/**/*.md", "**/pnpm-lock.yaml"] 16 + }, 17 + "organizeImports": { "enabled": true }, 18 + "linter": { 19 + "enabled": true, 20 + "rules": { "recommended": true, "suspicious": { "noExplicitAny": "off" } } 21 + }, 22 + "javascript": { 23 + "formatter": { 24 + "jsxQuoteStyle": "double", 25 + "quoteProperties": "asNeeded", 26 + "trailingCommas": "es5", 27 + "semicolons": "always", 28 + "arrowParentheses": "always", 29 + "bracketSameLine": false, 30 + "quoteStyle": "single", 31 + "attributePosition": "auto", 32 + "bracketSpacing": true 33 + } 34 + }, 35 + "overrides": [ 36 + { 37 + "include": ["*.json", "*.toml", "*.yml"], 38 + "formatter": { "indentStyle": "space" } 39 + } 40 + ] 41 + }
+1 -1
examples/basic/index.ts
··· 82 82 s.stop('Installed via pnpm'); 83 83 } 84 84 85 - let nextSteps = `cd ${project.path} \n${project.install ? '' : 'pnpm install\n'}pnpm dev`; 85 + const nextSteps = `cd ${project.path} \n${project.install ? '' : 'pnpm install\n'}pnpm dev`; 86 86 87 87 p.note(nextSteps, 'Next steps.'); 88 88
+1 -1
examples/basic/spinner.ts
··· 17 17 spin.message(`Loading packages [${progress}/${total}]`); // <=== 18 18 }, 100); 19 19 }).then(() => { 20 - spin.stop(`Done`); 20 + spin.stop('Done'); 21 21 p.outro('spinner stop...'); 22 22 });
+1 -1
examples/changesets/index.ts
··· 59 59 (pkg) => !major.includes(pkg) && !minor.includes(pkg) 60 60 ); 61 61 if (possiblePackages.length === 0) return; 62 - let note = possiblePackages.join(color.dim(', ')); 62 + const note = possiblePackages.join(color.dim(', ')); 63 63 64 64 p.log.step(`These packages will have a ${color.green('patch')} bump.\n${color.dim(note)}`); 65 65 return possiblePackages;
+7 -11
package.json
··· 4 4 "type": "module", 5 5 "scripts": { 6 6 "stub": "pnpm -r run build --stub", 7 - "build": "pnpm run build:core && pnpm run build:prompts", 8 - "build:core": "pnpm --filter @clack/core run build", 9 - "build:prompts": "pnpm --filter @clack/prompts run build", 10 - "start": "pnpm --filter @example/basic run start", 7 + "build": "pnpm --filter \"@clack/*\" run build", 8 + "start": "pnpm run dev", 11 9 "dev": "pnpm --filter @example/changesets run start", 12 - "format": "pnpm run /^format:.*/", 13 - "format:code": "prettier -w . --cache", 14 - "format:imports": "organize-imports-cli ./packages/*/tsconfig.json", 15 - "type-check": "tsc", 10 + "format": "biome format --write", 11 + "lint": "biome lint --write --unsafe", 12 + "type-check": "biome lint && tsc", 16 13 "test": "pnpm -r run test", 17 14 "ci:version": "changeset version && pnpm install --no-frozen-lockfile", 18 15 "ci:publish": "changeset publish", 19 - "ci:format": "pnpm run format" 16 + "ci:format": "biome ci" 20 17 }, 21 18 "devDependencies": { 19 + "@biomejs/biome": "1.9.4", 22 20 "@changesets/cli": "^2.26.2", 23 21 "@types/node": "^18.16.0", 24 - "organize-imports-cli": "^0.10.0", 25 - "prettier": "^3.0.2", 26 22 "typescript": "^5.2.2", 27 23 "unbuild": "^2.0.0" 28 24 },
+1 -4
packages/core/package.json
··· 22 22 "url": "https://github.com/natemoo-re/clack/issues" 23 23 }, 24 24 "homepage": "https://github.com/natemoo-re/clack/tree/main/packages/core#readme", 25 - "files": [ 26 - "dist", 27 - "CHANGELOG.md" 28 - ], 25 + "files": ["dist", "CHANGELOG.md"], 29 26 "keywords": [ 30 27 "ask", 31 28 "clack",
+2 -2
packages/core/src/prompts/confirm.ts
··· 1 1 import { cursor } from 'sisteransi'; 2 - import Prompt, { PromptOptions } from './prompt'; 2 + import Prompt, { type PromptOptions } from './prompt'; 3 3 4 4 interface ConfirmOptions extends PromptOptions<ConfirmPrompt> { 5 5 active: string; ··· 17 17 18 18 constructor(opts: ConfirmOptions) { 19 19 super(opts, false); 20 - this.value = opts.initialValue ? true : false; 20 + this.value = !!opts.initialValue; 21 21 22 22 this.on('value', () => { 23 23 this.value = this._value;
+2 -2
packages/core/src/prompts/group-multiselect.ts
··· 1 - import Prompt, { PromptOptions } from './prompt'; 1 + import Prompt, { type PromptOptions } from './prompt'; 2 2 3 3 interface GroupMultiSelectOptions<T extends { value: any }> 4 4 extends PromptOptions<GroupMultiSelectPrompt<T>> { ··· 9 9 } 10 10 export default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt { 11 11 options: (T & { group: string | boolean })[]; 12 - cursor: number = 0; 12 + cursor = 0; 13 13 14 14 getGroupItems(group: string): T[] { 15 15 return this.options.filter((o) => o.group === group);
+2 -2
packages/core/src/prompts/multi-select.ts
··· 1 - import Prompt, { PromptOptions } from './prompt'; 1 + import Prompt, { type PromptOptions } from './prompt'; 2 2 3 3 interface MultiSelectOptions<T extends { value: any }> extends PromptOptions<MultiSelectPrompt<T>> { 4 4 options: T[]; ··· 8 8 } 9 9 export default class MultiSelectPrompt<T extends { value: any }> extends Prompt { 10 10 options: T[]; 11 - cursor: number = 0; 11 + cursor = 0; 12 12 13 13 private get _value() { 14 14 return this.options[this.cursor].value;
+1 -1
packages/core/src/prompts/password.ts
··· 1 1 import color from 'picocolors'; 2 - import Prompt, { PromptOptions } from './prompt'; 2 + import Prompt, { type PromptOptions } from './prompt'; 3 3 4 4 interface PasswordOptions extends PromptOptions<PasswordPrompt> { 5 5 mask?: string;
+35 -34
packages/core/src/prompts/prompt.ts
··· 1 1 import { stdin, stdout } from 'node:process'; 2 2 import readline, { type Key, type ReadLine } from 'node:readline'; 3 - import { Readable, Writable } from 'node:stream'; 3 + import type { Readable, Writable } from 'node:stream'; 4 4 import { WriteStream } from 'node:tty'; 5 5 import { cursor, erase } from 'sisteransi'; 6 6 import wrap from 'wrap-ansi'; ··· 10 10 import type { ClackEvents, ClackState, InferSetType } from '../types'; 11 11 12 12 export interface PromptOptions<Self extends Prompt> { 13 - render(this: Omit<Self, 'prompt'>): string | void; 13 + render(this: Omit<Self, 'prompt'>): string | undefined; 14 14 placeholder?: string; 15 15 initialValue?: any; 16 - validate?: ((value: any) => string | void) | undefined; 16 + validate?: ((value: any) => string | undefined) | undefined; 17 17 input?: Readable; 18 18 output?: Writable; 19 19 debug?: boolean; ··· 25 25 26 26 private rl!: ReadLine; 27 27 private opts: Omit<PromptOptions<Prompt>, 'render' | 'input' | 'output'>; 28 - private _render: (context: Omit<Prompt, 'prompt'>) => string | void; 28 + private _render: (context: Omit<Prompt, 'prompt'>) => string | undefined; 29 29 private _track = false; 30 30 private _prevFrame = ''; 31 31 private _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>(); ··· 35 35 public error = ''; 36 36 public value: any; 37 37 38 - constructor(options: PromptOptions<Prompt>, trackValue: boolean = true) { 38 + constructor(options: PromptOptions<Prompt>, trackValue = true) { 39 39 const { input = stdin, output = stdout, render, ...opts } = options; 40 40 41 41 this.opts = opts; ··· 110 110 } 111 111 112 112 public prompt() { 113 - const sink = new WriteStream(0); 114 - sink._write = (chunk, encoding, done) => { 115 - if (this._track) { 116 - this.value = this.rl.line.replace(/\t/g, ''); 117 - this._cursor = this.rl.cursor; 118 - this.emit('value', this.value); 113 + return new Promise<string | symbol>((resolve, reject) => { 114 + const sink = new WriteStream(0); 115 + sink._write = (chunk, encoding, done) => { 116 + if (this._track) { 117 + this.value = this.rl.line.replace(/\t/g, ''); 118 + this._cursor = this.rl.cursor; 119 + this.emit('value', this.value); 120 + } 121 + done(); 122 + }; 123 + this.input.pipe(sink); 124 + 125 + this.rl = readline.createInterface({ 126 + input: this.input, 127 + output: sink, 128 + tabSize: 2, 129 + prompt: '', 130 + escapeCodeTimeout: 50, 131 + }); 132 + readline.emitKeypressEvents(this.input, this.rl); 133 + this.rl.prompt(); 134 + if (this.opts.initialValue !== undefined && this._track) { 135 + this.rl.write(this.opts.initialValue); 119 136 } 120 - done(); 121 - }; 122 - this.input.pipe(sink); 123 137 124 - this.rl = readline.createInterface({ 125 - input: this.input, 126 - output: sink, 127 - tabSize: 2, 128 - prompt: '', 129 - escapeCodeTimeout: 50, 130 - }); 131 - readline.emitKeypressEvents(this.input, this.rl); 132 - this.rl.prompt(); 133 - if (this.opts.initialValue !== undefined && this._track) { 134 - this.rl.write(this.opts.initialValue); 135 - } 138 + this.input.on('keypress', this.onKeypress); 139 + setRawMode(this.input, true); 140 + this.output.on('resize', this.render); 136 141 137 - this.input.on('keypress', this.onKeypress); 138 - setRawMode(this.input, true); 139 - this.output.on('resize', this.render); 142 + this.render(); 140 143 141 - this.render(); 142 - 143 - return new Promise<string | symbol>((resolve, reject) => { 144 144 this.once('submit', () => { 145 145 this.output.write(cursor.show); 146 146 this.output.off('resize', this.render); ··· 193 193 } 194 194 } 195 195 196 - if (hasAliasKey([key?.name, key?.sequence], 'cancel')) { 196 + if (hasAliasKey([char, key?.name, key?.sequence], 'cancel')) { 197 197 this.state = 'cancel'; 198 198 } 199 199 if (this.state === 'submit' || this.state === 'cancel') { ··· 241 241 this.output.write(cursor.move(0, lines.length - diffLine - 1)); 242 242 return; 243 243 // If many lines have changed, rerender everything past the first line 244 - } else if (diff && diff?.length > 1) { 244 + } 245 + if (diff && diff?.length > 1) { 245 246 const diffLine = diff[0]; 246 247 this.output.write(cursor.move(0, diffLine)); 247 248 this.output.write(erase.down());
+2 -2
packages/core/src/prompts/select-key.ts
··· 1 - import Prompt, { PromptOptions } from './prompt'; 1 + import Prompt, { type PromptOptions } from './prompt'; 2 2 3 3 interface SelectKeyOptions<T extends { value: any }> extends PromptOptions<SelectKeyPrompt<T>> { 4 4 options: T[]; 5 5 } 6 6 export default class SelectKeyPrompt<T extends { value: any }> extends Prompt { 7 7 options: T[]; 8 - cursor: number = 0; 8 + cursor = 0; 9 9 10 10 constructor(opts: SelectKeyOptions<T>) { 11 11 super(opts, false);
+2 -2
packages/core/src/prompts/select.ts
··· 1 - import Prompt, { PromptOptions } from './prompt'; 1 + import Prompt, { type PromptOptions } from './prompt'; 2 2 3 3 interface SelectOptions<T extends { value: any }> extends PromptOptions<SelectPrompt<T>> { 4 4 options: T[]; ··· 6 6 } 7 7 export default class SelectPrompt<T extends { value: any }> extends Prompt { 8 8 options: T[]; 9 - cursor: number = 0; 9 + cursor = 0; 10 10 11 11 private get _value() { 12 12 return this.options[this.cursor];
+1 -1
packages/core/src/prompts/text.ts
··· 1 1 import color from 'picocolors'; 2 - import Prompt, { PromptOptions } from './prompt'; 2 + import Prompt, { type PromptOptions } from './prompt'; 3 3 4 4 export interface TextOptions extends PromptOptions<TextPrompt> { 5 5 placeholder?: string;
+1 -1
packages/core/src/types.ts
··· 1 - import { KEYS } from './utils'; 1 + import type { KEYS } from './utils'; 2 2 3 3 export type InferSetType<T> = T extends Set<infer U> ? U : never; 4 4
+2 -2
packages/core/src/utils/index.ts
··· 5 5 import { cursor } from 'sisteransi'; 6 6 import { hasAliasKey } from './aliases'; 7 7 8 - const isWindows = globalThis.process.platform.startsWith('win'); 9 - 10 8 export * from './aliases'; 11 9 export * from './string'; 10 + 11 + const isWindows = globalThis.process.platform.startsWith('win'); 12 12 13 13 export const CANCEL_SYMBOL = Symbol('clack:cancel'); 14 14
-1
packages/core/test/mock-writable.ts
··· 3 3 export class MockWritable extends Writable { 4 4 public buffer: string[] = []; 5 5 6 - // biome-ignore lint/suspicious/noExplicitAny: any is the official type 7 6 _write( 8 7 chunk: any, 9 8 encoding: BufferEncoding,
+1 -4
packages/prompts/package.json
··· 22 22 "url": "https://github.com/natemoo-re/clack/issues" 23 23 }, 24 24 "homepage": "https://github.com/natemoo-re/clack/tree/main/packages/prompts#readme", 25 - "files": [ 26 - "dist", 27 - "CHANGELOG.md" 28 - ], 25 + "files": ["dist", "CHANGELOG.md"], 29 26 "author": { 30 27 "name": "Nate Moore", 31 28 "email": "nate@natemoo.re",
+52 -48
packages/prompts/src/index.ts
··· 1 1 import { 2 - block, 3 2 ConfirmPrompt, 4 3 GroupMultiSelectPrompt, 5 - isCancel, 6 4 MultiSelectPrompt, 7 5 PasswordPrompt, 8 6 SelectKeyPrompt, 9 7 SelectPrompt, 10 - State, 11 - TextPrompt 8 + type State, 9 + TextPrompt, 10 + block, 11 + isCancel, 12 12 } from '@clack/core'; 13 13 import isUnicodeSupported from 'is-unicode-supported'; 14 14 import color from 'picocolors'; ··· 68 68 const limitOptions = <TOption>(params: LimitOptionsParams<TOption>): string[] => { 69 69 const { cursor, options, style } = params; 70 70 71 - const paramMaxItems = params.maxItems ?? Infinity; 71 + const paramMaxItems = params.maxItems ?? Number.POSITIVE_INFINITY; 72 72 const outputMaxItems = Math.max(process.stdout.rows - 4, 0); 73 73 // We clamp to minimum 5 because anything less doesn't make sense UX wise 74 74 const maxItems = Math.min(outputMaxItems, Math.max(paramMaxItems, 5)); ··· 100 100 placeholder?: string; 101 101 defaultValue?: string; 102 102 initialValue?: string; 103 - validate?: (value: string) => string | void; 103 + validate?: (value: string) => string | undefined; 104 104 } 105 105 export const text = (opts: TextOptions) => { 106 106 return new TextPrompt({ ··· 125 125 case 'cancel': 126 126 return `${title}${color.gray(S_BAR)} ${color.strikethrough( 127 127 color.dim(this.value ?? '') 128 - )}${this.value?.trim() ? '\n' + color.gray(S_BAR) : ''}`; 128 + )}${this.value?.trim() ? `\n${color.gray(S_BAR)}` : ''}`; 129 129 default: 130 130 return `${title}${color.cyan(S_BAR)} ${value}\n${color.cyan(S_BAR_END)}\n`; 131 131 } ··· 136 136 export interface PasswordOptions { 137 137 message: string; 138 138 mask?: string; 139 - validate?: (value: string) => string | void; 139 + validate?: (value: string) => string | undefined; 140 140 } 141 141 export const password = (opts: PasswordOptions) => { 142 142 return new PasswordPrompt({ ··· 156 156 return `${title}${color.gray(S_BAR)} ${color.dim(masked)}`; 157 157 case 'cancel': 158 158 return `${title}${color.gray(S_BAR)} ${color.strikethrough(color.dim(masked ?? ''))}${ 159 - masked ? '\n' + color.gray(S_BAR) : '' 159 + masked ? `\n${color.gray(S_BAR)}` : '' 160 160 }`; 161 161 default: 162 162 return `${title}${color.cyan(S_BAR)} ${value}\n${color.cyan(S_BAR_END)}\n`; ··· 270 270 const label = option.label ?? String(option.value); 271 271 if (state === 'selected') { 272 272 return `${color.dim(label)}`; 273 - } else if (state === 'cancelled') { 273 + } 274 + if (state === 'cancelled') { 274 275 return `${color.strikethrough(color.dim(label))}`; 275 - } else if (state === 'active') { 276 + } 277 + if (state === 'active') { 276 278 return `${color.bgCyan(color.gray(` ${option.value} `))} ${label} ${ 277 279 option.hint ? color.dim(`(${option.hint})`) : '' 278 280 }`; ··· 291 293 switch (this.state) { 292 294 case 'submit': 293 295 return `${title}${color.gray(S_BAR)} ${opt( 294 - this.options.find((opt) => opt.value === this.value)!, 296 + this.options.find((opt) => opt.value === this.value) ?? opts.options[0], 295 297 'selected' 296 298 )}`; 297 299 case 'cancel': ··· 326 328 return `${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${ 327 329 option.hint ? color.dim(`(${option.hint})`) : '' 328 330 }`; 329 - } else if (state === 'selected') { 331 + } 332 + if (state === 'selected') { 330 333 return `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`; 331 - } else if (state === 'cancelled') { 334 + } 335 + if (state === 'cancelled') { 332 336 return `${color.strikethrough(color.dim(label))}`; 333 - } else if (state === 'active-selected') { 337 + } 338 + if (state === 'active-selected') { 334 339 return `${color.green(S_CHECKBOX_SELECTED)} ${label} ${ 335 340 option.hint ? color.dim(`(${option.hint})`) : '' 336 341 }`; 337 - } else if (state === 'submitted') { 342 + } 343 + if (state === 'submitted') { 338 344 return `${color.dim(label)}`; 339 345 } 340 346 return `${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`; ··· 356 362 )}`; 357 363 }, 358 364 render() { 359 - let title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${opts.message}\n`; 365 + const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${opts.message}\n`; 360 366 361 367 const styleOption = (option: Option<Value>, active: boolean) => { 362 368 const selected = this.value.includes(option.value); ··· 394 400 i === 0 ? `${color.yellow(S_BAR_END)} ${color.yellow(ln)}` : ` ${ln}` 395 401 ) 396 402 .join('\n'); 397 - return ( 398 - title + 399 - color.yellow(S_BAR) + 400 - ' ' + 401 - limitOptions({ 402 - options: this.options, 403 - cursor: this.cursor, 404 - maxItems: opts.maxItems, 405 - style: styleOption, 406 - }).join(`\n${color.yellow(S_BAR)} `) + 407 - '\n' + 408 - footer + 409 - '\n' 410 - ); 403 + return `${title + color.yellow(S_BAR)} ${limitOptions({ 404 + options: this.options, 405 + cursor: this.cursor, 406 + maxItems: opts.maxItems, 407 + style: styleOption, 408 + }).join(`\n${color.yellow(S_BAR)} `)}\n${footer}\n`; 411 409 } 412 410 default: { 413 411 return `${title}${color.cyan(S_BAR)} ${limitOptions({ ··· 453 451 return `${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${ 454 452 option.hint ? color.dim(`(${option.hint})`) : '' 455 453 }`; 456 - } else if (state === 'group-active') { 454 + } 455 + if (state === 'group-active') { 457 456 return `${prefix}${color.cyan(S_CHECKBOX_ACTIVE)} ${color.dim(label)}`; 458 - } else if (state === 'group-active-selected') { 457 + } 458 + if (state === 'group-active-selected') { 459 459 return `${prefix}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`; 460 - } else if (state === 'selected') { 460 + } 461 + if (state === 'selected') { 461 462 return `${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`; 462 - } else if (state === 'cancelled') { 463 + } 464 + if (state === 'cancelled') { 463 465 return `${color.strikethrough(color.dim(label))}`; 464 - } else if (state === 'active-selected') { 466 + } 467 + if (state === 'active-selected') { 465 468 return `${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${label} ${ 466 469 option.hint ? color.dim(`(${option.hint})`) : '' 467 470 }`; 468 - } else if (state === 'submitted') { 471 + } 472 + if (state === 'submitted') { 469 473 return `${color.dim(label)}`; 470 474 } 471 475 return `${color.dim(prefix)}${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`; ··· 487 491 )}`; 488 492 }, 489 493 render() { 490 - let title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${opts.message}\n`; 494 + const title = `${color.gray(S_BAR)}\n${symbol(this.state)} ${opts.message}\n`; 491 495 492 496 switch (this.state) { 493 497 case 'submit': { ··· 571 575 const len = 572 576 Math.max( 573 577 lines.reduce((sum, ln) => { 574 - ln = strip(ln); 575 - return ln.length > sum ? ln.length : sum; 578 + const line = strip(ln); 579 + return line.length > sum ? line.length : sum; 576 580 }, 0), 577 581 titleLen 578 582 ) + 2; ··· 642 646 643 647 let unblock: () => void; 644 648 let loop: NodeJS.Timeout; 645 - let isSpinnerActive: boolean = false; 646 - let _message: string = ''; 649 + let isSpinnerActive = false; 650 + let _message = ''; 647 651 648 652 const handleExit = (code: number) => { 649 653 const msg = code > 1 ? 'Something went wrong' : 'Canceled'; ··· 672 676 process.removeListener('exit', handleExit); 673 677 }; 674 678 675 - const start = (msg: string = ''): void => { 679 + const start = (msg = ''): void => { 676 680 isSpinnerActive = true; 677 681 unblock = block(); 678 682 _message = msg.replace(/\.+$/, ''); ··· 691 695 }, delay); 692 696 }; 693 697 694 - const stop = (msg: string = '', code: number = 0): void => { 698 + const stop = (msg = '', code = 0): void => { 695 699 _message = msg ?? _message; 696 700 isSpinnerActive = false; 697 701 clearInterval(loop); ··· 699 703 code === 0 700 704 ? color.green(S_STEP_SUBMIT) 701 705 : code === 1 702 - ? color.red(S_STEP_CANCEL) 703 - : color.red(S_STEP_ERROR); 706 + ? color.red(S_STEP_CANCEL) 707 + : color.red(S_STEP_ERROR); 704 708 process.stdout.write(cursor.move(-999, 0)); 705 709 process.stdout.write(erase.down(1)); 706 710 process.stdout.write(`${step} ${_message}\n`); ··· 708 712 unblock(); 709 713 }; 710 714 711 - const message = (msg: string = ''): void => { 715 + const message = (msg = ''): void => { 712 716 _message = msg ?? _message; 713 717 }; 714 718 ··· 749 753 export type PromptGroup<T> = { 750 754 [P in keyof T]: (opts: { 751 755 results: Prettify<Partial<PromptGroupAwaitedReturn<Omit<T, P>>>>; 752 - }) => void | Promise<T[P] | void>; 756 + }) => undefined | Promise<T[P] | undefined>; 753 757 }; 754 758 755 759 /**
+104 -111
pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 devDependencies: 11 + '@biomejs/biome': 12 + specifier: 1.9.4 13 + version: 1.9.4 11 14 '@changesets/cli': 12 15 specifier: ^2.26.2 13 16 version: 2.26.2 14 17 '@types/node': 15 18 specifier: ^18.16.0 16 19 version: 18.16.0 17 - organize-imports-cli: 18 - specifier: ^0.10.0 19 - version: 0.10.0 20 - prettier: 21 - specifier: ^3.0.2 22 - version: 3.0.2 23 20 typescript: 24 21 specifier: ^5.2.2 25 22 version: 5.2.2 ··· 168 165 resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} 169 166 engines: {node: '>=6.9.0'} 170 167 168 + '@biomejs/biome@1.9.4': 169 + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} 170 + engines: {node: '>=14.21.3'} 171 + hasBin: true 172 + 173 + '@biomejs/cli-darwin-arm64@1.9.4': 174 + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} 175 + engines: {node: '>=14.21.3'} 176 + cpu: [arm64] 177 + os: [darwin] 178 + 179 + '@biomejs/cli-darwin-x64@1.9.4': 180 + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} 181 + engines: {node: '>=14.21.3'} 182 + cpu: [x64] 183 + os: [darwin] 184 + 185 + '@biomejs/cli-linux-arm64-musl@1.9.4': 186 + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} 187 + engines: {node: '>=14.21.3'} 188 + cpu: [arm64] 189 + os: [linux] 190 + 191 + '@biomejs/cli-linux-arm64@1.9.4': 192 + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} 193 + engines: {node: '>=14.21.3'} 194 + cpu: [arm64] 195 + os: [linux] 196 + 197 + '@biomejs/cli-linux-x64-musl@1.9.4': 198 + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} 199 + engines: {node: '>=14.21.3'} 200 + cpu: [x64] 201 + os: [linux] 202 + 203 + '@biomejs/cli-linux-x64@1.9.4': 204 + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} 205 + engines: {node: '>=14.21.3'} 206 + cpu: [x64] 207 + os: [linux] 208 + 209 + '@biomejs/cli-win32-arm64@1.9.4': 210 + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} 211 + engines: {node: '>=14.21.3'} 212 + cpu: [arm64] 213 + os: [win32] 214 + 215 + '@biomejs/cli-win32-x64@1.9.4': 216 + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} 217 + engines: {node: '>=14.21.3'} 218 + cpu: [x64] 219 + os: [win32] 220 + 171 221 '@changesets/apply-release-plan@6.1.4': 172 222 resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} 173 223 ··· 831 881 resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} 832 882 engines: {node: '>=10.13.0'} 833 883 834 - '@ts-morph/common@0.16.0': 835 - resolution: {integrity: sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==} 836 - 837 884 '@types/estree@1.0.6': 838 885 resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 839 886 ··· 857 904 858 905 '@types/semver@7.5.8': 859 906 resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 860 - 861 - '@types/strip-bom@3.0.0': 862 - resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} 863 - 864 - '@types/strip-json-comments@0.0.30': 865 - resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} 866 907 867 908 '@vitest/expect@1.6.0': 868 909 resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} ··· 1040 1081 resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 1041 1082 engines: {node: '>=0.8'} 1042 1083 1043 - code-block-writer@11.0.3: 1044 - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} 1045 - 1046 1084 color-convert@1.9.3: 1047 1085 resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1048 1086 ··· 1058 1096 1059 1097 colord@2.9.3: 1060 1098 resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} 1061 - 1062 - commander@2.20.3: 1063 - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1064 1099 1065 1100 commander@7.2.0: 1066 1101 resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} ··· 1225 1260 1226 1261 eastasianwidth@0.2.0: 1227 1262 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1228 - 1229 - editorconfig@0.15.3: 1230 - resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} 1231 - hasBin: true 1232 1263 1233 1264 electron-to-chromium@1.5.64: 1234 1265 resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==} ··· 1790 1821 resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} 1791 1822 engines: {node: '>= 8.0.0'} 1792 1823 1793 - mkdirp@1.0.4: 1794 - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1795 - engines: {node: '>=10'} 1796 - hasBin: true 1797 - 1798 1824 mkdist@1.6.0: 1799 1825 resolution: {integrity: sha512-nD7J/mx33Lwm4Q4qoPgRBVA9JQNKgyE7fLo5vdPWVDdjz96pXglGERp/fRnGPCTB37Kykfxs5bDdXa9BWOT9nw==} 1800 1826 hasBin: true ··· 1861 1887 resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1862 1888 engines: {node: '>=12'} 1863 1889 1864 - organize-imports-cli@0.10.0: 1865 - resolution: {integrity: sha512-cVyNEeiDxX/zA6gdK1QS2rr3TK1VymIkT0LagnAk4f6eE0IC0bo3BeUkMzm3q3GnCJzYC+6lfuMpBE0Cequ7Vg==} 1866 - hasBin: true 1867 - 1868 1890 os-tmpdir@1.0.2: 1869 1891 resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 1870 1892 engines: {node: '>=0.10.0'} ··· 1907 1929 parse-json@5.2.0: 1908 1930 resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1909 1931 engines: {node: '>=8'} 1910 - 1911 - path-browserify@1.0.1: 1912 - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1913 1932 1914 1933 path-exists@4.0.0: 1915 1934 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} ··· 2153 2172 engines: {node: '>=10.13.0'} 2154 2173 hasBin: true 2155 2174 2156 - prettier@3.0.2: 2157 - resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} 2158 - engines: {node: '>=14'} 2159 - hasBin: true 2160 - 2161 2175 pretty-bytes@6.1.1: 2162 2176 resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} 2163 2177 engines: {node: ^14.13.1 || >=16.0.0} ··· 2306 2320 siginfo@2.0.0: 2307 2321 resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2308 2322 2309 - sigmund@1.0.1: 2310 - resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} 2311 - 2312 2323 signal-exit@3.0.7: 2313 2324 resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2314 2325 ··· 2402 2413 resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2403 2414 engines: {node: '>=8'} 2404 2415 2405 - strip-json-comments@2.0.1: 2406 - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 2407 - engines: {node: '>=0.10.0'} 2408 - 2409 2416 strip-literal@2.1.0: 2410 2417 resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} 2411 2418 ··· 2463 2470 resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} 2464 2471 engines: {node: '>=8'} 2465 2472 2466 - ts-morph@15.1.0: 2467 - resolution: {integrity: sha512-RBsGE2sDzUXFTnv8Ba22QfeuKbgvAGJFuTN7HfmIRUkgT/NaVLfDM/8OFm2NlFkGlWEXdpW5OaFIp1jvqdDuOg==} 2468 - 2469 - tsconfig@7.0.0: 2470 - resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} 2471 - 2472 2473 tty-table@4.2.3: 2473 2474 resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} 2474 2475 engines: {node: '>=8.0.0'} ··· 2809 2810 '@babel/helper-string-parser': 7.25.9 2810 2811 '@babel/helper-validator-identifier': 7.25.9 2811 2812 2813 + '@biomejs/biome@1.9.4': 2814 + optionalDependencies: 2815 + '@biomejs/cli-darwin-arm64': 1.9.4 2816 + '@biomejs/cli-darwin-x64': 1.9.4 2817 + '@biomejs/cli-linux-arm64': 1.9.4 2818 + '@biomejs/cli-linux-arm64-musl': 1.9.4 2819 + '@biomejs/cli-linux-x64': 1.9.4 2820 + '@biomejs/cli-linux-x64-musl': 1.9.4 2821 + '@biomejs/cli-win32-arm64': 1.9.4 2822 + '@biomejs/cli-win32-x64': 1.9.4 2823 + 2824 + '@biomejs/cli-darwin-arm64@1.9.4': 2825 + optional: true 2826 + 2827 + '@biomejs/cli-darwin-x64@1.9.4': 2828 + optional: true 2829 + 2830 + '@biomejs/cli-linux-arm64-musl@1.9.4': 2831 + optional: true 2832 + 2833 + '@biomejs/cli-linux-arm64@1.9.4': 2834 + optional: true 2835 + 2836 + '@biomejs/cli-linux-x64-musl@1.9.4': 2837 + optional: true 2838 + 2839 + '@biomejs/cli-linux-x64@1.9.4': 2840 + optional: true 2841 + 2842 + '@biomejs/cli-win32-arm64@1.9.4': 2843 + optional: true 2844 + 2845 + '@biomejs/cli-win32-x64@1.9.4': 2846 + optional: true 2847 + 2812 2848 '@changesets/apply-release-plan@6.1.4': 2813 2849 dependencies: 2814 2850 '@babel/runtime': 7.26.0 ··· 3218 3254 fastq: 1.17.1 3219 3255 3220 3256 '@rollup/plugin-alias@5.1.1(rollup@3.29.5)': 3221 - dependencies: 3257 + optionalDependencies: 3222 3258 rollup: 3.29.5 3223 3259 3224 3260 '@rollup/plugin-commonjs@25.0.8(rollup@3.29.5)': ··· 3229 3265 glob: 8.1.0 3230 3266 is-reference: 1.2.1 3231 3267 magic-string: 0.30.13 3268 + optionalDependencies: 3232 3269 rollup: 3.29.5 3233 3270 3234 3271 '@rollup/plugin-json@6.1.0(rollup@3.29.5)': 3235 3272 dependencies: 3236 3273 '@rollup/pluginutils': 5.1.3(rollup@3.29.5) 3274 + optionalDependencies: 3237 3275 rollup: 3.29.5 3238 3276 3239 3277 '@rollup/plugin-node-resolve@15.3.0(rollup@3.29.5)': ··· 3243 3281 deepmerge: 4.3.1 3244 3282 is-module: 1.0.0 3245 3283 resolve: 1.22.8 3284 + optionalDependencies: 3246 3285 rollup: 3.29.5 3247 3286 3248 3287 '@rollup/plugin-replace@5.0.7(rollup@3.29.5)': 3249 3288 dependencies: 3250 3289 '@rollup/pluginutils': 5.1.3(rollup@3.29.5) 3251 3290 magic-string: 0.30.13 3291 + optionalDependencies: 3252 3292 rollup: 3.29.5 3253 3293 3254 3294 '@rollup/pluginutils@5.1.3(rollup@3.29.5)': ··· 3256 3296 '@types/estree': 1.0.6 3257 3297 estree-walker: 2.0.2 3258 3298 picomatch: 4.0.2 3299 + optionalDependencies: 3259 3300 rollup: 3.29.5 3260 3301 3261 3302 '@rollup/rollup-android-arm-eabi@4.27.3': ··· 3316 3357 3317 3358 '@trysound/sax@0.2.0': {} 3318 3359 3319 - '@ts-morph/common@0.16.0': 3320 - dependencies: 3321 - fast-glob: 3.3.2 3322 - minimatch: 5.1.6 3323 - mkdirp: 1.0.4 3324 - path-browserify: 1.0.1 3325 - 3326 3360 '@types/estree@1.0.6': {} 3327 3361 3328 3362 '@types/is-ci@3.0.4': ··· 3341 3375 3342 3376 '@types/semver@7.5.8': {} 3343 3377 3344 - '@types/strip-bom@3.0.0': {} 3345 - 3346 - '@types/strip-json-comments@0.0.30': {} 3347 - 3348 3378 '@vitest/expect@1.6.0': 3349 3379 dependencies: 3350 3380 '@vitest/spy': 1.6.0 ··· 3547 3577 wrap-ansi: 7.0.0 3548 3578 3549 3579 clone@1.0.4: {} 3550 - 3551 - code-block-writer@11.0.3: {} 3552 3580 3553 3581 color-convert@1.9.3: 3554 3582 dependencies: ··· 3564 3592 3565 3593 colord@2.9.3: {} 3566 3594 3567 - commander@2.20.3: {} 3568 - 3569 3595 commander@7.2.0: {} 3570 3596 3571 3597 commondir@1.0.1: {} ··· 3756 3782 3757 3783 eastasianwidth@0.2.0: {} 3758 3784 3759 - editorconfig@0.15.3: 3760 - dependencies: 3761 - commander: 2.20.3 3762 - lru-cache: 4.1.5 3763 - semver: 5.7.2 3764 - sigmund: 1.0.1 3765 - 3766 3785 electron-to-chromium@1.5.64: {} 3767 3786 3768 3787 emoji-regex@8.0.0: {} ··· 3979 3998 reusify: 1.0.4 3980 3999 3981 4000 fdir@6.4.2(picomatch@4.0.2): 3982 - dependencies: 4001 + optionalDependencies: 3983 4002 picomatch: 4.0.2 3984 4003 3985 4004 fill-range@7.1.1: ··· 4397 4416 4398 4417 mixme@0.5.10: {} 4399 4418 4400 - mkdirp@1.0.4: {} 4401 - 4402 4419 mkdist@1.6.0(typescript@5.2.2): 4403 4420 dependencies: 4404 4421 autoprefixer: 10.4.20(postcss@8.4.49) ··· 4414 4431 postcss-nested: 6.2.0(postcss@8.4.49) 4415 4432 semver: 7.6.3 4416 4433 tinyglobby: 0.2.10 4434 + optionalDependencies: 4417 4435 typescript: 5.2.2 4418 4436 4419 4437 mlly@1.7.3: ··· 4467 4485 dependencies: 4468 4486 mimic-fn: 4.0.0 4469 4487 4470 - organize-imports-cli@0.10.0: 4471 - dependencies: 4472 - chalk: 4.1.2 4473 - editorconfig: 0.15.3 4474 - ts-morph: 15.1.0 4475 - tsconfig: 7.0.0 4476 - 4477 4488 os-tmpdir@1.0.2: {} 4478 4489 4479 4490 outdent@0.5.0: {} ··· 4512 4523 error-ex: 1.3.2 4513 4524 json-parse-even-better-errors: 2.3.1 4514 4525 lines-and-columns: 1.2.4 4515 - 4516 - path-browserify@1.0.1: {} 4517 4526 4518 4527 path-exists@4.0.0: {} 4519 4528 ··· 4727 4736 4728 4737 prettier@2.8.8: {} 4729 4738 4730 - prettier@3.0.2: {} 4731 - 4732 4739 pretty-bytes@6.1.1: {} 4733 4740 4734 4741 pretty-format@29.7.0: ··· 4905 4912 4906 4913 siginfo@2.0.0: {} 4907 4914 4908 - sigmund@1.0.1: {} 4909 - 4910 4915 signal-exit@3.0.7: {} 4911 4916 4912 4917 signal-exit@4.1.0: {} ··· 5004 5009 dependencies: 5005 5010 min-indent: 1.0.1 5006 5011 5007 - strip-json-comments@2.0.1: {} 5008 - 5009 5012 strip-literal@2.1.0: 5010 5013 dependencies: 5011 5014 js-tokens: 9.0.0 ··· 5059 5062 5060 5063 trim-newlines@3.0.1: {} 5061 5064 5062 - ts-morph@15.1.0: 5063 - dependencies: 5064 - '@ts-morph/common': 0.16.0 5065 - code-block-writer: 11.0.3 5066 - 5067 - tsconfig@7.0.0: 5068 - dependencies: 5069 - '@types/strip-bom': 3.0.0 5070 - '@types/strip-json-comments': 0.0.30 5071 - strip-bom: 3.0.0 5072 - strip-json-comments: 2.0.1 5073 - 5074 5065 tty-table@4.2.3: 5075 5066 dependencies: 5076 5067 chalk: 4.1.2 ··· 5158 5149 rollup: 3.29.5 5159 5150 rollup-plugin-dts: 6.1.1(rollup@3.29.5)(typescript@5.2.2) 5160 5151 scule: 1.3.0 5152 + untyped: 1.5.1 5153 + optionalDependencies: 5161 5154 typescript: 5.2.2 5162 - untyped: 1.5.1 5163 5155 transitivePeerDependencies: 5164 5156 - sass 5165 5157 - supports-color ··· 5212 5204 5213 5205 vite@5.4.11(@types/node@18.16.0): 5214 5206 dependencies: 5215 - '@types/node': 18.16.0 5216 5207 esbuild: 0.21.5 5217 5208 postcss: 8.4.49 5218 5209 rollup: 4.27.3 5219 5210 optionalDependencies: 5211 + '@types/node': 18.16.0 5220 5212 fsevents: 2.3.3 5221 5213 5222 5214 vitest@1.6.0(@types/node@18.16.0): 5223 5215 dependencies: 5224 - '@types/node': 18.16.0 5225 5216 '@vitest/expect': 1.6.0 5226 5217 '@vitest/runner': 1.6.0 5227 5218 '@vitest/snapshot': 1.6.0 ··· 5242 5233 vite: 5.4.11(@types/node@18.16.0) 5243 5234 vite-node: 1.6.0(@types/node@18.16.0) 5244 5235 why-is-node-running: 2.3.0 5236 + optionalDependencies: 5237 + '@types/node': 18.16.0 5245 5238 transitivePeerDependencies: 5246 5239 - less 5247 5240 - lightningcss