diff --git a/packages/args/src/Checker.ts b/packages/args/src/Checker.ts index 5b928b5c7..cf2a2566c 100644 --- a/packages/args/src/Checker.ts +++ b/packages/args/src/Checker.ts @@ -1,4 +1,5 @@ import levenary from 'levenary'; +import { interopDefault } from '@boost/internal'; import { ArgsError, ArgsErrorCode } from './ArgsError'; import { COMMAND_FORMAT } from './constants'; import { ParseError } from './ParseError'; @@ -44,7 +45,10 @@ export class Checker { // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents checkUnknownOption(option: LongOptionName | ShortOptionName) { - const guess = levenary(option, Object.keys(this.options)); + const guess = interopDefault(levenary)( + option, + Object.keys(this.options), + ); if (guess) { this.logFailureError('OPTION_UNKNOWN_MORE', [option, guess]); diff --git a/packages/cli/examples/commands/SelectCommand.mjs b/packages/cli/examples/commands/SelectCommand.mjs index 60deb1da2..41c1fed3b 100644 --- a/packages/cli/examples/commands/SelectCommand.mjs +++ b/packages/cli/examples/commands/SelectCommand.mjs @@ -24,7 +24,7 @@ export default class SelectCommand extends Command { }, limit: { type: 'number', - default: 0, + default: 10, description: 'Limit the number of options displayed', }, scroll: { diff --git a/packages/cli/src/Program.ts b/packages/cli/src/Program.ts index 0079af373..da9e770bd 100644 --- a/packages/cli/src/Program.ts +++ b/packages/cli/src/Program.ts @@ -12,7 +12,7 @@ import { import { ExitError } from '@boost/common'; import { Blueprint, Schemas } from '@boost/common/optimal'; import { Event } from '@boost/event'; -import { env } from '@boost/internal'; +import { env, interopDefault } from '@boost/internal'; import { createLogger, formats, LoggerFunction, StreamTransport } from '@boost/log'; import { CLIError } from './CLIError'; import { Command } from './Command'; @@ -253,7 +253,10 @@ export class Program extends CommandManager { this.onCommandNotFound.emit([argv, possibleCmd]); if (possibleCmd) { - const closestCmd = levenary(possibleCmd, this.getCommandPaths()); + const closestCmd = interopDefault(levenary)( + possibleCmd, + this.getCommandPaths(), + ); throw new CLIError('COMMAND_UNKNOWN', [possibleCmd, closestCmd]); } diff --git a/packages/cli/src/components/Select.tsx b/packages/cli/src/components/Select.tsx index 94f81ef06..b1dce0a4c 100644 --- a/packages/cli/src/components/Select.tsx +++ b/packages/cli/src/components/Select.tsx @@ -95,14 +95,16 @@ export function Select(props: SelectProps) { }, [selectedValue, onSubmit, options, highlightedIndex]); const renderItem = useCallback( - (option: SelectOption) => { + (option: SelectOption, index: number) => { + const key = `${option.index}-${index}`; + if (option.divider) { - return ; + return ; } return ( extends ScrollableListProps { currentIndex: number; items: T[]; - renderItem: (item: T) => ReactElement; + renderItem: (item: T, index: number) => ReactElement; rowHeight?: number; } @@ -186,7 +186,7 @@ export function ScrollableList({ )} - {list.map((item) => renderItem(item))} + {list.map((item, index) => renderItem(item, index))} {trailingCount > 0 && isOverflow && ( diff --git a/packages/internal/src/env.ts b/packages/internal/src/env.ts index 339d14c69..c44080713 100644 --- a/packages/internal/src/env.ts +++ b/packages/internal/src/env.ts @@ -2,11 +2,11 @@ let envVars: Record = {}; if (global.process !== undefined) { envVars = process.env; +} else if ('window' in global && global.window !== undefined) { + // @ts-expect-error Allow type mismatch + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + envVars = window; } -// } else if (global.document !== undefined) { -// // @ts-expect-error Allow type mismatch -// envVars = window; -// } export function env(key: string, value?: T | null): T | undefined { const name = `BOOSTJS_${key}`; diff --git a/packages/internal/src/index.ts b/packages/internal/src/index.ts index 32f63058c..eac6e5776 100644 --- a/packages/internal/src/index.ts +++ b/packages/internal/src/index.ts @@ -7,3 +7,4 @@ export * from './color'; export * from './createInternalDebugger'; export * from './createScopedError'; export * from './env'; +export * from './interopDefault'; diff --git a/packages/internal/src/interopDefault.ts b/packages/internal/src/interopDefault.ts new file mode 100644 index 000000000..17c010f5f --- /dev/null +++ b/packages/internal/src/interopDefault.ts @@ -0,0 +1,11 @@ +/** + * For compatibility with ES modules, this function is used to extract the + * default export from an incompatible module. + */ +export function interopDefault(result: unknown): R { + if (result && typeof result === 'object' && 'default' in result) { + return result.default as R; + } + + return result as R; +} diff --git a/tests/setup.ts b/tests/setup.ts index 896a7e9d6..1e88a542a 100644 --- a/tests/setup.ts +++ b/tests/setup.ts @@ -26,7 +26,7 @@ expect.extend({ }, }); -global.delay = function delay(time: number = 100) { +global.delay = function delay(time: number = 250) { return new Promise((resolve) => { setTimeout(resolve, time); });