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.
- package/.claude/settings.local.json +77 -0
- package/.node-version +1 -0
- package/CLAUDE.md +435 -0
- package/README.md +404 -0
- package/TODO.md +655 -0
- package/dist/index.cjs +25108 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +25085 -0
- package/docs/building-libretro-cores-arm-mac.md +237 -0
- package/docs/config-file-format.md +488 -0
- package/docs/cores-trd.md +425 -0
- package/docs/headless-hardware-rendering-trd.md +676 -0
- package/docs/libretro-cores-trd.md +997 -0
- package/docs/mupen64-software-rendering-trd.md +751 -0
- package/docs/n64-support-trd.md +306 -0
- package/docs/native-rendering-trd.md +540 -0
- package/docs/native-ui-rendering-trd.md +1195 -0
- package/docs/netplay-trd.md +665 -0
- package/docs/retroarch-netplay-docs.md +277 -0
- package/docs/save-state-format.md +666 -0
- package/eslint.config.js +111 -0
- package/icon/icon.png +0 -0
- package/icon/icon.pxd +0 -0
- package/package.json +63 -0
- package/pnpm-workspace.yaml +10 -0
- package/src/Emulator/consts.ts +14 -0
- package/src/Emulator/index.ts +2496 -0
- package/src/Emulator/saveState/index.ts +155 -0
- package/src/Emulator/screenshot/index.ts +160 -0
- package/src/Emulator/terminalDimensions/index.ts +79 -0
- package/src/Emulator/types.ts +83 -0
- package/src/cli/commands/consts.ts +10 -0
- package/src/cli/commands/index.ts +462 -0
- package/src/cli/parseArgs/consts.ts +17 -0
- package/src/cli/parseArgs/index.ts +457 -0
- package/src/cli/parseArgs/types.ts +61 -0
- package/src/cli/runEmulator/index.ts +406 -0
- package/src/cli/runEmulator/types.ts +7 -0
- package/src/consts.ts +19 -0
- package/src/core/button/consts.ts +35 -0
- package/src/core/button/index.ts +123 -0
- package/src/core/core.ts +300 -0
- package/src/core/index.ts +19 -0
- package/src/cores/libretro/api/index.ts +334 -0
- package/src/cores/libretro/api/types.ts +148 -0
- package/src/cores/libretro/callbacks/consts.ts +41 -0
- package/src/cores/libretro/callbacks/index.ts +456 -0
- package/src/cores/libretro/consts.ts +45 -0
- package/src/cores/libretro/coreOptions/consts.ts +36 -0
- package/src/cores/libretro/coreOptions/index.ts +222 -0
- package/src/cores/libretro/environment/consts.ts +118 -0
- package/src/cores/libretro/environment/index.ts +1095 -0
- package/src/cores/libretro/index.ts +937 -0
- package/src/cores/libretro/loader/index.ts +496 -0
- package/src/cores/libretro/pixelFormat/consts.ts +43 -0
- package/src/cores/libretro/pixelFormat/index.ts +397 -0
- package/src/cores/libretro/types.ts +339 -0
- package/src/frontend/AudioManager/index.ts +420 -0
- package/src/frontend/SettingsManager/index.ts +250 -0
- package/src/frontend/config/index.ts +608 -0
- package/src/frontend/config/tests.ts +354 -0
- package/src/frontend/config/types.ts +36 -0
- package/src/frontend/consts.ts +114 -0
- package/src/frontend/coreBuilder/index.ts +644 -0
- package/src/frontend/coreBuilder/types.ts +15 -0
- package/src/frontend/coreDownloader/index.ts +620 -0
- package/src/frontend/coreDownloader/types.ts +17 -0
- package/src/frontend/corePreferences/index.ts +69 -0
- package/src/frontend/coreRegistry/index.ts +276 -0
- package/src/frontend/directoryCache/index.ts +75 -0
- package/src/frontend/index.ts +79 -0
- package/src/frontend/notifications/consts.ts +14 -0
- package/src/frontend/notifications/index.ts +250 -0
- package/src/frontend/playlist/consts.ts +168 -0
- package/src/frontend/playlist/index.ts +899 -0
- package/src/frontend/playlist/labelFormatter/consts.ts +15 -0
- package/src/frontend/playlist/labelFormatter/index.ts +155 -0
- package/src/frontend/playlist/labelFormatter/tests.ts +153 -0
- package/src/frontend/playlist/reader/index.ts +559 -0
- package/src/frontend/playlist/sync/index.ts +511 -0
- package/src/frontend/playlist/systemLookup/index.ts +233 -0
- package/src/frontend/playlist/utils/index.ts +50 -0
- package/src/frontend/romScanner/consts.ts +348 -0
- package/src/frontend/romScanner/index.ts +1957 -0
- package/src/frontend/saveServices/consts.ts +2 -0
- package/src/frontend/saveServices/index.ts +313 -0
- package/src/frontend/serviceProvider/index.ts +108 -0
- package/src/frontend/serviceProvider/types.ts +13 -0
- package/src/index.ts +428 -0
- package/src/input/Controller/consts.ts +50 -0
- package/src/input/Controller/index.ts +81 -0
- package/src/input/GamepadManager/consts.ts +22 -0
- package/src/input/GamepadManager/index.ts +418 -0
- package/src/input/InputManager/consts.ts +86 -0
- package/src/input/InputManager/index.ts +593 -0
- package/src/input/InputMapper/consts.ts +33 -0
- package/src/input/InputMapper/index.ts +436 -0
- package/src/input/consts.ts +410 -0
- package/src/input/gamepadProfiles/index.ts +1100 -0
- package/src/input/index.ts +38 -0
- package/src/input/inputUtils/index.ts +31 -0
- package/src/netplay/FrameBuffer/consts.ts +2 -0
- package/src/netplay/FrameBuffer/index.ts +364 -0
- package/src/netplay/FrameBuffer/tests.ts +286 -0
- package/src/netplay/InputBuffer/consts.ts +7 -0
- package/src/netplay/InputBuffer/index.ts +347 -0
- package/src/netplay/InputBuffer/tests.ts +166 -0
- package/src/netplay/NetplayClient/index.ts +976 -0
- package/src/netplay/NetplayConnection/index.ts +536 -0
- package/src/netplay/NetplayDiscovery/consts.ts +41 -0
- package/src/netplay/NetplayDiscovery/index.ts +525 -0
- package/src/netplay/NetplayServer/index.ts +1407 -0
- package/src/netplay/SyncManager/index.ts +984 -0
- package/src/netplay/SyncManager/tests.ts +419 -0
- package/src/netplay/consts.ts +371 -0
- package/src/netplay/crc32/consts.ts +14 -0
- package/src/netplay/crc32/index.ts +97 -0
- package/src/netplay/crc32/tests.ts +40 -0
- package/src/netplay/index.ts +41 -0
- package/src/netplay/netplayLogger/consts.ts +30 -0
- package/src/netplay/netplayLogger/index.ts +345 -0
- package/src/netplay/protocol/consts.ts +86 -0
- package/src/netplay/protocol/index.ts +1280 -0
- package/src/netplay/protocol/tests.ts +606 -0
- package/src/netplay/protocol/types.ts +20 -0
- package/src/netplay/types.ts +395 -0
- package/src/rendering/KittyRenderer/index.ts +616 -0
- package/src/rendering/NativeRenderer/index.ts +279 -0
- package/src/rendering/NativeRenderer/tests.ts +133 -0
- package/src/rendering/TerminalRenderer/index.ts +770 -0
- package/src/rendering/consts.ts +401 -0
- package/src/rendering/fonts/CozetteVector.ttf +0 -0
- package/src/rendering/index.ts +26 -0
- package/src/rendering/nativeUi/NativeWindowManager/index.ts +158 -0
- package/src/rendering/nativeUi/NativeWindowManager/tests.ts +81 -0
- package/src/rendering/nativeUi/consts.ts +6 -0
- package/src/rendering/nativeUi/index.ts +20 -0
- package/src/rendering/postProcessing/consts.ts +38 -0
- package/src/rendering/postProcessing/index.ts +923 -0
- package/src/rendering/shared/ansi/consts.ts +12 -0
- package/src/rendering/shared/ansi/index.ts +104 -0
- package/src/rendering/shared/consts.ts +2 -0
- package/src/rendering/shared/fitToTerminal/index.ts +67 -0
- package/src/ui/AddRomsPrompt/consts.ts +13 -0
- package/src/ui/AddRomsPrompt/index.tsx +781 -0
- package/src/ui/App/consts.ts +2 -0
- package/src/ui/App/index.tsx +456 -0
- package/src/ui/AppCapabilities/index.tsx +67 -0
- package/src/ui/ConfigContext/index.tsx +56 -0
- package/src/ui/CoreManager/consts.ts +11 -0
- package/src/ui/CoreManager/index.tsx +779 -0
- package/src/ui/CoreSelector/consts.ts +2 -0
- package/src/ui/CoreSelector/index.tsx +251 -0
- package/src/ui/DialogContainer/index.tsx +42 -0
- package/src/ui/DialogOptionsList/index.tsx +61 -0
- package/src/ui/DuplicateCrcPrompt/consts.ts +5 -0
- package/src/ui/DuplicateCrcPrompt/index.tsx +146 -0
- package/src/ui/GamepadContext/consts.ts +15 -0
- package/src/ui/GamepadContext/index.tsx +295 -0
- package/src/ui/NativeDialog/index.tsx +120 -0
- package/src/ui/NetplayDisconnectedDialog/index.tsx +93 -0
- package/src/ui/NetplayPauseMenu/consts.ts +2 -0
- package/src/ui/NetplayPauseMenu/index.tsx +97 -0
- package/src/ui/RomBrowser/NetplayPanel/consts.ts +24 -0
- package/src/ui/RomBrowser/NetplayPanel/index.tsx +520 -0
- package/src/ui/RomBrowser/SettingsPanel/index.tsx +478 -0
- package/src/ui/RomBrowser/consts.ts +61 -0
- package/src/ui/RomBrowser/index.tsx +1164 -0
- package/src/ui/RomBrowser/settingsConfig/index.ts +320 -0
- package/src/ui/RomBrowser/types.ts +67 -0
- package/src/ui/SaveStateDialog/consts.ts +2 -0
- package/src/ui/SaveStateDialog/index.tsx +225 -0
- package/src/ui/WarningDialog/index.tsx +113 -0
- package/src/ui/consts.ts +27 -0
- package/src/ui/hooks/useClearTerminal/consts.ts +2 -0
- package/src/ui/hooks/useClearTerminal/index.ts +37 -0
- package/src/ui/hooks/useDialogNavigation/index.ts +99 -0
- package/src/ui/hooks/useGamepad/consts.ts +21 -0
- package/src/ui/hooks/useGamepad/index.ts +194 -0
- package/src/ui/index.ts +27 -0
- package/src/utils/buffer/consts.ts +17 -0
- package/src/utils/buffer/index.ts +129 -0
- package/src/utils/color/consts.ts +58 -0
- package/src/utils/color/index.ts +183 -0
- package/src/utils/compression/consts.ts +50 -0
- package/src/utils/compression/index.ts +101 -0
- package/src/utils/consts.ts +2 -0
- package/src/utils/crc32/consts.ts +22 -0
- package/src/utils/crc32/index.ts +83 -0
- package/src/utils/ensureDirectory/index.ts +10 -0
- package/src/utils/format/consts.ts +8 -0
- package/src/utils/format/index.ts +53 -0
- package/src/utils/getErrorMessage/index.ts +10 -0
- package/src/utils/index.ts +113 -0
- package/src/utils/ini/index.ts +200 -0
- package/src/utils/kitty/consts.ts +13 -0
- package/src/utils/kitty/index.ts +181 -0
- package/src/utils/logger/consts.ts +35 -0
- package/src/utils/logger/index.ts +217 -0
- package/src/utils/paths/consts.ts +18 -0
- package/src/utils/paths/index.ts +151 -0
- package/src/utils/png/consts.ts +34 -0
- package/src/utils/png/index.ts +131 -0
- package/src/utils/readJsonFile/index.ts +16 -0
- package/src/utils/rotateLogFile/index.ts +44 -0
- package/src/utils/safeClose/index.ts +10 -0
- package/src/utils/terminal/consts.ts +8 -0
- package/src/utils/terminal/index.ts +102 -0
- package/src/utils/thumbnailRenderer/consts.ts +2 -0
- package/src/utils/thumbnailRenderer/index.ts +147 -0
- package/src/utils/typedError/index.ts +26 -0
- package/tsconfig.json +31 -0
- package/vitest.config.ts +13 -0
package/eslint.config.js
ADDED
|
@@ -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,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;
|