@involvex/youtube-music-cli 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +352 -0
  2. package/dist/eslint.config.d.ts +2 -0
  3. package/dist/eslint.config.js +55 -0
  4. package/dist/source/app.d.ts +4 -0
  5. package/dist/source/app.js +17 -0
  6. package/dist/source/cli.d.ts +2 -0
  7. package/dist/source/cli.js +241 -0
  8. package/dist/source/components/common/ErrorBoundary.d.ts +15 -0
  9. package/dist/source/components/common/ErrorBoundary.js +22 -0
  10. package/dist/source/components/common/Help.d.ts +1 -0
  11. package/dist/source/components/common/Help.js +10 -0
  12. package/dist/source/components/common/ShortcutsBar.d.ts +1 -0
  13. package/dist/source/components/common/ShortcutsBar.js +33 -0
  14. package/dist/source/components/config/ConfigLayout.d.ts +1 -0
  15. package/dist/source/components/config/ConfigLayout.js +84 -0
  16. package/dist/source/components/layouts/MainLayout.d.ts +4 -0
  17. package/dist/source/components/layouts/MainLayout.js +83 -0
  18. package/dist/source/components/layouts/PlayerLayout.d.ts +1 -0
  19. package/dist/source/components/layouts/PlayerLayout.js +10 -0
  20. package/dist/source/components/layouts/PluginsLayout.d.ts +1 -0
  21. package/dist/source/components/layouts/PluginsLayout.js +77 -0
  22. package/dist/source/components/layouts/SearchLayout.d.ts +4 -0
  23. package/dist/source/components/layouts/SearchLayout.js +81 -0
  24. package/dist/source/components/player/NowPlaying.d.ts +1 -0
  25. package/dist/source/components/player/NowPlaying.js +21 -0
  26. package/dist/source/components/player/PlayerControls.d.ts +1 -0
  27. package/dist/source/components/player/PlayerControls.js +41 -0
  28. package/dist/source/components/player/ProgressBar.d.ts +1 -0
  29. package/dist/source/components/player/ProgressBar.js +18 -0
  30. package/dist/source/components/player/QueueList.d.ts +4 -0
  31. package/dist/source/components/player/QueueList.js +30 -0
  32. package/dist/source/components/player/Suggestions.d.ts +1 -0
  33. package/dist/source/components/player/Suggestions.js +47 -0
  34. package/dist/source/components/playlist/PlaylistList.d.ts +1 -0
  35. package/dist/source/components/playlist/PlaylistList.js +11 -0
  36. package/dist/source/components/plugins/PluginInstallDialog.d.ts +5 -0
  37. package/dist/source/components/plugins/PluginInstallDialog.js +41 -0
  38. package/dist/source/components/plugins/PluginsAvailable.d.ts +5 -0
  39. package/dist/source/components/plugins/PluginsAvailable.js +55 -0
  40. package/dist/source/components/plugins/PluginsList.d.ts +8 -0
  41. package/dist/source/components/plugins/PluginsList.js +18 -0
  42. package/dist/source/components/search/SearchBar.d.ts +8 -0
  43. package/dist/source/components/search/SearchBar.js +50 -0
  44. package/dist/source/components/search/SearchResults.d.ts +10 -0
  45. package/dist/source/components/search/SearchResults.js +111 -0
  46. package/dist/source/components/settings/Settings.d.ts +1 -0
  47. package/dist/source/components/settings/Settings.js +42 -0
  48. package/dist/source/components/theme/ThemeSwitcher.d.ts +1 -0
  49. package/dist/source/components/theme/ThemeSwitcher.js +11 -0
  50. package/dist/source/config/themes.config.d.ts +3 -0
  51. package/dist/source/config/themes.config.js +63 -0
  52. package/dist/source/contexts/theme.context.d.ts +13 -0
  53. package/dist/source/contexts/theme.context.js +29 -0
  54. package/dist/source/hooks/useKeyboard.d.ts +10 -0
  55. package/dist/source/hooks/useKeyboard.js +104 -0
  56. package/dist/source/hooks/useNavigation.d.ts +1 -0
  57. package/dist/source/hooks/useNavigation.js +5 -0
  58. package/dist/source/hooks/usePlayer.d.ts +23 -0
  59. package/dist/source/hooks/usePlayer.js +35 -0
  60. package/dist/source/hooks/usePlaylist.d.ts +8 -0
  61. package/dist/source/hooks/usePlaylist.js +50 -0
  62. package/dist/source/hooks/useSearch.d.ts +8 -0
  63. package/dist/source/hooks/useSearch.js +76 -0
  64. package/dist/source/hooks/useTerminalSize.d.ts +4 -0
  65. package/dist/source/hooks/useTerminalSize.js +24 -0
  66. package/dist/source/hooks/useTheme.d.ts +6 -0
  67. package/dist/source/hooks/useTheme.js +5 -0
  68. package/dist/source/hooks/useYouTubeMusic.d.ts +11 -0
  69. package/dist/source/hooks/useYouTubeMusic.js +112 -0
  70. package/dist/source/main.d.ts +4 -0
  71. package/dist/source/main.js +69 -0
  72. package/dist/source/services/config/config.service.d.ts +26 -0
  73. package/dist/source/services/config/config.service.js +125 -0
  74. package/dist/source/services/logger/logger.service.d.ts +10 -0
  75. package/dist/source/services/logger/logger.service.js +52 -0
  76. package/dist/source/services/player/player.service.d.ts +58 -0
  77. package/dist/source/services/player/player.service.js +349 -0
  78. package/dist/source/services/player-state/player-state.service.d.ts +24 -0
  79. package/dist/source/services/player-state/player-state.service.js +122 -0
  80. package/dist/source/services/plugin/plugin-audio-api.d.ts +17 -0
  81. package/dist/source/services/plugin/plugin-audio-api.js +36 -0
  82. package/dist/source/services/plugin/plugin-context.d.ts +5 -0
  83. package/dist/source/services/plugin/plugin-context.js +256 -0
  84. package/dist/source/services/plugin/plugin-hooks.service.d.ts +62 -0
  85. package/dist/source/services/plugin/plugin-hooks.service.js +135 -0
  86. package/dist/source/services/plugin/plugin-installer.service.d.ts +27 -0
  87. package/dist/source/services/plugin/plugin-installer.service.js +247 -0
  88. package/dist/source/services/plugin/plugin-loader.service.d.ts +33 -0
  89. package/dist/source/services/plugin/plugin-loader.service.js +161 -0
  90. package/dist/source/services/plugin/plugin-permissions.service.d.ts +72 -0
  91. package/dist/source/services/plugin/plugin-permissions.service.js +194 -0
  92. package/dist/source/services/plugin/plugin-registry.service.d.ts +76 -0
  93. package/dist/source/services/plugin/plugin-registry.service.js +215 -0
  94. package/dist/source/services/plugin/plugin-ui-api.d.ts +25 -0
  95. package/dist/source/services/plugin/plugin-ui-api.js +46 -0
  96. package/dist/source/services/plugin/plugin-updater.service.d.ts +23 -0
  97. package/dist/source/services/plugin/plugin-updater.service.js +206 -0
  98. package/dist/source/services/youtube-music/api.d.ts +13 -0
  99. package/dist/source/services/youtube-music/api.js +371 -0
  100. package/dist/source/services/youtube-music/search.service.d.ts +11 -0
  101. package/dist/source/services/youtube-music/search.service.js +38 -0
  102. package/dist/source/stores/navigation.store.d.ts +10 -0
  103. package/dist/source/stores/navigation.store.js +67 -0
  104. package/dist/source/stores/player.store.d.ts +28 -0
  105. package/dist/source/stores/player.store.js +458 -0
  106. package/dist/source/stores/plugins.store.d.ts +46 -0
  107. package/dist/source/stores/plugins.store.js +177 -0
  108. package/dist/source/types/actions.d.ts +119 -0
  109. package/dist/source/types/actions.js +1 -0
  110. package/dist/source/types/cli.types.d.ts +14 -0
  111. package/dist/source/types/cli.types.js +1 -0
  112. package/dist/source/types/config.types.d.ts +19 -0
  113. package/dist/source/types/config.types.js +1 -0
  114. package/dist/source/types/keyboard.types.d.ts +5 -0
  115. package/dist/source/types/keyboard.types.js +1 -0
  116. package/dist/source/types/navigation.types.d.ts +14 -0
  117. package/dist/source/types/navigation.types.js +1 -0
  118. package/dist/source/types/player.types.d.ts +16 -0
  119. package/dist/source/types/player.types.js +1 -0
  120. package/dist/source/types/playlist.types.d.ts +12 -0
  121. package/dist/source/types/playlist.types.js +1 -0
  122. package/dist/source/types/plugin.types.d.ts +239 -0
  123. package/dist/source/types/plugin.types.js +1 -0
  124. package/dist/source/types/theme.types.d.ts +18 -0
  125. package/dist/source/types/theme.types.js +1 -0
  126. package/dist/source/types/youtube-music.types.d.ts +35 -0
  127. package/dist/source/types/youtube-music.types.js +1 -0
  128. package/dist/source/types/youtubei.types.d.ts +60 -0
  129. package/dist/source/types/youtubei.types.js +3 -0
  130. package/dist/source/utils/constants.d.ts +65 -0
  131. package/dist/source/utils/constants.js +82 -0
  132. package/dist/source/utils/format.d.ts +3 -0
  133. package/dist/source/utils/format.js +24 -0
  134. package/dist/test.d.ts +1 -0
  135. package/dist/test.js +13 -0
  136. package/package.json +100 -0
@@ -0,0 +1,35 @@
1
+ export interface Artist {
2
+ artistId: string;
3
+ name: string;
4
+ }
5
+ export interface Album {
6
+ albumId: string;
7
+ name: string;
8
+ artists: Artist[];
9
+ }
10
+ export interface Track {
11
+ videoId: string;
12
+ title: string;
13
+ artists: Artist[];
14
+ album?: Album;
15
+ duration?: number;
16
+ }
17
+ export interface Playlist {
18
+ playlistId: string;
19
+ name: string;
20
+ tracks: Track[];
21
+ }
22
+ export interface SearchResult {
23
+ type: 'song' | 'album' | 'artist' | 'playlist';
24
+ data: Track | Album | Artist | Playlist;
25
+ }
26
+ export interface SearchResponse {
27
+ results: SearchResult[];
28
+ hasMore: boolean;
29
+ continuation?: string;
30
+ }
31
+ export interface SearchOptions {
32
+ type?: 'all' | 'songs' | 'albums' | 'artists' | 'playlists';
33
+ limit?: number;
34
+ continuation?: string;
35
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ export interface VideoSearchResult {
2
+ id: string;
3
+ video_id?: string;
4
+ title: {
5
+ text: string;
6
+ } | string;
7
+ author?: {
8
+ name: string;
9
+ } | string;
10
+ channel_id?: string;
11
+ channel?: {
12
+ id: string;
13
+ };
14
+ duration?: {
15
+ seconds: number;
16
+ } | number;
17
+ type?: string;
18
+ }
19
+ export interface PlaylistSearchResult {
20
+ id: string;
21
+ title: {
22
+ text: string;
23
+ } | string;
24
+ author?: {
25
+ name: string;
26
+ } | string;
27
+ }
28
+ export interface ChannelSearchResult {
29
+ id: string;
30
+ channelId?: string;
31
+ author?: {
32
+ name: string;
33
+ } | string;
34
+ name?: string;
35
+ }
36
+ export interface SearchResponse {
37
+ videos?: VideoSearchResult[];
38
+ playlists?: PlaylistSearchResult[];
39
+ channels?: ChannelSearchResult[];
40
+ [key: string]: unknown;
41
+ }
42
+ export interface RelatedContent {
43
+ id: string;
44
+ title?: {
45
+ text: string;
46
+ } | string;
47
+ [key: string]: unknown;
48
+ }
49
+ export interface VideoInfo {
50
+ related?: {
51
+ contents: RelatedContent[];
52
+ };
53
+ chooseFormat?: (options: {
54
+ type: string;
55
+ quality: string;
56
+ }) => {
57
+ url: string;
58
+ } | null;
59
+ [key: string]: unknown;
60
+ }
@@ -0,0 +1,3 @@
1
+ // Type definitions for youtubei.js API responses
2
+ // These interfaces provide proper typing for the dynamic responses from the YouTube API
3
+ export {};
@@ -0,0 +1,65 @@
1
+ export declare const APP_NAME = "@involvex/youtube-music-cli";
2
+ export declare const APP_VERSION = "0.0.1";
3
+ export declare const CONFIG_DIR: string;
4
+ export declare const CONFIG_FILE: string;
5
+ export declare const VIEW: {
6
+ readonly PLAYER: "player";
7
+ readonly SEARCH: "search";
8
+ readonly PLAYLISTS: "playlists";
9
+ readonly ARTIST: "artist";
10
+ readonly ALBUM: "album";
11
+ readonly HELP: "help";
12
+ readonly SUGGESTIONS: "suggestions";
13
+ readonly SETTINGS: "settings";
14
+ readonly CONFIG: "config";
15
+ readonly PLUGINS: "plugins";
16
+ };
17
+ export declare const SEARCH_TYPE: {
18
+ readonly ALL: "all";
19
+ readonly SONGS: "songs";
20
+ readonly ALBUMS: "albums";
21
+ readonly ARTISTS: "artists";
22
+ readonly PLAYLISTS: "playlists";
23
+ };
24
+ export declare const KEYBINDINGS: {
25
+ readonly QUIT: readonly ["q", "escape"];
26
+ readonly HELP: readonly ["?"];
27
+ readonly SEARCH: readonly ["/"];
28
+ readonly PLAYLISTS: readonly ["p"];
29
+ readonly SUGGESTIONS: readonly ["g"];
30
+ readonly SETTINGS: readonly [","];
31
+ readonly PLAY_PAUSE: readonly [" "];
32
+ readonly NEXT: readonly ["n", "right"];
33
+ readonly PREVIOUS: readonly ["b", "left"];
34
+ readonly VOLUME_UP: readonly ["="];
35
+ readonly VOLUME_DOWN: readonly ["-"];
36
+ readonly SHUFFLE: readonly ["s"];
37
+ readonly REPEAT: readonly ["r"];
38
+ readonly SEEK_FORWARD: readonly ["shift+right"];
39
+ readonly SEEK_BACKWARD: readonly ["shift+left"];
40
+ readonly UP: readonly ["up", "k"];
41
+ readonly DOWN: readonly ["down", "j"];
42
+ readonly SELECT: readonly ["enter", "return"];
43
+ readonly BACK: readonly ["escape"];
44
+ readonly CLEAR_SEARCH: readonly ["escape"];
45
+ readonly NEXT_RESULT: readonly ["tab"];
46
+ readonly PREV_RESULT: readonly ["shift+tab"];
47
+ readonly INCREASE_RESULTS: readonly ["]"];
48
+ readonly DECREASE_RESULTS: readonly ["["];
49
+ readonly ADD_TO_PLAYLIST: readonly ["a"];
50
+ readonly REMOVE_FROM_PLAYLIST: readonly ["d"];
51
+ readonly CREATE_PLAYLIST: readonly ["c"];
52
+ readonly DELETE_PLAYLIST: readonly ["D"];
53
+ };
54
+ export declare const DEFAULT_VOLUME = 70;
55
+ export declare const MAX_QUEUE_SIZE = 1000;
56
+ export declare const THEMES: {
57
+ readonly DARK: "dark";
58
+ readonly LIGHT: "light";
59
+ readonly MIDNIGHT: "midnight";
60
+ readonly MATRIX: "matrix";
61
+ readonly CUSTOM: "custom";
62
+ };
63
+ export declare const PROGRESS_UPDATE_INTERVAL = 100;
64
+ export declare const STATUS_UPDATE_INTERVAL = 1000;
65
+ export declare const DEFAULT_THEME: "dark";
@@ -0,0 +1,82 @@
1
+ // Application constants
2
+ export const APP_NAME = '@involvex/youtube-music-cli';
3
+ export const APP_VERSION = '0.0.1';
4
+ // Config directory
5
+ export const CONFIG_DIR = process.platform === 'win32'
6
+ ? `${process.env['USERPROFILE']}\\.youtube-music-cli`
7
+ : `${process.env['HOME']}/.youtube-music-cli`;
8
+ export const CONFIG_FILE = `${CONFIG_DIR}/config.json`;
9
+ // View types
10
+ export const VIEW = {
11
+ PLAYER: 'player',
12
+ SEARCH: 'search',
13
+ PLAYLISTS: 'playlists',
14
+ ARTIST: 'artist',
15
+ ALBUM: 'album',
16
+ HELP: 'help',
17
+ SUGGESTIONS: 'suggestions',
18
+ SETTINGS: 'settings',
19
+ CONFIG: 'config',
20
+ PLUGINS: 'plugins',
21
+ };
22
+ // Search types
23
+ export const SEARCH_TYPE = {
24
+ ALL: 'all',
25
+ SONGS: 'songs',
26
+ ALBUMS: 'albums',
27
+ ARTISTS: 'artists',
28
+ PLAYLISTS: 'playlists',
29
+ };
30
+ // Keybindings
31
+ export const KEYBINDINGS = {
32
+ // Global
33
+ QUIT: ['q', 'escape'],
34
+ HELP: ['?'],
35
+ SEARCH: ['/'],
36
+ PLAYLISTS: ['p'],
37
+ SUGGESTIONS: ['g'],
38
+ SETTINGS: [','],
39
+ // Player
40
+ PLAY_PAUSE: [' '],
41
+ NEXT: ['n', 'right'],
42
+ PREVIOUS: ['b', 'left'],
43
+ VOLUME_UP: ['='], // Only '=' without shift, since '+' requires shift and causes issues
44
+ VOLUME_DOWN: ['-'], // Only '-' without shift
45
+ SHUFFLE: ['s'],
46
+ REPEAT: ['r'],
47
+ SEEK_FORWARD: ['shift+right'],
48
+ SEEK_BACKWARD: ['shift+left'],
49
+ // Navigation
50
+ UP: ['up', 'k'],
51
+ DOWN: ['down', 'j'],
52
+ SELECT: ['enter', 'return'],
53
+ BACK: ['escape'],
54
+ // Search
55
+ CLEAR_SEARCH: ['escape'],
56
+ NEXT_RESULT: ['tab'],
57
+ PREV_RESULT: ['shift+tab'],
58
+ INCREASE_RESULTS: [']'],
59
+ DECREASE_RESULTS: ['['],
60
+ // Playlist
61
+ ADD_TO_PLAYLIST: ['a'],
62
+ REMOVE_FROM_PLAYLIST: ['d'],
63
+ CREATE_PLAYLIST: ['c'],
64
+ DELETE_PLAYLIST: ['D'],
65
+ };
66
+ // Default volume
67
+ export const DEFAULT_VOLUME = 70;
68
+ // Queue limits
69
+ export const MAX_QUEUE_SIZE = 1000;
70
+ // Themes
71
+ export const THEMES = {
72
+ DARK: 'dark',
73
+ LIGHT: 'light',
74
+ MIDNIGHT: 'midnight',
75
+ MATRIX: 'matrix',
76
+ CUSTOM: 'custom',
77
+ };
78
+ // Update intervals
79
+ export const PROGRESS_UPDATE_INTERVAL = 100; // ms
80
+ export const STATUS_UPDATE_INTERVAL = 1000; // ms
81
+ // Default theme
82
+ export const DEFAULT_THEME = 'dark';
@@ -0,0 +1,3 @@
1
+ export declare function formatTime(seconds: number): string;
2
+ export declare function formatNumber(num: number): string;
3
+ export declare function truncate(text: string, maxLength: number): string;
@@ -0,0 +1,24 @@
1
+ // Format utilities
2
+ export function formatTime(seconds) {
3
+ if (!seconds || seconds < 0) {
4
+ return '0:00';
5
+ }
6
+ const mins = Math.floor(seconds / 60);
7
+ const secs = Math.floor(seconds % 60);
8
+ return `${mins}:${secs.toString().padStart(2, '0')}`;
9
+ }
10
+ export function formatNumber(num) {
11
+ if (num >= 1_000_000) {
12
+ return `${(num / 1_000_000).toFixed(1)}M`;
13
+ }
14
+ if (num >= 1_000) {
15
+ return `${(num / 1_000).toFixed(1)}K`;
16
+ }
17
+ return num.toString();
18
+ }
19
+ export function truncate(text, maxLength) {
20
+ if (text.length <= maxLength) {
21
+ return text;
22
+ }
23
+ return text.slice(0, maxLength - 3) + '...';
24
+ }
package/dist/test.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/test.js ADDED
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink-testing-library';
3
+ import App from './source/app.js';
4
+ import chalk from 'chalk';
5
+ import test from 'ava';
6
+ test('greet unknown user', t => {
7
+ const { lastFrame } = render(_jsx(App, { flags: { help: true } }));
8
+ t.is(lastFrame(), `Hello, ${chalk.green('Stranger')}`);
9
+ });
10
+ test('greet user with a name', t => {
11
+ const { lastFrame } = render(_jsx(App, { flags: { version: true } }));
12
+ t.is(lastFrame(), `Hello, ${chalk.green('Jane')}`);
13
+ });
package/package.json ADDED
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "@involvex/youtube-music-cli",
3
+ "version": "0.0.0",
4
+ "description": "- A Commandline music player for youtube-music",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/involvex/youtube-music-cli"
8
+ },
9
+ "funding": "https://github.com/sponsors/involvex",
10
+ "license": "MIT",
11
+ "author": "involvex",
12
+ "type": "module",
13
+ "bin": {
14
+ "youtube-music-cli": "dist/source/cli.js",
15
+ "ymc": "dist/source/cli.js"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "prebuild": "bun run format && bun run lint:fix && bun run typecheck",
22
+ "build": "tsc",
23
+ "bun:build": "bun build source/cli.tsx --outfile dist/index.js --target node",
24
+ "compile": "bun build --compile source/cli.tsx --outfile dist/youtube-music-cli.exe",
25
+ "dev": "bun run --bun source/cli.tsx",
26
+ "dev:watch": "bun run --bun --watch source/cli.tsx",
27
+ "format": "prettier --write .",
28
+ "format:check": "prettier --check .",
29
+ "lint": "eslint . --ext .js,.jsx,.ts,.tsx --ignore-pattern dist",
30
+ "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix --ignore-pattern dist",
31
+ "start": "bun run dist/source/cli.js",
32
+ "test": "prettier --check . && xo && ava",
33
+ "typecheck": "tsc --noEmit",
34
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
35
+ "clean": "rimraf dist"
36
+ },
37
+ "xo": {
38
+ "extends": "xo-react",
39
+ "prettier": true,
40
+ "rules": {
41
+ "react/prop-types": "off"
42
+ }
43
+ },
44
+ "prettier": "@vdemedes/prettier-config",
45
+ "ava": {
46
+ "extensions": {
47
+ "ts": "module",
48
+ "tsx": "module"
49
+ },
50
+ "nodeArguments": [
51
+ "--loader=ts-node/esm"
52
+ ]
53
+ },
54
+ "dependencies": {
55
+ "@distube/ytdl-core": "^4.16.12",
56
+ "ansi-escapes": "^7.3.0",
57
+ "ink": "^6.7.0",
58
+ "ink-table": "^3.1.0",
59
+ "ink-text-input": "^6.0.0",
60
+ "jiti": "^2.6.1",
61
+ "meow": "^14.0.0",
62
+ "node-youtube-music": "^0.10.3",
63
+ "play-sound": "^1.1.6",
64
+ "react": "^19.2.4",
65
+ "youtube-ext": "^1.1.25",
66
+ "youtubei.js": "^16.0.1"
67
+ },
68
+ "devDependencies": {
69
+ "@eslint/js": "^10.0.1",
70
+ "@sindresorhus/tsconfig": "^8.1.0",
71
+ "@types/react": "^19.2.14",
72
+ "@vdemedes/prettier-config": "^2.0.1",
73
+ "ava": "^6.4.1",
74
+ "chalk": "^5.6.2",
75
+ "conventional-changelog-cli": "^5.0.0",
76
+ "eslint": "^10.0.0",
77
+ "eslint-config-xo-react": "^0.29.0",
78
+ "eslint-plugin-react": "^7.37.5",
79
+ "eslint-plugin-react-hooks": "^7.0.1",
80
+ "globals": "^17.3.0",
81
+ "ink-testing-library": "^4.0.0",
82
+ "prettier": "^3.8.1",
83
+ "prettier-plugin-organize-imports": "^4.3.0",
84
+ "prettier-plugin-packagejson": "^3.0.0",
85
+ "prettier-plugin-sort-imports": "^1.8.11",
86
+ "react-devtools-core": "^7.0.1",
87
+ "rimraf": "^6.1.3",
88
+ "ts-node": "^10.9.2",
89
+ "typescript": "^5.9.3",
90
+ "typescript-eslint": "^8.56.0",
91
+ "xo": "^1.2.3"
92
+ },
93
+ "engines": {
94
+ "node": ">=16"
95
+ },
96
+ "sponsors": "https://github.com/sponsors/involvex",
97
+ "trustedDependencies": [
98
+ "unrs-resolver"
99
+ ]
100
+ }