diff --git a/.changeset/modern-ink-ui.md b/.changeset/modern-ink-ui.md new file mode 100644 index 0000000..a1f5561 --- /dev/null +++ b/.changeset/modern-ink-ui.md @@ -0,0 +1,5 @@ +--- +"trello-cli": major +--- + +Upgrade the interactive terminal UI to Ink 8 and React 19.3. Node.js 22 or newer is now required. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cdb9ded..9680705 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x, 22.x, 24.x] + node-version: [22.x, 24.x] env: CI: true diff --git a/jest.config.js b/jest.config.js index 0c97bac..8d7358d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,6 +2,6 @@ const base = require("./jest.config.base.js"); module.exports = { ...base, - projects: ["/packages/*/jest.config.js"], + projects: ["/packages/*/jest.config.js", "/packages/trello-cli/jest.tui.config.js"], coverageDirectory: "/coverage/", }; diff --git a/package.json b/package.json index 7c68352..000ab70 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@changesets/cli": "^3.0.2", "@types/jest": "^30.0.0", "@types/node": "^26.4.1", - "ink-testing-library": "2.1.0", + "ink-testing-library": "4.0.0", "jest": "^30.5.1", "jest-when": "^4.0.3", "ts-jest": "^29.4.12", diff --git a/packages/trello-cli/README.md b/packages/trello-cli/README.md index 78be54f..5d7f203 100644 --- a/packages/trello-cli/README.md +++ b/packages/trello-cli/README.md @@ -2,7 +2,7 @@ ## Installation -> Trello CLI requires node 18+ +> Trello CLI requires node 22+ ```bash npm install -g trello-cli diff --git a/packages/trello-cli/bin/dev b/packages/trello-cli/bin/dev index 4e81a9e..c4eeef3 100755 --- a/packages/trello-cli/bin/dev +++ b/packages/trello-cli/bin/dev @@ -9,6 +9,9 @@ const project = path.join(__dirname, '..', 'tsconfig.json') process.env.NODE_ENV = 'development' require('ts-node').register({project}) +// The interactive UI uses ESM, including Ink's asynchronous module graph. +process.env.TS_NODE_PROJECT = project +require('node:module').register('ts-node/esm', require('node:url').pathToFileURL(__filename)) // Start the CLI execute({ development: true, dir: __dirname }) diff --git a/packages/trello-cli/jest.config.js b/packages/trello-cli/jest.config.js index fddfa1e..6acd898 100644 --- a/packages/trello-cli/jest.config.js +++ b/packages/trello-cli/jest.config.js @@ -3,6 +3,7 @@ const base = require("../../jest.config.base.js"); module.exports = { ...base, roots: ["/test"], + testPathIgnorePatterns: ["/test/tui/"], displayName: "trello-cli", setupFilesAfterEnv: ["./test/setup.js"], }; diff --git a/packages/trello-cli/jest.tui.config.js b/packages/trello-cli/jest.tui.config.js new file mode 100644 index 0000000..fe36201 --- /dev/null +++ b/packages/trello-cli/jest.tui.config.js @@ -0,0 +1,22 @@ +const base = require("../../jest.config.base.js"); + +module.exports = { + ...base, + roots: ["/test/tui"], + displayName: "trello-cli-tui", + extensionsToTreatAsEsm: [".ts", ".tsx"], + transform: { + "^.+\\.tsx?$": ["ts-jest", { + useESM: true, + tsconfig: { + module: "ESNext", + moduleResolution: "bundler", + isolatedModules: true, + }, + }], + }, + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, + setupFilesAfterEnv: ["./test/setup-tui.ts"], +}; diff --git a/packages/trello-cli/package.json b/packages/trello-cli/package.json index b78868a..657a128 100644 --- a/packages/trello-cli/package.json +++ b/packages/trello-cli/package.json @@ -28,12 +28,12 @@ "@trello-cli/config": "workspace:*", "chai": "^6.2.2", "chrono-node": "^2.10.1", - "ink": "3.2.0", - "ink-select-input": "4.2.2", - "ink-spinner": "4.0.3", - "ink-text-input": "4.0.3", + "ink": "8.0.0", + "ink-select-input": "6.2.0", + "ink-spinner": "5.0.0", + "ink-text-input": "6.0.0", "json2csv": "6.0.0-alpha.2", - "react": "17.0.2", + "react": "19.3.1", "trello.js": "^1.2.8" }, "devDependencies": { @@ -42,9 +42,9 @@ "@types/jest": "^30.0.0", "@types/json2csv": "^5.0.7", "@types/node": "^26.4.1", - "@types/react": "17.0.91", + "@types/react": "19.3.0", "eslint": "^9.39.5", - "ink-testing-library": "2.1.0", + "ink-testing-library": "4.0.0", "oclif": "^4.24.0", "shx": "^0.4.0", "ts-node": "^10.9.2", @@ -65,16 +65,16 @@ "topics": {} }, "scripts": { - "build": "shx rm -rf dist && tsc -b", - "dev": "tsc -b --watch", + "build": "shx rm -rf dist && tsc -b && shx cp src/tui/package.json dist/tui/package.json", + "dev": "shx mkdir -p dist/tui && shx cp src/tui/package.json dist/tui/package.json && tsc -b --watch", "lint": "eslint src test", "posttest": "pnpm lint", "prepack": "pnpm build && oclif manifest && oclif readme", - "test": "jest --runInBand", + "test": "jest --runInBand --config jest.config.js && node --experimental-vm-modules ../../node_modules/jest/bin/jest.js --runInBand --config jest.tui.config.js", "version": "oclif readme && git add README.md" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "bugs": "https://github.com/mheap/trello-cli/issues", "keywords": [ diff --git a/packages/trello-cli/src/commands/interactive.tsx b/packages/trello-cli/src/commands/interactive.tsx index 4a51921..8fb581c 100644 --- a/packages/trello-cli/src/commands/interactive.tsx +++ b/packages/trello-cli/src/commands/interactive.tsx @@ -4,10 +4,7 @@ import Cache from "@trello-cli/cache"; import * as path from "path"; import { TrelloClient } from "trello.js"; import { sendParamsInBody } from "../paramsInBody"; -import { render } from "ink"; import React from "react"; -import { App } from "../tui/App"; -import { loadTuiConfig } from "../tui/config"; export default class Interactive extends Command { static description = "Launch interactive terminal UI for Trello"; @@ -76,6 +73,11 @@ export default class Interactive extends Command { await cache.bootstrap(); // Load TUI config + const [{ render }, { App }, { loadTuiConfig }] = await Promise.all([ + import("ink"), + import("../tui/App.js"), + import("../tui/config.js"), + ]); const tuiConfig = loadTuiConfig(configDir); // Apply mouse flag override diff --git a/packages/trello-cli/src/declarations.d.ts b/packages/trello-cli/src/declarations.d.ts deleted file mode 100644 index 5e5faeb..0000000 --- a/packages/trello-cli/src/declarations.d.ts +++ /dev/null @@ -1,260 +0,0 @@ -// Ambient declarations for ESM-only ink packages. -// These packages use the `exports` field in package.json for type resolution, -// which requires moduleResolution "node16" or "bundler". Since this project -// uses the default "node" resolution, we provide ambient declarations here. - -declare module "ink" { - import type { FC, ReactNode } from "react"; - - export interface RenderOptions { - stdout?: NodeJS.WriteStream; - stderr?: NodeJS.WriteStream; - stdin?: NodeJS.ReadStream; - debug?: boolean; - exitOnCtrlC?: boolean; - patchConsole?: boolean; - } - - export interface Instance { - rerender: (tree: ReactNode) => void; - unmount: () => void; - waitUntilExit: () => Promise; - cleanup: () => void; - clear: () => void; - } - - export function render(tree: ReactNode, options?: RenderOptions): Instance; - - export interface BoxProps { - flexDirection?: "row" | "column" | "row-reverse" | "column-reverse"; - flexGrow?: number; - flexShrink?: number; - flexBasis?: number | string; - flexWrap?: "nowrap" | "wrap" | "wrap-reverse"; - alignItems?: "flex-start" | "center" | "flex-end" | "stretch"; - alignSelf?: "auto" | "flex-start" | "center" | "flex-end" | "stretch"; - justifyContent?: "flex-start" | "center" | "flex-end" | "space-between" | "space-around" | "space-evenly"; - width?: number | string; - height?: number | string; - minWidth?: number | string; - minHeight?: number | string; - padding?: number; - paddingX?: number; - paddingY?: number; - paddingTop?: number; - paddingBottom?: number; - paddingLeft?: number; - paddingRight?: number; - margin?: number; - marginX?: number; - marginY?: number; - marginTop?: number; - marginBottom?: number; - marginLeft?: number; - marginRight?: number; - gap?: number; - columnGap?: number; - rowGap?: number; - borderStyle?: "single" | "double" | "round" | "bold" | "singleDouble" | "doubleSingle" | "classic"; - borderColor?: string; - borderTop?: boolean; - borderBottom?: boolean; - borderLeft?: boolean; - borderRight?: boolean; - borderDimColor?: boolean; - display?: "flex" | "none"; - overflow?: "visible" | "hidden"; - overflowX?: "visible" | "hidden"; - overflowY?: "visible" | "hidden"; - children?: ReactNode; - } - - export const Box: FC; - - export interface TextProps { - color?: string; - backgroundColor?: string; - dimColor?: boolean; - bold?: boolean; - italic?: boolean; - underline?: boolean; - strikethrough?: boolean; - inverse?: boolean; - wrap?: "wrap" | "truncate" | "truncate-start" | "truncate-middle" | "truncate-end"; - children?: ReactNode; - } - - export const Text: FC; - - export interface Key { - upArrow: boolean; - downArrow: boolean; - leftArrow: boolean; - rightArrow: boolean; - pageDown: boolean; - pageUp: boolean; - return: boolean; - escape: boolean; - ctrl: boolean; - shift: boolean; - tab: boolean; - backspace: boolean; - delete: boolean; - meta: boolean; - } - - export function useInput( - inputHandler: (input: string, key: Key) => void, - options?: { isActive?: boolean } - ): void; - - export function useApp(): { exit: (error?: Error) => void }; - - export function useStdout(): { stdout: NodeJS.WriteStream | undefined; write: (data: string) => void }; - export function useStderr(): { stderr: NodeJS.WriteStream | undefined; write: (data: string) => void }; - export function useStdin(): { - stdin: NodeJS.ReadStream | undefined; - isRawModeSupported: boolean; - setRawMode: (value: boolean) => void; - }; - - export function useFocus(options?: { autoFocus?: boolean; isActive?: boolean; id?: string }): { isFocused: boolean }; - export function useFocusManager(): { focusNext: () => void; focusPrevious: () => void; enableFocus: () => void; disableFocus: () => void; focus: (id: string) => void }; - - export interface NewlineProps { - count?: number; - } - export const Newline: FC; - - export const Spacer: FC; - - export interface StaticProps { - items: T[]; - children: (item: T, index: number) => ReactNode; - style?: BoxProps; - } - export function Static(props: StaticProps): JSX.Element; - - export interface TransformProps { - transform: (children: string) => string; - children?: ReactNode; - } - export const Transform: FC; -} - -declare module "ink-text-input" { - import type { FC } from "react"; - - interface TextInputProps { - value: string; - onChange: (value: string) => void; - onSubmit?: (value: string) => void; - placeholder?: string; - focus?: boolean; - mask?: string; - highlightPastedText?: boolean; - showCursor?: boolean; - } - - const TextInput: FC; - export default TextInput; -} - -declare module "ink-spinner" { - import type { FC } from "react"; - - interface SpinnerProps { - type?: - | "dots" - | "dots2" - | "dots3" - | "dots4" - | "dots5" - | "dots6" - | "dots7" - | "dots8" - | "dots9" - | "dots10" - | "dots11" - | "dots12" - | "line" - | "line2" - | "pipe" - | "simpleDots" - | "simpleDotsScrolling" - | "star" - | "star2" - | "flip" - | "hamburger" - | "growVertical" - | "growHorizontal" - | "balloon" - | "balloon2" - | "noise" - | "bounce" - | "boxBounce" - | "boxBounce2" - | "triangle" - | "arc" - | "circle" - | "squareCorners" - | "circleQuarters" - | "circleHalves" - | "squish" - | "toggle" - | "toggle2" - | "toggle3" - | "toggle4" - | "toggle5" - | "toggle6" - | "toggle7" - | "toggle8" - | "toggle9" - | "toggle10" - | "toggle11" - | "toggle12" - | "toggle13" - | "arrow" - | "arrow2" - | "arrow3" - | "bouncingBar" - | "bouncingBall" - | "smiley" - | "monkey" - | "hearts" - | "clock" - | "earth" - | "moon" - | "runner" - | "pong" - | "shark" - | "dqpb"; - } - - const Spinner: FC; - export default Spinner; -} - -declare module "ink-select-input" { - import type { FC } from "react"; - - interface Item { - label: string; - value: V; - key?: string; - } - - interface SelectInputProps { - items: Item[]; - onSelect?: (item: Item) => void; - onHighlight?: (item: Item) => void; - indicatorComponent?: FC<{ isSelected: boolean }>; - itemComponent?: FC<{ isSelected: boolean; label: string }>; - initialIndex?: number; - limit?: number; - isFocused?: boolean; - } - - function SelectInput(props: SelectInputProps): JSX.Element; - export default SelectInput; -} diff --git a/packages/trello-cli/src/tui/App.tsx b/packages/trello-cli/src/tui/App.tsx index 483e1ae..ab3ab99 100644 --- a/packages/trello-cli/src/tui/App.tsx +++ b/packages/trello-cli/src/tui/App.tsx @@ -1,22 +1,22 @@ import React from "react"; import { Box } from "ink"; import { TrelloClient } from "trello.js"; -import Cache from "@trello-cli/cache"; -import { TrelloProvider } from "./state/TrelloContext"; -import { NavigationProvider, useNavigation } from "./state/NavigationContext"; -import { Header } from "./components/Header"; -import { Footer } from "./components/Footer"; -import { HomeView } from "./views/HomeView"; -import { BoardView } from "./views/BoardView"; -import { CardDetailView } from "./views/CardDetailView"; -import { MyCardsView } from "./views/MyCardsView"; -import { usePeriodicSync } from "./hooks/usePeriodicSync"; -import { useTerminalSize } from "./hooks/useTerminalSize"; -import { TuiConfig } from "./types"; +import type CacheModule from "@trello-cli/cache"; +import { TrelloProvider } from "./state/TrelloContext.js"; +import { NavigationProvider, useNavigation } from "./state/NavigationContext.js"; +import { Header } from "./components/Header.js"; +import { Footer } from "./components/Footer.js"; +import { HomeView } from "./views/HomeView.js"; +import { BoardView } from "./views/BoardView.js"; +import { CardDetailView } from "./views/CardDetailView.js"; +import { MyCardsView } from "./views/MyCardsView.js"; +import { usePeriodicSync } from "./hooks/usePeriodicSync.js"; +import { useTerminalSize } from "./hooks/useTerminalSize.js"; +import { TuiConfig } from "./types.js"; interface AppProps { client: TrelloClient; - cache: Cache; + cache: InstanceType; config: TuiConfig; } diff --git a/packages/trello-cli/src/tui/components/Card.tsx b/packages/trello-cli/src/tui/components/Card.tsx index d8fd7d6..5f9b9bf 100644 --- a/packages/trello-cli/src/tui/components/Card.tsx +++ b/packages/trello-cli/src/tui/components/Card.tsx @@ -1,7 +1,7 @@ import React from "react"; import { Box, Text } from "ink"; -import { TrelloCard } from "../types"; -import { useNavigation } from "../state/NavigationContext"; +import { TrelloCard } from "../types.js"; +import { useNavigation } from "../state/NavigationContext.js"; interface CardProps { card: TrelloCard; diff --git a/packages/trello-cli/src/tui/components/ConfirmDialog.tsx b/packages/trello-cli/src/tui/components/ConfirmDialog.tsx index 189c399..25e02b2 100644 --- a/packages/trello-cli/src/tui/components/ConfirmDialog.tsx +++ b/packages/trello-cli/src/tui/components/ConfirmDialog.tsx @@ -1,6 +1,6 @@ import React from "react"; import { Box, Text, useInput } from "ink"; -import { useNavigation } from "../state/NavigationContext"; +import { useNavigation } from "../state/NavigationContext.js"; interface ConfirmDialogProps { message: string; diff --git a/packages/trello-cli/src/tui/components/Footer.tsx b/packages/trello-cli/src/tui/components/Footer.tsx index 8f7afae..ab438cf 100644 --- a/packages/trello-cli/src/tui/components/Footer.tsx +++ b/packages/trello-cli/src/tui/components/Footer.tsx @@ -1,6 +1,6 @@ import React from "react"; import { Box, Text } from "ink"; -import { useNavigation } from "../state/NavigationContext"; +import { useNavigation } from "../state/NavigationContext.js"; interface Shortcut { key: string; diff --git a/packages/trello-cli/src/tui/components/Header.tsx b/packages/trello-cli/src/tui/components/Header.tsx index 30c79ab..264a646 100644 --- a/packages/trello-cli/src/tui/components/Header.tsx +++ b/packages/trello-cli/src/tui/components/Header.tsx @@ -1,7 +1,7 @@ import React from "react"; import { Box, Text } from "ink"; -import { useNavigation } from "../state/NavigationContext"; -import { useTrello } from "../state/TrelloContext"; +import { useNavigation } from "../state/NavigationContext.js"; +import { useTrello } from "../state/TrelloContext.js"; export function Header() { const { state: navState, config } = useNavigation(); diff --git a/packages/trello-cli/src/tui/components/HelpScreen.tsx b/packages/trello-cli/src/tui/components/HelpScreen.tsx index 1ef66ab..227654a 100644 --- a/packages/trello-cli/src/tui/components/HelpScreen.tsx +++ b/packages/trello-cli/src/tui/components/HelpScreen.tsx @@ -1,6 +1,6 @@ import React from "react"; import { Box, Text, useInput } from "ink"; -import { useNavigation } from "../state/NavigationContext"; +import { useNavigation } from "../state/NavigationContext.js"; const ALL_SHORTCUTS = [ { section: "Navigation", items: [ diff --git a/packages/trello-cli/src/tui/components/ListColumn.tsx b/packages/trello-cli/src/tui/components/ListColumn.tsx index 92beca4..f620d73 100644 --- a/packages/trello-cli/src/tui/components/ListColumn.tsx +++ b/packages/trello-cli/src/tui/components/ListColumn.tsx @@ -1,8 +1,8 @@ import React from "react"; import { Box, Text } from "ink"; -import { TrelloList, TrelloCard } from "../types"; -import { Card } from "./Card"; -import { useNavigation } from "../state/NavigationContext"; +import { TrelloList, TrelloCard } from "../types.js"; +import { Card } from "./Card.js"; +import { useNavigation } from "../state/NavigationContext.js"; interface ListColumnProps { list: TrelloList; diff --git a/packages/trello-cli/src/tui/config.ts b/packages/trello-cli/src/tui/config.ts index d06805e..59bf117 100644 --- a/packages/trello-cli/src/tui/config.ts +++ b/packages/trello-cli/src/tui/config.ts @@ -1,6 +1,6 @@ import * as fs from "fs"; import * as path from "path"; -import { TuiConfig, DEFAULT_TUI_CONFIG } from "./types"; +import { TuiConfig, DEFAULT_TUI_CONFIG } from "./types.js"; export function loadTuiConfig(configDir: string): TuiConfig { const configPath = path.join(configDir, "tui.json"); diff --git a/packages/trello-cli/src/tui/hooks/usePeriodicSync.ts b/packages/trello-cli/src/tui/hooks/usePeriodicSync.ts index 7e8c492..8f66540 100644 --- a/packages/trello-cli/src/tui/hooks/usePeriodicSync.ts +++ b/packages/trello-cli/src/tui/hooks/usePeriodicSync.ts @@ -1,5 +1,5 @@ import { useEffect, useRef } from "react"; -import { useTrello } from "../state/TrelloContext"; +import { useTrello } from "../state/TrelloContext.js"; export function usePeriodicSync(intervalMs: number) { const { syncCache, state } = useTrello(); diff --git a/packages/trello-cli/src/tui/hooks/useTerminalSize.ts b/packages/trello-cli/src/tui/hooks/useTerminalSize.ts index f2f9e0c..9f3a238 100644 --- a/packages/trello-cli/src/tui/hooks/useTerminalSize.ts +++ b/packages/trello-cli/src/tui/hooks/useTerminalSize.ts @@ -7,7 +7,8 @@ interface TerminalSize { } export function useTerminalSize(): TerminalSize { - const { stdout } = useStdout(); + const { stdout: stream } = useStdout(); + const stdout = stream as NodeJS.WriteStream; const [size, setSize] = useState({ columns: stdout?.columns || 80, diff --git a/packages/trello-cli/src/tui/package.json b/packages/trello-cli/src/tui/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/packages/trello-cli/src/tui/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/packages/trello-cli/src/tui/state/NavigationContext.tsx b/packages/trello-cli/src/tui/state/NavigationContext.tsx index 9d2f866..ba130e9 100644 --- a/packages/trello-cli/src/tui/state/NavigationContext.tsx +++ b/packages/trello-cli/src/tui/state/NavigationContext.tsx @@ -1,5 +1,5 @@ import React, { createContext, useContext, useReducer } from "react"; -import { View, InputMode, TuiConfig, DEFAULT_TUI_CONFIG } from "../types"; +import { View, InputMode, TuiConfig, DEFAULT_TUI_CONFIG } from "../types.js"; interface NavigationState { view: View; diff --git a/packages/trello-cli/src/tui/state/TrelloContext.tsx b/packages/trello-cli/src/tui/state/TrelloContext.tsx index fe1dc17..c9820de 100644 --- a/packages/trello-cli/src/tui/state/TrelloContext.tsx +++ b/packages/trello-cli/src/tui/state/TrelloContext.tsx @@ -1,13 +1,15 @@ import React, { createContext, useContext, useReducer, useCallback } from "react"; import { TrelloClient } from "trello.js"; -import Cache from "@trello-cli/cache"; +import type CacheModule from "@trello-cli/cache"; import { TrelloBoard, TrelloList, TrelloCard, TrelloLabel, TrelloMember, -} from "../types"; +} from "../types.js"; + +type TrelloCache = InstanceType; // Helper to normalize any API card response into our TrelloCard type function toTrelloCard(c: any): TrelloCard { @@ -158,7 +160,7 @@ interface TrelloContextType { state: TrelloState; dispatch: React.Dispatch; client: TrelloClient; - cache: Cache; + cache: TrelloCache; loadBoards: () => Promise; loadBoard: (board: TrelloBoard) => Promise; createCard: (listId: string, name: string, opts?: { desc?: string; due?: string; position?: "top" | "bottom" }) => Promise; @@ -192,7 +194,7 @@ export function TrelloProvider({ }: { children: React.ReactNode; client: TrelloClient; - cache: Cache; + cache: TrelloCache; }) { const [state, dispatch] = useReducer(trelloReducer, initialState); diff --git a/packages/trello-cli/src/tui/views/BoardView.tsx b/packages/trello-cli/src/tui/views/BoardView.tsx index ec0e2ff..a4fb89c 100644 --- a/packages/trello-cli/src/tui/views/BoardView.tsx +++ b/packages/trello-cli/src/tui/views/BoardView.tsx @@ -3,13 +3,13 @@ import { exec } from "child_process"; import * as chrono from "chrono-node"; import { Box, Text, useInput, useApp, Key } from "ink"; import TextInput from "ink-text-input"; -import { useTrello } from "../state/TrelloContext"; -import { useNavigation } from "../state/NavigationContext"; -import { ListColumn } from "../components/ListColumn"; -import { ConfirmDialog } from "../components/ConfirmDialog"; -import { HelpScreen } from "../components/HelpScreen"; -import { MultiLineInput } from "../components/MultiLineInput"; -import { useTerminalSize, getListColumns, getListWidth } from "../hooks/useTerminalSize"; +import { useTrello } from "../state/TrelloContext.js"; +import { useNavigation } from "../state/NavigationContext.js"; +import { ListColumn } from "../components/ListColumn.js"; +import { ConfirmDialog } from "../components/ConfirmDialog.js"; +import { HelpScreen } from "../components/HelpScreen.js"; +import { MultiLineInput } from "../components/MultiLineInput.js"; +import { useTerminalSize, getListColumns, getListWidth } from "../hooks/useTerminalSize.js"; import Spinner from "ink-spinner"; // Key sequence for checklist items: 1-9, then a-h (skip i), j-z diff --git a/packages/trello-cli/src/tui/views/CardDetailView.tsx b/packages/trello-cli/src/tui/views/CardDetailView.tsx index d34b1b3..b8d4026 100644 --- a/packages/trello-cli/src/tui/views/CardDetailView.tsx +++ b/packages/trello-cli/src/tui/views/CardDetailView.tsx @@ -1,9 +1,9 @@ import React, { useMemo, useEffect, useState } from "react"; import { exec } from "child_process"; import { Box, Text, useInput } from "ink"; -import { useTrello } from "../state/TrelloContext"; -import { useNavigation } from "../state/NavigationContext"; -import { TrelloCard } from "../types"; +import { useTrello } from "../state/TrelloContext.js"; +import { useNavigation } from "../state/NavigationContext.js"; +import { TrelloCard } from "../types.js"; const CARD_DETAIL_HELP = [ { key: "e", desc: "Edit card name" }, diff --git a/packages/trello-cli/src/tui/views/HomeView.tsx b/packages/trello-cli/src/tui/views/HomeView.tsx index e2a1b0b..3f2a4aa 100644 --- a/packages/trello-cli/src/tui/views/HomeView.tsx +++ b/packages/trello-cli/src/tui/views/HomeView.tsx @@ -1,8 +1,8 @@ import React, { useEffect, useState, useMemo } from "react"; import { Box, Text, useInput, useApp } from "ink"; import TextInput from "ink-text-input"; -import { useTrello } from "../state/TrelloContext"; -import { useNavigation } from "../state/NavigationContext"; +import { useTrello } from "../state/TrelloContext.js"; +import { useNavigation } from "../state/NavigationContext.js"; import Spinner from "ink-spinner"; export function HomeView() { diff --git a/packages/trello-cli/src/tui/views/MyCardsView.tsx b/packages/trello-cli/src/tui/views/MyCardsView.tsx index 0473887..1fbb546 100644 --- a/packages/trello-cli/src/tui/views/MyCardsView.tsx +++ b/packages/trello-cli/src/tui/views/MyCardsView.tsx @@ -1,8 +1,8 @@ import React, { useEffect, useState } from "react"; import { Box, Text, useInput } from "ink"; -import { useTrello } from "../state/TrelloContext"; -import { useNavigation } from "../state/NavigationContext"; -import { TrelloCard } from "../types"; +import { useTrello } from "../state/TrelloContext.js"; +import { useNavigation } from "../state/NavigationContext.js"; +import { TrelloCard } from "../types.js"; import Spinner from "ink-spinner"; interface CardGroup { diff --git a/packages/trello-cli/test/setup-tui.ts b/packages/trello-cli/test/setup-tui.ts new file mode 100644 index 0000000..41becbf --- /dev/null +++ b/packages/trello-cli/test/setup-tui.ts @@ -0,0 +1,4 @@ +import { afterEach } from "@jest/globals"; +import { cleanup } from "ink-testing-library"; + +afterEach(cleanup); diff --git a/packages/trello-cli/test/tui/components/Card.test.tsx b/packages/trello-cli/test/tui/components/Card.test.tsx index f46ebe1..6f1c498 100644 --- a/packages/trello-cli/test/tui/components/Card.test.tsx +++ b/packages/trello-cli/test/tui/components/Card.test.tsx @@ -1,14 +1,15 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -const { stripVTControlCharacters } = require("node:util"); -import { Card } from "../../../src/tui/components/Card"; +import { stripVTControlCharacters } from "node:util"; import { createMockNavContext, makeCard, makeLabel } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; +const { Card } = await import("../../../src/tui/components/Card"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; describe("Card", () => { diff --git a/packages/trello-cli/test/tui/components/ConfirmDialog.test.tsx b/packages/trello-cli/test/tui/components/ConfirmDialog.test.tsx index c734860..5b30359 100644 --- a/packages/trello-cli/test/tui/components/ConfirmDialog.test.tsx +++ b/packages/trello-cli/test/tui/components/ConfirmDialog.test.tsx @@ -1,13 +1,14 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -import { ConfirmDialog } from "../../../src/tui/components/ConfirmDialog"; import { createMockNavContext } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; +const { ConfirmDialog } = await import("../../../src/tui/components/ConfirmDialog"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; // Helper to flush useEffect — React 17 scheduler uses MessageChannel/setTimeout diff --git a/packages/trello-cli/test/tui/components/Footer.test.tsx b/packages/trello-cli/test/tui/components/Footer.test.tsx index f492cc1..c2d6e9a 100644 --- a/packages/trello-cli/test/tui/components/Footer.test.tsx +++ b/packages/trello-cli/test/tui/components/Footer.test.tsx @@ -1,14 +1,15 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -const { stripVTControlCharacters } = require("node:util"); -import { Footer } from "../../../src/tui/components/Footer"; +import { stripVTControlCharacters } from "node:util"; import { createMockNavContext } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; +const { Footer } = await import("../../../src/tui/components/Footer"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; describe("Footer", () => { diff --git a/packages/trello-cli/test/tui/components/Header.test.tsx b/packages/trello-cli/test/tui/components/Header.test.tsx index 85893e5..214220c 100644 --- a/packages/trello-cli/test/tui/components/Header.test.tsx +++ b/packages/trello-cli/test/tui/components/Header.test.tsx @@ -1,18 +1,19 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -const { stripVTControlCharacters } = require("node:util"); -import { Header } from "../../../src/tui/components/Header"; +import { stripVTControlCharacters } from "node:util"; import { createMockNavContext, createMockTrelloContext, makeBoard, makeList, makeCard } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -jest.mock("../../../src/tui/state/TrelloContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/TrelloContext", () => ({ useTrello: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; -import { useTrello } from "../../../src/tui/state/TrelloContext"; +const { Header } = await import("../../../src/tui/components/Header"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); +const { useTrello } = await import("../../../src/tui/state/TrelloContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; const mockUseTrello = useTrello as jest.MockedFunction; diff --git a/packages/trello-cli/test/tui/components/HelpScreen.test.tsx b/packages/trello-cli/test/tui/components/HelpScreen.test.tsx index 17f6782..bb9c2ef 100644 --- a/packages/trello-cli/test/tui/components/HelpScreen.test.tsx +++ b/packages/trello-cli/test/tui/components/HelpScreen.test.tsx @@ -1,13 +1,14 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -import { HelpScreen } from "../../../src/tui/components/HelpScreen"; import { createMockNavContext } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; +const { HelpScreen } = await import("../../../src/tui/components/HelpScreen"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; // Helper to flush useEffect — React 17 scheduler uses MessageChannel/setTimeout @@ -103,6 +104,8 @@ describe("HelpScreen", () => { const { stdin } = render(); await flushEffects(); stdin.write("\u001B"); + // Ink buffers standalone Escape to distinguish it from escape sequences. + await new Promise((resolve) => setTimeout(resolve, 30)); expect(onClose).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/trello-cli/test/tui/components/ListColumn.test.tsx b/packages/trello-cli/test/tui/components/ListColumn.test.tsx index 5460375..3d6f5bd 100644 --- a/packages/trello-cli/test/tui/components/ListColumn.test.tsx +++ b/packages/trello-cli/test/tui/components/ListColumn.test.tsx @@ -1,14 +1,15 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -const { stripVTControlCharacters } = require("node:util"); -import { ListColumn } from "../../../src/tui/components/ListColumn"; +import { stripVTControlCharacters } from "node:util"; import { createMockNavContext, makeList, makeCard } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; +const { ListColumn } = await import("../../../src/tui/components/ListColumn"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; describe("ListColumn", () => { diff --git a/packages/trello-cli/test/tui/components/MultiLineInput.test.tsx b/packages/trello-cli/test/tui/components/MultiLineInput.test.tsx index fba1fe4..6128be8 100644 --- a/packages/trello-cli/test/tui/components/MultiLineInput.test.tsx +++ b/packages/trello-cli/test/tui/components/MultiLineInput.test.tsx @@ -1,4 +1,5 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; import { MultiLineInput } from "../../../src/tui/components/MultiLineInput"; @@ -65,6 +66,8 @@ describe("MultiLineInput", () => { const inst = renderInput("Some text"); await flushEffects(); inst.stdin.write("\u001B"); + // Ink buffers standalone Escape to distinguish it from escape sequences. + await new Promise((resolve) => setTimeout(resolve, 30)); expect(onCancel).toHaveBeenCalled(); }); diff --git a/packages/trello-cli/test/tui/helpers.tsx b/packages/trello-cli/test/tui/helpers.tsx index e52cf64..a12fac8 100644 --- a/packages/trello-cli/test/tui/helpers.tsx +++ b/packages/trello-cli/test/tui/helpers.tsx @@ -1,3 +1,4 @@ +import { jest } from "@jest/globals"; import { TuiConfig, DEFAULT_TUI_CONFIG, diff --git a/packages/trello-cli/test/tui/state/NavigationContext.test.tsx b/packages/trello-cli/test/tui/state/NavigationContext.test.tsx index a6f287e..5a417dd 100644 --- a/packages/trello-cli/test/tui/state/NavigationContext.test.tsx +++ b/packages/trello-cli/test/tui/state/NavigationContext.test.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; import { Box, Text } from "ink"; import { diff --git a/packages/trello-cli/test/tui/state/TrelloContext.test.tsx b/packages/trello-cli/test/tui/state/TrelloContext.test.tsx index 2edbd43..3b84d08 100644 --- a/packages/trello-cli/test/tui/state/TrelloContext.test.tsx +++ b/packages/trello-cli/test/tui/state/TrelloContext.test.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; import { Box, Text } from "ink"; import { diff --git a/packages/trello-cli/test/tui/views/CardDetailView.test.tsx b/packages/trello-cli/test/tui/views/CardDetailView.test.tsx index 7ef2441..7c09e24 100644 --- a/packages/trello-cli/test/tui/views/CardDetailView.test.tsx +++ b/packages/trello-cli/test/tui/views/CardDetailView.test.tsx @@ -1,7 +1,7 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -const { stripVTControlCharacters } = require("node:util"); -import { CardDetailView } from "../../../src/tui/views/CardDetailView"; +import { stripVTControlCharacters } from "node:util"; import { createMockNavContext, createMockTrelloContext, @@ -13,16 +13,17 @@ import { } from "../helpers"; import { TrelloChecklist, TrelloAttachment } from "../../../src/tui/types"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -jest.mock("../../../src/tui/state/TrelloContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/TrelloContext", () => ({ useTrello: jest.fn(), })); -import { useNavigation } from "../../../src/tui/state/NavigationContext"; -import { useTrello } from "../../../src/tui/state/TrelloContext"; +const { CardDetailView } = await import("../../../src/tui/views/CardDetailView"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); +const { useTrello } = await import("../../../src/tui/state/TrelloContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; const mockUseTrello = useTrello as jest.MockedFunction; @@ -290,6 +291,8 @@ describe("CardDetailView", () => { const inst = render(); await flushEffects(); inst.stdin.write("\u001B"); + // Ink buffers standalone Escape to distinguish it from escape sequences. + await new Promise((resolve) => setTimeout(resolve, 30)); expect(navDispatch).toHaveBeenCalledWith( expect.objectContaining({ type: "SET_VIEW", view: "board", preserveSelection: true }) ); diff --git a/packages/trello-cli/test/tui/views/HomeView.test.tsx b/packages/trello-cli/test/tui/views/HomeView.test.tsx index 95199aa..528de9f 100644 --- a/packages/trello-cli/test/tui/views/HomeView.test.tsx +++ b/packages/trello-cli/test/tui/views/HomeView.test.tsx @@ -1,45 +1,24 @@ import React from "react"; +import { jest } from "@jest/globals"; import { render } from "ink-testing-library"; -const { stripVTControlCharacters } = require("node:util"); -import { HomeView } from "../../../src/tui/views/HomeView"; +import { stripVTControlCharacters } from "node:util"; import { createMockNavContext, createMockTrelloContext, makeBoard, } from "../helpers"; -jest.mock("../../../src/tui/state/NavigationContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/NavigationContext", () => ({ useNavigation: jest.fn(), })); -jest.mock("../../../src/tui/state/TrelloContext", () => ({ +jest.unstable_mockModule("../../../src/tui/state/TrelloContext", () => ({ useTrello: jest.fn(), })); -jest.mock("ink", () => { - const actual = jest.requireActual("ink"); - return { - ...actual, - useApp: () => ({ exit: jest.fn() }), - }; -}); - -jest.mock("ink-spinner", () => { - return function Spinner() { - return "⠋"; - }; -}); - -jest.mock("ink-text-input", () => { - return function TextInput({ value }: { value: string }) { - const React = require("react"); - const { Text } = require("ink"); - return React.createElement(Text, null, value || ""); - }; -}); - -import { useNavigation } from "../../../src/tui/state/NavigationContext"; -import { useTrello } from "../../../src/tui/state/TrelloContext"; +const { HomeView } = await import("../../../src/tui/views/HomeView"); +const { useNavigation } = await import("../../../src/tui/state/NavigationContext"); +const { useTrello } = await import("../../../src/tui/state/TrelloContext"); const mockUseNavigation = useNavigation as jest.MockedFunction; const mockUseTrello = useTrello as jest.MockedFunction; diff --git a/packages/trello-cli/tsconfig.json b/packages/trello-cli/tsconfig.json index ea79373..2ac7eca 100644 --- a/packages/trello-cli/tsconfig.json +++ b/packages/trello-cli/tsconfig.json @@ -2,13 +2,13 @@ "compilerOptions": { "declaration": true, "importHelpers": true, - "module": "commonjs", + "module": "NodeNext", "outDir": "dist", "rootDir": "src", "strict": true, "target": "es2019", "esModuleInterop": true, - "ignoreDeprecations": "6.0", + "isolatedModules": true, "jsx": "react-jsx", "skipLibCheck": true, "types": ["node", "jest"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10a2792..3629c7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,8 +119,8 @@ importers: specifier: ^26.4.1 version: 26.4.1 ink-testing-library: - specifier: 2.1.0 - version: 2.1.0(@types/react@19.2.18) + specifier: 4.0.0 + version: 4.0.0(@types/react@19.2.18) jest: specifier: ^30.5.1 version: 30.5.1(@types/node@26.4.1)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@26.4.1)(typescript@6.0.3)) @@ -183,23 +183,23 @@ importers: specifier: ^2.10.1 version: 2.10.1 ink: - specifier: 3.2.0 - version: 3.2.0(@types/react@17.0.91)(react@17.0.2) + specifier: 8.0.0 + version: 8.0.0(@types/react@19.3.0)(react@19.3.1) ink-select-input: - specifier: 4.2.2 - version: 4.2.2(ink@3.2.0(@types/react@17.0.91)(react@17.0.2))(react@17.0.2) + specifier: 6.2.0 + version: 6.2.0(ink@8.0.0(@types/react@19.3.0)(react@19.3.1))(react@19.3.1) ink-spinner: - specifier: 4.0.3 - version: 4.0.3(ink@3.2.0(@types/react@17.0.91)(react@17.0.2))(react@17.0.2) + specifier: 5.0.0 + version: 5.0.0(ink@8.0.0(@types/react@19.3.0)(react@19.3.1))(react@19.3.1) ink-text-input: - specifier: 4.0.3 - version: 4.0.3(ink@3.2.0(@types/react@17.0.91)(react@17.0.2))(react@17.0.2) + specifier: 6.0.0 + version: 6.0.0(ink@8.0.0(@types/react@19.3.0)(react@19.3.1))(react@19.3.1) json2csv: specifier: 6.0.0-alpha.2 version: 6.0.0-alpha.2 react: - specifier: 17.0.2 - version: 17.0.2 + specifier: 19.3.1 + version: 19.3.1 trello.js: specifier: ^1.2.8 version: 1.2.8(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1) @@ -220,14 +220,14 @@ importers: specifier: ^26.4.1 version: 26.4.1 '@types/react': - specifier: 17.0.91 - version: 17.0.91 + specifier: 19.3.0 + version: 19.3.0 eslint: specifier: ^9.39.5 version: 9.39.5(supports-color@8.1.1) ink-testing-library: - specifier: 2.1.0 - version: 2.1.0(@types/react@17.0.91) + specifier: 4.0.0 + version: 4.0.0(@types/react@19.3.0) oclif: specifier: ^4.24.0 version: 4.24.0(@types/node@26.4.1)(supports-color@8.1.1) @@ -249,6 +249,10 @@ importers: packages: + '@alcalzone/ansi-tokenize@0.3.1': + resolution: {integrity: sha512-cUD0PT0YX+rImRhfn7BfMRduP/tX/Zqt/N0dHlAyn2RlcJssCb5KsCJkhln61eh9vuJDkH8wKn3L8zJzzWXPFg==} + engines: {node: '>=18'} + '@aws-sdk/checksums@3.1000.29': resolution: {integrity: sha512-Dtu0gr4dnATZAPwEYbpCsG+MpLM7OAliy2gTepEFQwl1vZ6DL3QMH2FveMa3HLvPsOdhJsPRB3KtxVhph9T75A==} engines: {node: '>=20.0.0'} @@ -1182,17 +1186,11 @@ packages: '@types/node@26.4.1': resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react@17.0.91': - resolution: {integrity: sha512-xauZca6qMeCU3Moy0KxCM9jtf1vyk6qRYK39Ryf3afUqwgNUjRIGoDdS9BcGWgAMGSg1hvP4XcmlYrM66PtqeA==} - '@types/react@19.2.18': resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@types/scheduler@0.16.8': - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/react@19.3.0': + resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1206,9 +1204,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yoga-layout@1.9.2': - resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} - '@typescript-eslint/eslint-plugin@8.69.0': resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1416,6 +1411,10 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1436,6 +1435,10 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansi-styles@7.0.0: + resolution: {integrity: sha512-kKvt3m4uwzqL0wlkPd09CmljPJGOZZ4D0fP65sqFSvPkMRKhNi+74MgIJ5QxE6SxqB4t4KyUFGg8+n5zjo6hew==} + engines: {node: '>=22'} + ansis@3.17.0: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} @@ -1453,14 +1456,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arr-rotate@1.0.0: - resolution: {integrity: sha512-yOzOZcR9Tn7enTF66bqKorGGH0F36vcPaSWg8fO0c0UYb3LX3VMXj5ZxEqQLNOecAhlRJ7wYZja5i4jTlnbIfQ==} - engines: {node: '>=4'} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} @@ -1470,9 +1465,9 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - auto-bind@4.0.0: - resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} - engines: {node: '>=8'} + auto-bind@5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} axios@1.20.0: resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} @@ -1592,6 +1587,14 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chalk@6.0.1: + resolution: {integrity: sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==} + engines: {node: '>=22'} + change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -1606,9 +1609,6 @@ packages: resolution: {integrity: sha512-tPOsBzYVAK5zth+CiHCgp5NGeqRc4mMD8FPthQ5IxkgjPWWxIFdM5odnmfw//IRAzl6C++Xy8olQW7wn5qBR1g==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -1620,21 +1620,21 @@ packages: resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} engines: {node: '>=10'} - cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} + cli-boxes@4.0.1: + resolution: {integrity: sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==} + engines: {node: '>=18.20 <19 || >=20.10'} - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} + cli-truncate@6.1.1: + resolution: {integrity: sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==} + engines: {node: '>=22'} cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} @@ -1648,9 +1648,9 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - code-excerpt@3.0.0: - resolution: {integrity: sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==} - engines: {node: '>=10'} + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} collect-v8-coverage@1.0.3: resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} @@ -1686,9 +1686,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - convert-to-spaces@1.0.2: - resolution: {integrity: sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==} - engines: {node: '>= 4'} + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1788,6 +1788,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -1810,14 +1814,13 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -1938,9 +1941,9 @@ packages: picomatch: optional: true - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -2007,6 +2010,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2151,48 +2158,55 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ink-select-input@4.2.2: - resolution: {integrity: sha512-E5AS2Vnd4CSzEa7Rm+hG47wxRQo1ASfh4msKxO7FHmn/ym+GKSSsFIfR+FonqjKNDPXYJClw8lM47RdN3Pi+nw==} - engines: {node: '>=10'} + ink-select-input@6.2.0: + resolution: {integrity: sha512-304fZXxkpYxJ9si5lxRCaX01GNlmPBgOZumXXRnPYbHW/iI31cgQynqk2tRypGLOF1cMIwPUzL2LSm6q4I5rQQ==} + engines: {node: '>=18'} peerDependencies: - ink: ^3.0.5 - react: ^16.5.2 || ^17.0.0 + ink: '>=5.0.0' + react: '>=18.0.0' - ink-spinner@4.0.3: - resolution: {integrity: sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==} - engines: {node: '>=10'} + ink-spinner@5.0.0: + resolution: {integrity: sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA==} + engines: {node: '>=14.16'} peerDependencies: - ink: '>=3.0.5' - react: '>=16.8.2' + ink: '>=4.0.0' + react: '>=18.0.0' - ink-testing-library@2.1.0: - resolution: {integrity: sha512-7TNlOjJlJXB33vG7yVa+MMO7hCjaC1bCn+zdpSjknWoLbOWMaFdKc7LJvqVkZ0rZv2+akhjXPrcR/dbxissjUw==} - engines: {node: '>=10'} + ink-testing-library@4.0.0: + resolution: {integrity: sha512-yF92kj3pmBvk7oKbSq5vEALO//o7Z9Ck/OaLNlkzXNeYdwfpxMQkSowGTFUCS5MSu9bWfSZMewGpp7bFc66D7Q==} + engines: {node: '>=18'} peerDependencies: - '@types/react': '>=16.8.0' + '@types/react': '>=18.0.0' peerDependenciesMeta: '@types/react': optional: true - ink-text-input@4.0.3: - resolution: {integrity: sha512-eQD01ik9ltmNoHmkeQ2t8LszYkv2XwuPSUz3ie/85qer6Ll/j0QSlSaLNl6ENHZakBHdCBVZY04iOXcLLXA0PQ==} - engines: {node: '>=10'} + ink-text-input@6.0.0: + resolution: {integrity: sha512-Fw64n7Yha5deb1rHY137zHTAbSTNelUKuB5Kkk2HACXEtwIHBCf9OH2tP/LQ9fRYTl1F0dZgbW0zPnZk6FA9Lw==} + engines: {node: '>=18'} peerDependencies: - ink: ^3.0.0-3 - react: ^16.5.2 || ^17.0.0 + ink: '>=5' + react: '>=18' - ink@3.2.0: - resolution: {integrity: sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==} - engines: {node: '>=10'} + ink@8.0.0: + resolution: {integrity: sha512-M2aFwZOqmkFxCwedy6xrP4E+DGoK57iahAFnfTqNyOyJ54O7DZzu027z/NI8EGy44Sw9O9BcbTF4QEUS2GHAtg==} + engines: {node: '>=22'} peerDependencies: - '@types/react': '>=16.8.0' - react: '>=16.8.0' + '@types/react': '>=19.3.0' + react: '>=19.3.0' + react-devtools-core: '>=6.1.2' peerDependenciesMeta: '@types/react': optional: true + react-devtools-core: + optional: true interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -2201,10 +2215,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} @@ -2227,6 +2237,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -2235,6 +2249,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ci@2.0.0: + resolution: {integrity: sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==} + engines: {node: '>=20'} + hasBin: true + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2256,6 +2275,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2506,10 +2529,6 @@ packages: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -2519,10 +2538,6 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -2745,10 +2760,6 @@ packages: - validate-npm-package-name - which - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - object-treeify@4.0.1: resolution: {integrity: sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==} engines: {node: '>= 16'} @@ -2821,9 +2832,9 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - patch-console@1.0.0: - resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==} - engines: {node: '>=10'} + patch-console@2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} @@ -2914,8 +2925,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - react-devtools-core@4.28.5: - resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} + quick-lru@7.3.0: + resolution: {integrity: sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==} + engines: {node: '>=18'} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -2923,14 +2935,14 @@ packages: react-is@19.2.8: resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} - react-reconciler@0.26.2: - resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} + react-reconciler@0.34.0: + resolution: {integrity: sha512-eVibvB1fc9j5Qf1KRkiM3GzRPBdjg2P6G6QV2f3P6Eb3OGMxRBhdg2rrUwjbV5JrQaJj8nOa8uajmmJA5tJWjQ==} engines: {node: '>=0.10.0'} peerDependencies: - react: ^17.0.2 + react: ^19.3.0 - react@17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} engines: {node: '>=0.10.0'} rechoir@0.6.2: @@ -2969,9 +2981,9 @@ packages: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} @@ -2990,8 +3002,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} @@ -3053,9 +3065,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} + slice-ansi@9.0.1: + resolution: {integrity: sha512-aBY19bn/XA+hKOKX0qL7Z0UfdBsbQvc9hn993U8ALUjzxCvDcuZqLoRXjGJrUARWAlwMnsRVD9sw2AFNOYvalA==} + engines: {node: '>=22'} snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -3095,6 +3107,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} + engines: {node: '>=20'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3135,6 +3151,14 @@ packages: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + terminal-size@4.0.1: + resolution: {integrity: sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==} + engines: {node: '>=18'} + test-exclude@7.0.2: resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} @@ -3154,6 +3178,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-rotated@1.0.0: + resolution: {integrity: sha512-KsEID8AfgUy+pxVRLsWp0VzCa69wxzUDZnzGbyIST/bcgcrMvTYoFBX/QORH4YApoD89EDuUovx4BTdpOn319Q==} + engines: {node: '>=18'} + trello.js@1.2.8: resolution: {integrity: sha512-QOr4RemCz+zNIiufW6oA50Q3qOQVX7tR3jOSg+Pi1s4fTOuTv7C+vOeJtz8D6iNL232o/1zWvOMk7SBXtI6eaw==} @@ -3218,14 +3246,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.12.0: - resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} - engines: {node: '>=10'} - - type-fest@0.15.1: - resolution: {integrity: sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -3234,6 +3254,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.10.0: + resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} + engines: {node: '>=20'} + typescript-eslint@8.69.0: resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3311,6 +3335,10 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} + widest-line@6.0.0: + resolution: {integrity: sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==} + engines: {node: '>=20'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3318,6 +3346,10 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@10.0.2: + resolution: {integrity: sha512-6OLRNZqRntVGBm26ghZ5eZhCuWWyOkRCSn8XsOIuq5stpCE/tjLbdozd93naILZig0lmD8ANfRwnhn0DLeXGlg==} + engines: {node: '>=20'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -3337,18 +3369,6 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@7.5.13: - resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - wsl-utils@0.4.0: resolution: {integrity: sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA==} engines: {node: '>=20'} @@ -3390,12 +3410,16 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoga-layout-prebuilt@1.10.0: - resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==} - engines: {node: '>=8'} + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} snapshots: + '@alcalzone/ansi-tokenize@0.3.1': + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + '@aws-sdk/checksums@3.1000.29': dependencies: '@aws-sdk/core': 3.977.9 @@ -4685,20 +4709,14 @@ snapshots: dependencies: undici-types: 8.3.0 - '@types/prop-types@15.7.15': {} - - '@types/react@17.0.91': - dependencies: - '@types/prop-types': 15.7.15 - '@types/scheduler': 0.16.8 - csstype: 3.2.3 - '@types/react@19.2.18': dependencies: csstype: 3.2.3 optional: true - '@types/scheduler@0.16.8': {} + '@types/react@19.3.0': + dependencies: + csstype: 3.2.3 '@types/stack-utils@2.0.3': {} @@ -4710,8 +4728,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yoga-layout@1.9.2': {} - '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.5(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@9.39.5(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -4902,6 +4918,10 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.3.0: {} @@ -4914,6 +4934,8 @@ snapshots: ansi-styles@6.2.3: {} + ansi-styles@7.0.0: {} + ansis@3.17.0: {} anymatch@3.1.3: @@ -4929,10 +4951,6 @@ snapshots: argparse@2.0.1: {} - arr-rotate@1.0.0: {} - - astral-regex@2.0.0: {} - async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -4941,7 +4959,7 @@ snapshots: asynckit@0.4.0: {} - auto-bind@4.0.0: {} + auto-bind@5.0.1: {} axios@1.20.0(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1): dependencies: @@ -5095,6 +5113,10 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + + chalk@6.0.1: {} + change-case@4.1.2: dependencies: camel-case: 4.1.2 @@ -5116,8 +5138,6 @@ snapshots: chrono-node@2.10.1: {} - ci-info@2.0.0: {} - ci-info@4.4.0: {} cjs-module-lexer@2.2.1: {} @@ -5126,18 +5146,18 @@ snapshots: dependencies: escape-string-regexp: 4.0.0 - cli-boxes@2.2.1: {} + cli-boxes@4.0.1: {} - cli-cursor@3.1.0: + cli-cursor@4.0.0: dependencies: - restore-cursor: 3.1.0 + restore-cursor: 4.0.0 cli-spinners@2.9.2: {} - cli-truncate@2.1.0: + cli-truncate@6.1.1: dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 + slice-ansi: 9.0.1 + string-width: 8.3.0 cli-width@4.1.0: {} @@ -5149,9 +5169,9 @@ snapshots: co@4.6.0: {} - code-excerpt@3.0.0: + code-excerpt@4.0.0: dependencies: - convert-to-spaces: 1.0.2 + convert-to-spaces: 2.0.1 collect-v8-coverage@1.0.3: {} @@ -5184,7 +5204,7 @@ snapshots: convert-source-map@2.0.0: {} - convert-to-spaces@1.0.2: {} + convert-to-spaces@2.0.1: {} create-require@1.1.1: {} @@ -5261,6 +5281,8 @@ snapshots: dependencies: once: 1.4.0 + environment@1.1.0: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -5282,9 +5304,9 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 - escalade@3.2.0: {} + es-toolkit@1.52.0: {} - escape-string-regexp@1.0.5: {} + escalade@3.2.0: {} escape-string-regexp@2.0.0: {} @@ -5435,9 +5457,9 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - figures@3.2.0: + figures@6.1.0: dependencies: - escape-string-regexp: 1.0.5 + is-unicode-supported: 2.1.0 file-entry-cache@8.0.0: dependencies: @@ -5503,6 +5525,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.7.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5661,77 +5685,71 @@ snapshots: indent-string@4.0.0: {} + indent-string@5.0.0: {} + ini@1.3.8: {} - ink-select-input@4.2.2(ink@3.2.0(@types/react@17.0.91)(react@17.0.2))(react@17.0.2): + ink-select-input@6.2.0(ink@8.0.0(@types/react@19.3.0)(react@19.3.1))(react@19.3.1): dependencies: - arr-rotate: 1.0.0 - figures: 3.2.0 - ink: 3.2.0(@types/react@17.0.91)(react@17.0.2) - lodash.isequal: 4.5.0 - react: 17.0.2 + figures: 6.1.0 + ink: 8.0.0(@types/react@19.3.0)(react@19.3.1) + react: 19.3.1 + to-rotated: 1.0.0 - ink-spinner@4.0.3(ink@3.2.0(@types/react@17.0.91)(react@17.0.2))(react@17.0.2): + ink-spinner@5.0.0(ink@8.0.0(@types/react@19.3.0)(react@19.3.1))(react@19.3.1): dependencies: cli-spinners: 2.9.2 - ink: 3.2.0(@types/react@17.0.91)(react@17.0.2) - react: 17.0.2 + ink: 8.0.0(@types/react@19.3.0)(react@19.3.1) + react: 19.3.1 - ink-testing-library@2.1.0(@types/react@17.0.91): + ink-testing-library@4.0.0(@types/react@19.2.18): optionalDependencies: - '@types/react': 17.0.91 + '@types/react': 19.2.18 - ink-testing-library@2.1.0(@types/react@19.2.18): + ink-testing-library@4.0.0(@types/react@19.3.0): optionalDependencies: - '@types/react': 19.2.18 + '@types/react': 19.3.0 - ink-text-input@4.0.3(ink@3.2.0(@types/react@17.0.91)(react@17.0.2))(react@17.0.2): + ink-text-input@6.0.0(ink@8.0.0(@types/react@19.3.0)(react@19.3.1))(react@19.3.1): dependencies: - chalk: 4.1.2 - ink: 3.2.0(@types/react@17.0.91)(react@17.0.2) - react: 17.0.2 - type-fest: 0.15.1 + chalk: 5.6.2 + ink: 8.0.0(@types/react@19.3.0)(react@19.3.1) + react: 19.3.1 + type-fest: 4.41.0 - ink@3.2.0(@types/react@17.0.91)(react@17.0.2): - dependencies: - ansi-escapes: 4.3.2 - auto-bind: 4.0.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - cli-cursor: 3.1.0 - cli-truncate: 2.1.0 - code-excerpt: 3.0.0 - indent-string: 4.0.0 - is-ci: 2.0.0 - lodash: 4.18.1 - patch-console: 1.0.0 - react: 17.0.2 - react-devtools-core: 4.28.5 - react-reconciler: 0.26.2(react@17.0.2) - scheduler: 0.20.2 + ink@8.0.0(@types/react@19.3.0)(react@19.3.1): + dependencies: + '@alcalzone/ansi-tokenize': 0.3.1 + ansi-escapes: 7.3.0 + ansi-styles: 7.0.0 + auto-bind: 5.0.1 + chalk: 6.0.1 + cli-boxes: 4.0.1 + cli-cursor: 4.0.0 + cli-truncate: 6.1.1 + code-excerpt: 4.0.0 + es-toolkit: 1.52.0 + indent-string: 5.0.0 + is-in-ci: 2.0.0 + patch-console: 2.0.0 + quick-lru: 7.3.0 + react: 19.3.1 + react-reconciler: 0.34.0(react@19.3.1) signal-exit: 3.0.7 - slice-ansi: 3.0.0 stack-utils: 2.0.6 - string-width: 4.2.3 - type-fest: 0.12.0 - widest-line: 3.1.0 - wrap-ansi: 6.2.0 - ws: 7.5.13 - yoga-layout-prebuilt: 1.10.0 + string-width: 8.3.0 + terminal-size: 4.0.1 + type-fest: 5.10.0 + widest-line: 6.0.0 + wrap-ansi: 10.0.2 + yoga-layout: 3.2.1 optionalDependencies: - '@types/react': 17.0.91 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@types/react': 19.3.0 interpret@1.4.0: {} is-arrayish@0.2.1: {} - is-ci@2.0.0: - dependencies: - ci-info: 2.0.0 - is-core-module@2.16.2: dependencies: hasown: 2.0.4 @@ -5744,12 +5762,18 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.7.0 + is-generator-fn@2.1.0: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-in-ci@2.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -5762,6 +5786,8 @@ snapshots: is-stream@2.0.1: {} + is-unicode-supported@2.1.0: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -6198,18 +6224,12 @@ snapshots: lodash.get@4.4.2: {} - lodash.isequal@4.5.0: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} lodash@4.18.1: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -6331,8 +6351,6 @@ snapshots: npm@11.19.1: {} - object-assign@4.1.1: {} - object-treeify@4.0.1: {} oclif@4.24.0(@types/node@26.4.1)(supports-color@8.1.1): @@ -6433,7 +6451,7 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - patch-console@1.0.0: {} + patch-console@2.0.0: {} path-case@3.0.4: dependencies: @@ -6502,29 +6520,18 @@ snapshots: quick-lru@5.1.1: {} - react-devtools-core@4.28.5: - dependencies: - shell-quote: 1.10.0 - ws: 7.5.13 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + quick-lru@7.3.0: {} react-is@18.3.1: {} react-is@19.2.8: {} - react-reconciler@0.26.2(react@17.0.2): + react-reconciler@0.34.0(react@19.3.1): dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 17.0.2 - scheduler: 0.20.2 + react: 19.3.1 + scheduler: 0.28.0 - react@17.0.2: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 + react@19.3.1: {} rechoir@0.6.2: dependencies: @@ -6557,7 +6564,7 @@ snapshots: dependencies: lowercase-keys: 3.0.0 - restore-cursor@3.1.0: + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 @@ -6574,10 +6581,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.20.2: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 + scheduler@0.28.0: {} semver@5.7.2: {} @@ -6625,11 +6629,10 @@ snapshots: slash@3.0.0: {} - slice-ansi@3.0.0: + slice-ansi@9.0.1: dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 snake-case@3.0.4: dependencies: @@ -6675,6 +6678,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string-width@8.3.0: + dependencies: + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -6705,6 +6713,10 @@ snapshots: dependencies: '@pkgr/core': 0.3.6 + tagged-tag@1.0.0: {} + + terminal-size@4.0.1: {} + test-exclude@7.0.2: dependencies: '@istanbuljs/schema': 0.1.6 @@ -6724,6 +6736,8 @@ snapshots: dependencies: is-number: 7.0.0 + to-rotated@1.0.0: {} + trello.js@1.2.8(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1): dependencies: axios: 1.20.0(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1) @@ -6787,14 +6801,14 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.12.0: {} - - type-fest@0.15.1: {} - type-fest@0.21.3: {} type-fest@4.41.0: {} + type-fest@5.10.0: + dependencies: + tagged-tag: 1.0.0 + typescript-eslint@8.69.0(eslint@9.39.5(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@9.39.5(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@9.39.5(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) @@ -6893,10 +6907,19 @@ snapshots: dependencies: string-width: 4.2.3 + widest-line@6.0.0: + dependencies: + string-width: 8.3.0 + word-wrap@1.2.5: {} wordwrap@1.0.0: {} + wrap-ansi@10.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 8.3.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -6922,8 +6945,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@7.5.13: {} - wsl-utils@0.4.0: dependencies: is-wsl: 3.1.1 @@ -6955,6 +6976,4 @@ snapshots: yoctocolors-cjs@2.1.3: {} - yoga-layout-prebuilt@1.10.0: - dependencies: - '@types/yoga-layout': 1.9.2 + yoga-layout@3.2.1: {}