emoemu 0.1.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 (213) hide show
  1. package/.claude/settings.local.json +77 -0
  2. package/.node-version +1 -0
  3. package/CLAUDE.md +435 -0
  4. package/README.md +404 -0
  5. package/TODO.md +655 -0
  6. package/dist/index.cjs +25108 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +25085 -0
  9. package/docs/building-libretro-cores-arm-mac.md +237 -0
  10. package/docs/config-file-format.md +488 -0
  11. package/docs/cores-trd.md +425 -0
  12. package/docs/headless-hardware-rendering-trd.md +676 -0
  13. package/docs/libretro-cores-trd.md +997 -0
  14. package/docs/mupen64-software-rendering-trd.md +751 -0
  15. package/docs/n64-support-trd.md +306 -0
  16. package/docs/native-rendering-trd.md +540 -0
  17. package/docs/native-ui-rendering-trd.md +1195 -0
  18. package/docs/netplay-trd.md +665 -0
  19. package/docs/retroarch-netplay-docs.md +277 -0
  20. package/docs/save-state-format.md +666 -0
  21. package/eslint.config.js +111 -0
  22. package/icon/icon.png +0 -0
  23. package/icon/icon.pxd +0 -0
  24. package/package.json +63 -0
  25. package/pnpm-workspace.yaml +10 -0
  26. package/src/Emulator/consts.ts +14 -0
  27. package/src/Emulator/index.ts +2496 -0
  28. package/src/Emulator/saveState/index.ts +155 -0
  29. package/src/Emulator/screenshot/index.ts +160 -0
  30. package/src/Emulator/terminalDimensions/index.ts +79 -0
  31. package/src/Emulator/types.ts +83 -0
  32. package/src/cli/commands/consts.ts +10 -0
  33. package/src/cli/commands/index.ts +462 -0
  34. package/src/cli/parseArgs/consts.ts +17 -0
  35. package/src/cli/parseArgs/index.ts +457 -0
  36. package/src/cli/parseArgs/types.ts +61 -0
  37. package/src/cli/runEmulator/index.ts +406 -0
  38. package/src/cli/runEmulator/types.ts +7 -0
  39. package/src/consts.ts +19 -0
  40. package/src/core/button/consts.ts +35 -0
  41. package/src/core/button/index.ts +123 -0
  42. package/src/core/core.ts +300 -0
  43. package/src/core/index.ts +19 -0
  44. package/src/cores/libretro/api/index.ts +334 -0
  45. package/src/cores/libretro/api/types.ts +148 -0
  46. package/src/cores/libretro/callbacks/consts.ts +41 -0
  47. package/src/cores/libretro/callbacks/index.ts +456 -0
  48. package/src/cores/libretro/consts.ts +45 -0
  49. package/src/cores/libretro/coreOptions/consts.ts +36 -0
  50. package/src/cores/libretro/coreOptions/index.ts +222 -0
  51. package/src/cores/libretro/environment/consts.ts +118 -0
  52. package/src/cores/libretro/environment/index.ts +1095 -0
  53. package/src/cores/libretro/index.ts +937 -0
  54. package/src/cores/libretro/loader/index.ts +496 -0
  55. package/src/cores/libretro/pixelFormat/consts.ts +43 -0
  56. package/src/cores/libretro/pixelFormat/index.ts +397 -0
  57. package/src/cores/libretro/types.ts +339 -0
  58. package/src/frontend/AudioManager/index.ts +420 -0
  59. package/src/frontend/SettingsManager/index.ts +250 -0
  60. package/src/frontend/config/index.ts +608 -0
  61. package/src/frontend/config/tests.ts +354 -0
  62. package/src/frontend/config/types.ts +36 -0
  63. package/src/frontend/consts.ts +114 -0
  64. package/src/frontend/coreBuilder/index.ts +644 -0
  65. package/src/frontend/coreBuilder/types.ts +15 -0
  66. package/src/frontend/coreDownloader/index.ts +620 -0
  67. package/src/frontend/coreDownloader/types.ts +17 -0
  68. package/src/frontend/corePreferences/index.ts +69 -0
  69. package/src/frontend/coreRegistry/index.ts +276 -0
  70. package/src/frontend/directoryCache/index.ts +75 -0
  71. package/src/frontend/index.ts +79 -0
  72. package/src/frontend/notifications/consts.ts +14 -0
  73. package/src/frontend/notifications/index.ts +250 -0
  74. package/src/frontend/playlist/consts.ts +168 -0
  75. package/src/frontend/playlist/index.ts +899 -0
  76. package/src/frontend/playlist/labelFormatter/consts.ts +15 -0
  77. package/src/frontend/playlist/labelFormatter/index.ts +155 -0
  78. package/src/frontend/playlist/labelFormatter/tests.ts +153 -0
  79. package/src/frontend/playlist/reader/index.ts +559 -0
  80. package/src/frontend/playlist/sync/index.ts +511 -0
  81. package/src/frontend/playlist/systemLookup/index.ts +233 -0
  82. package/src/frontend/playlist/utils/index.ts +50 -0
  83. package/src/frontend/romScanner/consts.ts +348 -0
  84. package/src/frontend/romScanner/index.ts +1957 -0
  85. package/src/frontend/saveServices/consts.ts +2 -0
  86. package/src/frontend/saveServices/index.ts +313 -0
  87. package/src/frontend/serviceProvider/index.ts +108 -0
  88. package/src/frontend/serviceProvider/types.ts +13 -0
  89. package/src/index.ts +428 -0
  90. package/src/input/Controller/consts.ts +50 -0
  91. package/src/input/Controller/index.ts +81 -0
  92. package/src/input/GamepadManager/consts.ts +22 -0
  93. package/src/input/GamepadManager/index.ts +418 -0
  94. package/src/input/InputManager/consts.ts +86 -0
  95. package/src/input/InputManager/index.ts +593 -0
  96. package/src/input/InputMapper/consts.ts +33 -0
  97. package/src/input/InputMapper/index.ts +436 -0
  98. package/src/input/consts.ts +410 -0
  99. package/src/input/gamepadProfiles/index.ts +1100 -0
  100. package/src/input/index.ts +38 -0
  101. package/src/input/inputUtils/index.ts +31 -0
  102. package/src/netplay/FrameBuffer/consts.ts +2 -0
  103. package/src/netplay/FrameBuffer/index.ts +364 -0
  104. package/src/netplay/FrameBuffer/tests.ts +286 -0
  105. package/src/netplay/InputBuffer/consts.ts +7 -0
  106. package/src/netplay/InputBuffer/index.ts +347 -0
  107. package/src/netplay/InputBuffer/tests.ts +166 -0
  108. package/src/netplay/NetplayClient/index.ts +976 -0
  109. package/src/netplay/NetplayConnection/index.ts +536 -0
  110. package/src/netplay/NetplayDiscovery/consts.ts +41 -0
  111. package/src/netplay/NetplayDiscovery/index.ts +525 -0
  112. package/src/netplay/NetplayServer/index.ts +1407 -0
  113. package/src/netplay/SyncManager/index.ts +984 -0
  114. package/src/netplay/SyncManager/tests.ts +419 -0
  115. package/src/netplay/consts.ts +371 -0
  116. package/src/netplay/crc32/consts.ts +14 -0
  117. package/src/netplay/crc32/index.ts +97 -0
  118. package/src/netplay/crc32/tests.ts +40 -0
  119. package/src/netplay/index.ts +41 -0
  120. package/src/netplay/netplayLogger/consts.ts +30 -0
  121. package/src/netplay/netplayLogger/index.ts +345 -0
  122. package/src/netplay/protocol/consts.ts +86 -0
  123. package/src/netplay/protocol/index.ts +1280 -0
  124. package/src/netplay/protocol/tests.ts +606 -0
  125. package/src/netplay/protocol/types.ts +20 -0
  126. package/src/netplay/types.ts +395 -0
  127. package/src/rendering/KittyRenderer/index.ts +616 -0
  128. package/src/rendering/NativeRenderer/index.ts +279 -0
  129. package/src/rendering/NativeRenderer/tests.ts +133 -0
  130. package/src/rendering/TerminalRenderer/index.ts +770 -0
  131. package/src/rendering/consts.ts +401 -0
  132. package/src/rendering/fonts/CozetteVector.ttf +0 -0
  133. package/src/rendering/index.ts +26 -0
  134. package/src/rendering/nativeUi/NativeWindowManager/index.ts +158 -0
  135. package/src/rendering/nativeUi/NativeWindowManager/tests.ts +81 -0
  136. package/src/rendering/nativeUi/consts.ts +6 -0
  137. package/src/rendering/nativeUi/index.ts +20 -0
  138. package/src/rendering/postProcessing/consts.ts +38 -0
  139. package/src/rendering/postProcessing/index.ts +923 -0
  140. package/src/rendering/shared/ansi/consts.ts +12 -0
  141. package/src/rendering/shared/ansi/index.ts +104 -0
  142. package/src/rendering/shared/consts.ts +2 -0
  143. package/src/rendering/shared/fitToTerminal/index.ts +67 -0
  144. package/src/ui/AddRomsPrompt/consts.ts +13 -0
  145. package/src/ui/AddRomsPrompt/index.tsx +781 -0
  146. package/src/ui/App/consts.ts +2 -0
  147. package/src/ui/App/index.tsx +456 -0
  148. package/src/ui/AppCapabilities/index.tsx +67 -0
  149. package/src/ui/ConfigContext/index.tsx +56 -0
  150. package/src/ui/CoreManager/consts.ts +11 -0
  151. package/src/ui/CoreManager/index.tsx +779 -0
  152. package/src/ui/CoreSelector/consts.ts +2 -0
  153. package/src/ui/CoreSelector/index.tsx +251 -0
  154. package/src/ui/DialogContainer/index.tsx +42 -0
  155. package/src/ui/DialogOptionsList/index.tsx +61 -0
  156. package/src/ui/DuplicateCrcPrompt/consts.ts +5 -0
  157. package/src/ui/DuplicateCrcPrompt/index.tsx +146 -0
  158. package/src/ui/GamepadContext/consts.ts +15 -0
  159. package/src/ui/GamepadContext/index.tsx +295 -0
  160. package/src/ui/NativeDialog/index.tsx +120 -0
  161. package/src/ui/NetplayDisconnectedDialog/index.tsx +93 -0
  162. package/src/ui/NetplayPauseMenu/consts.ts +2 -0
  163. package/src/ui/NetplayPauseMenu/index.tsx +97 -0
  164. package/src/ui/RomBrowser/NetplayPanel/consts.ts +24 -0
  165. package/src/ui/RomBrowser/NetplayPanel/index.tsx +520 -0
  166. package/src/ui/RomBrowser/SettingsPanel/index.tsx +478 -0
  167. package/src/ui/RomBrowser/consts.ts +61 -0
  168. package/src/ui/RomBrowser/index.tsx +1164 -0
  169. package/src/ui/RomBrowser/settingsConfig/index.ts +320 -0
  170. package/src/ui/RomBrowser/types.ts +67 -0
  171. package/src/ui/SaveStateDialog/consts.ts +2 -0
  172. package/src/ui/SaveStateDialog/index.tsx +225 -0
  173. package/src/ui/WarningDialog/index.tsx +113 -0
  174. package/src/ui/consts.ts +27 -0
  175. package/src/ui/hooks/useClearTerminal/consts.ts +2 -0
  176. package/src/ui/hooks/useClearTerminal/index.ts +37 -0
  177. package/src/ui/hooks/useDialogNavigation/index.ts +99 -0
  178. package/src/ui/hooks/useGamepad/consts.ts +21 -0
  179. package/src/ui/hooks/useGamepad/index.ts +194 -0
  180. package/src/ui/index.ts +27 -0
  181. package/src/utils/buffer/consts.ts +17 -0
  182. package/src/utils/buffer/index.ts +129 -0
  183. package/src/utils/color/consts.ts +58 -0
  184. package/src/utils/color/index.ts +183 -0
  185. package/src/utils/compression/consts.ts +50 -0
  186. package/src/utils/compression/index.ts +101 -0
  187. package/src/utils/consts.ts +2 -0
  188. package/src/utils/crc32/consts.ts +22 -0
  189. package/src/utils/crc32/index.ts +83 -0
  190. package/src/utils/ensureDirectory/index.ts +10 -0
  191. package/src/utils/format/consts.ts +8 -0
  192. package/src/utils/format/index.ts +53 -0
  193. package/src/utils/getErrorMessage/index.ts +10 -0
  194. package/src/utils/index.ts +113 -0
  195. package/src/utils/ini/index.ts +200 -0
  196. package/src/utils/kitty/consts.ts +13 -0
  197. package/src/utils/kitty/index.ts +181 -0
  198. package/src/utils/logger/consts.ts +35 -0
  199. package/src/utils/logger/index.ts +217 -0
  200. package/src/utils/paths/consts.ts +18 -0
  201. package/src/utils/paths/index.ts +151 -0
  202. package/src/utils/png/consts.ts +34 -0
  203. package/src/utils/png/index.ts +131 -0
  204. package/src/utils/readJsonFile/index.ts +16 -0
  205. package/src/utils/rotateLogFile/index.ts +44 -0
  206. package/src/utils/safeClose/index.ts +10 -0
  207. package/src/utils/terminal/consts.ts +8 -0
  208. package/src/utils/terminal/index.ts +102 -0
  209. package/src/utils/thumbnailRenderer/consts.ts +2 -0
  210. package/src/utils/thumbnailRenderer/index.ts +147 -0
  211. package/src/utils/typedError/index.ts +26 -0
  212. package/tsconfig.json +31 -0
  213. package/vitest.config.ts +13 -0
@@ -0,0 +1,111 @@
1
+ import eslint from '@eslint/js';
2
+ import tseslint from '@typescript-eslint/eslint-plugin';
3
+ import tsparser from '@typescript-eslint/parser';
4
+ import preferArrowFunctions from 'eslint-plugin-prefer-arrow-functions';
5
+
6
+ export default [
7
+ {
8
+ ignores: ['dist/**', 'node_modules/**'],
9
+ },
10
+ {
11
+ files: ['src/**/*.ts', 'src/**/*.tsx'],
12
+ languageOptions: {
13
+ parser: tsparser,
14
+ parserOptions: {
15
+ ecmaVersion: 'latest',
16
+ sourceType: 'module',
17
+ project: './tsconfig.json',
18
+ },
19
+ },
20
+ plugins: {
21
+ '@typescript-eslint': tseslint,
22
+ 'prefer-arrow-functions': preferArrowFunctions,
23
+ },
24
+ rules: {
25
+ // Enforce arrow function style
26
+ 'prefer-arrow-functions/prefer-arrow-functions': [
27
+ 'error',
28
+ {
29
+ allowNamedFunctions: false,
30
+ classPropertiesAllowed: false,
31
+ disallowPrototype: false,
32
+ returnStyle: 'unchanged',
33
+ singleReturnOnly: false,
34
+ },
35
+ ],
36
+ // Also enforce arrow functions for callbacks
37
+ 'prefer-arrow-callback': 'error',
38
+ // Enforce const for variables that are never reassigned
39
+ 'prefer-const': 'error',
40
+ // Disallow var declarations, use let or const instead
41
+ 'no-var': 'error',
42
+ // Require === and !== instead of == and !=
43
+ 'eqeqeq': 'error',
44
+ // Require braces around all blocks
45
+ 'curly': 'error',
46
+ // Ensure promises are awaited or handled
47
+ '@typescript-eslint/no-floating-promises': 'error',
48
+ // Catch common promise mistakes
49
+ '@typescript-eslint/no-misused-promises': 'error',
50
+ // Only await things that are actually promises
51
+ '@typescript-eslint/await-thenable': 'error',
52
+ // Catch conditions that are always true/false
53
+ '@typescript-eslint/no-unnecessary-condition': 'error',
54
+ // Catch unnecessary type conversions
55
+ '@typescript-eslint/no-unnecessary-type-conversion': 'error',
56
+ // Disallow unsafe operations with `any` types
57
+ '@typescript-eslint/no-unsafe-argument': 'error',
58
+ '@typescript-eslint/no-unsafe-assignment': 'error',
59
+ '@typescript-eslint/no-unsafe-call': 'error',
60
+ '@typescript-eslint/no-unsafe-member-access': 'error',
61
+ '@typescript-eslint/no-unsafe-return': 'error',
62
+ // Only throw Error objects, not strings or literals
63
+ 'no-throw-literal': 'error',
64
+ // Enforce using interface instead of type for object type definitions
65
+ '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
66
+ // Prevent importing from /index paths directly and .js extensions
67
+ 'no-restricted-imports': [
68
+ 'error',
69
+ {
70
+ patterns: [
71
+ {
72
+ group: ['**/index', '**/index.*'],
73
+ message:
74
+ 'Import the module root ("module") instead of "module/index".',
75
+ },
76
+ {
77
+ group: ['**/*.js'],
78
+ message:
79
+ 'Do not include .js in import paths; use the bare path instead.',
80
+ },
81
+ ],
82
+ },
83
+ ],
84
+ // Disallow magic numbers - use named constants instead
85
+ '@typescript-eslint/no-magic-numbers': [
86
+ 'error',
87
+ {
88
+ ignore: [-1, 0, 1, 2],
89
+ ignoreArrayIndexes: true,
90
+ ignoreDefaultValues: true,
91
+ ignoreEnums: true,
92
+ ignoreNumericLiteralTypes: true,
93
+ ignoreReadonlyClassProperties: true,
94
+ ignoreTypeIndexes: true,
95
+ },
96
+ ],
97
+ },
98
+ },
99
+ {
100
+ files: ['src/**/tests.ts'],
101
+ rules: {
102
+ '@typescript-eslint/no-magic-numbers': 'off',
103
+ '@typescript-eslint/no-unsafe-argument': 'off',
104
+ '@typescript-eslint/no-unsafe-assignment': 'off',
105
+ '@typescript-eslint/no-unsafe-call': 'off',
106
+ '@typescript-eslint/no-unsafe-member-access': 'off',
107
+ '@typescript-eslint/no-unsafe-return': 'off',
108
+ '@typescript-eslint/no-unnecessary-condition': 'off',
109
+ },
110
+ },
111
+ ];
package/icon/icon.png ADDED
Binary file
package/icon/icon.pxd ADDED
Binary file
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "emoemu",
3
+ "version": "0.1.0",
4
+ "description": "A terminal-based multi-core emulator written in TypeScript",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "emoemu": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "tsup src/index.ts --watch --onSuccess 'node dist/index.js'",
12
+ "build": "tsc --noEmit && tsup src/index.ts --format esm --dts --define.__APP_VERSION__=\\\"$npm_package_version\\\" --define.__BUILD_DATE__=\\\"$(date +%Y%m%d)\\\" --define.__APP_ICON_BASE64__=\\\"$(base64 -i icon/icon.png | tr -d '\\n')\\\"",
13
+ "start": "node dist/index.js",
14
+ "test": "vitest",
15
+ "test:run": "vitest run",
16
+ "typecheck": "tsc --noEmit",
17
+ "lint": "eslint src/",
18
+ "lint:fix": "eslint src/ --fix",
19
+ "check": "pnpm run typecheck && pnpm run lint && pnpm run test:run"
20
+ },
21
+ "keywords": [
22
+ "nes",
23
+ "emulator",
24
+ "terminal",
25
+ "tui",
26
+ "6502"
27
+ ],
28
+ "author": "",
29
+ "license": "MIT",
30
+ "dependencies": {
31
+ "@inkjs/ui": "^2.0.0",
32
+ "audify": "^1.10.1",
33
+ "chalk": "^5.3.0",
34
+ "fzstd": "^0.1.1",
35
+ "ink": "^6.6.0",
36
+ "ink-native": "^0.4.0",
37
+ "koffi": "^2.15.0",
38
+ "node-hid": "^3.1.0",
39
+ "node-notifier": "^10.0.1",
40
+ "react": "^19.2.3",
41
+ "remeda": "^2.33.1",
42
+ "sharp": "^0.34.5"
43
+ },
44
+ "devDependencies": {
45
+ "@eslint/js": "^9.39.2",
46
+ "@types/node": "^22.10.2",
47
+ "@types/node-hid": "^1.3.4",
48
+ "@types/node-notifier": "^8.0.5",
49
+ "@types/react": "^19.2.7",
50
+ "@typescript-eslint/eslint-plugin": "^8.52.0",
51
+ "@typescript-eslint/parser": "^8.52.0",
52
+ "eslint": "^9.39.2",
53
+ "eslint-plugin-prefer-arrow-functions": "^3.9.1",
54
+ "tsup": "^8.3.5",
55
+ "tsx": "^4.19.2",
56
+ "typescript": "^5.7.2",
57
+ "vitest": "^2.1.8"
58
+ },
59
+ "engines": {
60
+ "node": ">=24.0.0"
61
+ },
62
+ "packageManager": "pnpm@11.10.0"
63
+ }
@@ -0,0 +1,10 @@
1
+ minimumReleaseAge: 10080
2
+ minimumReleaseAgeExclude:
3
+ - ink-sdl
4
+
5
+ allowBuilds:
6
+ audify: true
7
+ esbuild: true
8
+ koffi: true
9
+ node-hid: true
10
+ sharp: true
@@ -0,0 +1,14 @@
1
+ // Periodic bounds re-detection intervals
2
+ export const BOUNDS_CHECK_INTERVAL_INITIAL = 60;
3
+ export const BOUNDS_CHECK_INTERVAL_LATER = 300;
4
+ export const BOUNDS_CHECK_MAX_COUNT = 10;
5
+ export const BOUNDS_CHECK_INITIAL_COUNT = 3; // Use initial interval for first N checks
6
+
7
+ /** Auto-save interval in ms (only saves if SRAM was modified) */
8
+ export const AUTO_SAVE_INTERVAL_MS = 30000;
9
+
10
+ /** Status bar update interval in frames (~10 FPS at 60 FPS) */
11
+ export const STATUS_BAR_UPDATE_INTERVAL = 6;
12
+
13
+ /** Default duration for core messages in ms */
14
+ export const DEFAULT_MESSAGE_DURATION_MS = 3000;