diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..f071f3c --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,20 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "useTabs": true, + "tabWidth": 2, + "printWidth": 80, + "endOfLine": "crlf", + "singleQuote": true, + "semi": false, + "trailingComma": "all", + "arrowParens": "avoid", + "bracketSpacing": true, + "sortImports": true, + "ignorePatterns": ["**/dist", "bun.lock"], + "overrides": [ + { + "files": ["*.md"], + "options": { "embeddedLanguageFormatting": "off" } + } + ] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..7fe84d1 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,14 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["eslint", "typescript", "unicorn", "oxc", "import"], + "categories": { + "correctness": "error", + "suspicious": "warn" + }, + "rules": { + "typescript/no-explicit-any": "warn", + "typescript/no-unsafe-function-type": "warn", + "eslint/no-underscore-dangle": "off" + }, + "ignorePatterns": ["**/dist"] +} diff --git a/biome.json b/biome.json deleted file mode 100644 index b0a61b1..0000000 --- a/biome.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "vcs": { - "enabled": false, - "clientKind": "git", - "useIgnoreFile": false - }, - "files": { - "ignoreUnknown": false, - "includes": ["**", "!dist/*"] - }, - "formatter": { - "enabled": true - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "complexity": { - "noBannedTypes": "info" - }, - "suspicious": { - "noExplicitAny": "info" - } - } - }, - "javascript": { - "formatter": { - "arrowParentheses": "asNeeded", - "bracketSpacing": true, - "indentWidth": 2, - "lineEnding": "crlf", - "lineWidth": 80, - "quoteStyle": "single", - "semicolons": "asNeeded", - "trailingCommas": "all" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - } -} diff --git a/bun.lock b/bun.lock index 04c7721..4b23450 100644 --- a/bun.lock +++ b/bun.lock @@ -4,8 +4,9 @@ "workspaces": { "": { "devDependencies": { - "@biomejs/biome": "^2.1.1", "@types/bun": "^1.2.18", + "oxfmt": "^0.70.0", + "oxlint": "^1.85.0", }, "peerDependencies": { "typescript": "^5", @@ -33,24 +34,6 @@ }, }, "packages": { - "@biomejs/biome": ["@biomejs/biome@2.5.14", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.14", "@biomejs/cli-darwin-x64": "2.5.14", "@biomejs/cli-linux-arm64": "2.5.14", "@biomejs/cli-linux-arm64-musl": "2.5.14", "@biomejs/cli-linux-x64": "2.5.14", "@biomejs/cli-linux-x64-musl": "2.5.14", "@biomejs/cli-win32-arm64": "2.5.14", "@biomejs/cli-win32-x64": "2.5.14" }, "bin": { "biome": "bin/biome" } }, "sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw=="], - - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ=="], - - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA=="], - - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q=="], - - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ=="], - - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.14", "", { "os": "linux", "cpu": "x64" }, "sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA=="], - - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.14", "", { "os": "linux", "cpu": "x64" }, "sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg=="], - - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg=="], - - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.14", "", { "os": "win32", "cpu": "x64" }, "sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ=="], - "@citizenfx/client": ["@citizenfx/client@2.0.15015-1", "", {}, "sha512-gm0/fWM0/Wn5Hny+cnSRsBc73Opz1PPKS4LKCraIE477tQ0uGNVACoeTQqxRJz54Lu09KeA4cCfocVmefVAqUA=="], "@citizenfx/server": ["@citizenfx/server@2.0.14862-1", "", {}, "sha512-I6XnxIGBhskPe9S+q1OQLDqs6TYw1RhX06K6jUg+n0hGITYools6VBIIhdPe2uUlHA+76qJajQlV9ONeR3mDig=="], @@ -129,6 +112,82 @@ "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], + "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.70.0", "", { "os": "android", "cpu": "arm" }, "sha512-Xd7YO4/T2axEj6FTLcj4Why3mTBqFMg+x24xtorT4Lb2+1g82090GH0a/4U1m0pABGYiix2bq1pqkYrmV3f0Sw=="], + + "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.70.0", "", { "os": "android", "cpu": "arm64" }, "sha512-x9rlMYyKXdgKdYyUJzGsK1ZV8P4di/J32ipzcS6Jet6p9r9UAh28neXIMtdlSaJJycdi61Z4YkcLKLpk8ueFjg=="], + + "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.70.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-IUTUPvrBVYy7POh4stXzRdz4IVC/1QSaviCWoyenSlOhGu0X9j5K07vCTM9biLjAA2Zs31l0Rj5vvRpj9n95wA=="], + + "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.70.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-vw745q870oTd6J517O24asoX4/E+eK0nxYIFoedSLqgJ+nI5En7+ZS82iZSHZ69zevQrnOXiyHP01dA+t8xD8w=="], + + "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.70.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-NO14EgSM9dFkcg+MfGPxvsKqXYs9LKaxPrOKXpv1R0rLokGGFDcCq6dBMq18dE4wlpFOovX0UZY2uh1P30O7QA=="], + + "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.70.0", "", { "os": "linux", "cpu": "arm" }, "sha512-139OEhHarj9CYoJ/i9gXlPv4KLBGtLj2toseOWYFf09QwlhklaZk+wW3aOvlqoeZtuayvkoSNVWra7WJ21s3VQ=="], + + "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.70.0", "", { "os": "linux", "cpu": "arm" }, "sha512-GEh2PY3IWTE0M24eNhTduountANSbWyDmMnzFSQE/nGg/bjPugbUgiGuFu+xdqcQSd/HKSwH80/F2yVVD48yhA=="], + + "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.70.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-En5i+UJmZSPxuSf47F2Hl5YOzKB0bicQLnGQkeTCMQ35cWLtbrSwACJKfiLqRZrk05DwSnsJkhBRaM3OURtIaA=="], + + "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.70.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WWOoV5W9Im3flVwOVrWn/2DUlOF8v5vcCip+kcNuaMpulRCh6nzzt1Su2vcL2F908YJIXNV3HvegbBHuyLwKHg=="], + + "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.70.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-YUouneIqW+5n7aE8xx/zeZ6/utr/KH7oykcGoFyd8Uz8uh591T1oKlnoWA3BsRq/ZR42oY1w4MUYvS/0e/MQOA=="], + + "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.70.0", "", { "os": "linux", "cpu": "none" }, "sha512-iEnMf21S5aGVa4hViDGY8sAQ/AHyCu2JPyrQF8P06wtHhSkD1YJBeT4m/KiGewgf7+a5XCYSCRIPcRQa1xwEoQ=="], + + "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.70.0", "", { "os": "linux", "cpu": "none" }, "sha512-91Sdniaj20fQzyMeCxMDzTP4c9s4RB8dGQ308xHhDR0n6U7+1Xq7N9klE7mfXq8iV3lRmIGSXi5X23Hn/0XX/g=="], + + "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.70.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-uUV30M6E+2TKKGMaKiwfeL4RZrviHXlUxsrYJ/jFBb+1EZy+pnFT+hF73eeWdzh5NqPOAnw0iiMAIqjqiLZPFg=="], + + "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.70.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ivMcX6kNDPhqtbOaBt/ItFlLlTlXNHLgRuNmxP6Na6UuYXRT10llpJcAPbGeRgjjb3Qzv4jwPp3fB0hui50WNQ=="], + + "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.70.0", "", { "os": "linux", "cpu": "x64" }, "sha512-w+S+fERxYmlZSyZlJK/U292FjyBoH8cCEj21/tYJX6atX5kNSn+HDkhlFQKT2zcMwUW0uAtUL/bOrlwJZwqRdA=="], + + "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.70.0", "", { "os": "none", "cpu": "arm64" }, "sha512-Zlom1Xkx257R8bk4ZI4zJsrGno2opknz1+5v5baka3nn4FPyvNSdh8JUL4CdN1S1OWRMvJ9UJQ+RfIqGGCUEfA=="], + + "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.70.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-FQgPW5R17vzt7cgrJ8eG/dqX00o2xHsqFeLfw4xzA9FRHpN/DjFo9YDonvIIXGxiEuS9F/jZPnGO+KHNKuCo4Q=="], + + "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.70.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-ZfZublNhZ+XBndMiXhkiLlPE+XyGRDa0CweeTL6t1fZypfCh1LTg7e5CvnOeTBunq15MskOcRempumSPGAaCQA=="], + + "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.70.0", "", { "os": "win32", "cpu": "x64" }, "sha512-HlIZEn+WzLQL0DszNzldiRl/DPRCX5R0Vkt6qeUPR1YHwy52hZZo4x6HoTOVmKRP2wUiwPGtKsihNY/f8KRaBg=="], + + "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.85.0", "", { "os": "android", "cpu": "arm" }, "sha512-q2KO/Zso9UT+OMn0NF9ywn4E4t0MI3yxiDhNyhsQ7DyQJrC4FhFE4TXOi4bktFnOWXTMds8qZSbpv2XwRaNOBg=="], + + "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.85.0", "", { "os": "android", "cpu": "arm64" }, "sha512-SxLN3ALjoT9NNdvpjEevGeHvfzTAFrF0NBYB5tzK7/GtCKMze3j1e/m/X2ozqGj2U9hfGG/dg/OG8vpVK4PiDA=="], + + "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.85.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y/Sup/J4f0f9UGsSd/xyCNTeWL+gepO63GBdEDAfue9nBsnk9zMmnIXx1O6b1V8C90vB5nucYNZ0pbMXAp8zJA=="], + + "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.85.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ApOSNC04ynpDTwvBD+//0wyfODRSbEzvRoKpX8teffmc27z8AockwSNeMXGJXn5KP85eahDgR/2llICWLkzcnw=="], + + "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.85.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-bNrVrCOA/kHky3Tu79IXWXe5bhIgLXfUuUEDHlAGOHUk96MkvDZ1ecaQF19rwstrnaqfP1o9nBTqzIr9+ZHkUg=="], + + "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.85.0", "", { "os": "linux", "cpu": "arm" }, "sha512-NUrzOJ1s/EqsVvfn2L/1D8Wro2LPIZUbihL8kOJLh5fEdGEN3rdOGUYq3HwnUIL8sjpoP+4N6RaGrgmMJnaMPw=="], + + "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.85.0", "", { "os": "linux", "cpu": "arm" }, "sha512-UJXrAT3E/RWkEqXLIs2ehETja1qfgkPb+5gwLIIS+o/6cf+grHvoOXTa5997a/YNQfcJS0DRBTOfZt95cvOI1g=="], + + "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.85.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-lK40QLjI0HxigO7CjDDshEtfYIeiYS0020v5BHFPqN4uuQBQxd2K9LNom2dW15o9F1937quSCRVp4ZsVhdbYdg=="], + + "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.85.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-c2zbdBwGKreHXwRx3gWBuFGJxLhxgsg6YlZ+3H+RgRusU/UEV9jNwJ3HGYK+nRo0LvBa7mt6Kj86xoVotUo8cw=="], + + "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.85.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tlt/Hy8lZ97/lCPmCgw/B3k/mwh+BzaIPbPkldZEly7TwLmx0xe2CQcaW2g/rR0dOgS9JNGCZsMEqLhUNMGvaw=="], + + "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.85.0", "", { "os": "linux", "cpu": "none" }, "sha512-3tNR9Xey82X0zKuY1d8hJ6Rc9gwRDurmqGLnQZa5xqOXy8/YyiqFXjAtugkKLY82obOlpK1eSiDRlgcNPuxtIg=="], + + "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.85.0", "", { "os": "linux", "cpu": "none" }, "sha512-wbGRd5PqCcjkJFHhZuZ2OBSUQY9czlQsoA/cQQB9JK/L9mC5MQgGoKAh+xd8QjA5V+0D3j+Qd1lAWn1I8zlelA=="], + + "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.85.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-3Sn0kSrE4DPZCWV/8o+n4x3aFZxI9ulMnkYlwCbJ8eUVkwRK2IerohE/A/z3SNbCwoPFOCJmGE5Avrq0rrvdvQ=="], + + "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.85.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JY2pxxYfB62bAGfejljVCqc44etItehPuAyaeSAdMuEMtwNA00ggMnS66lC1oIhos6oOXUkuU6mZ9bpFh3BqWg=="], + + "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.85.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5k74vZ6qJBjBHEOlBk9B/iv68Yu0F1Afw/vvT2ar6OGCqEeXLaSjXz2n/IPCbhLG22UoKoYEJTzpYraRdcp6PA=="], + + "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.85.0", "", { "os": "none", "cpu": "arm64" }, "sha512-GbAl5qt5TCkPLXTaIISZJnugrcBhra6rodcXc9jYt620UtdsTt71NlNmJmm0frxzFpd54x/G+MkitEJA8I/BoA=="], + + "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.85.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-kjmws5MK0et2swk4ND85D7NVQyDHw162i6whtZDLUA/lo6FQyBZDcmMRCMcVZcNrAhIaftVb00x9ChGDOjjNJA=="], + + "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.85.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-eSsIJx9n4yxvOqYTZyPEMyEXRmE60XH7xGAU7i0Qbsn1lf6Za3CWJ9aRd82oSFKXaxhp+sA6/yMJVRIpLpna6A=="], + + "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.85.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pBebIPUpKKhWrhSMWhy8TdAZBewiXnfxmaAGxhzxM1068GagqFaTwgKlU6e+UyJ2sPR+VoHouhXuGJkQjsrDvA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.5", "", { "os": "android", "cpu": "arm" }, "sha512-J25QJU+B78T4FhhBsNpLJyVWOi31mwtpcMwywHmOKH65Q9IWGA81gPj+dnwlhU8wktVriYE+tFAaQgrnJRzAZg=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.5", "", { "os": "android", "cpu": "arm64" }, "sha512-LDopB3zuZM5Ux9TT2luNEBJW/tYbGU2g1d+VpKk6I+gSKDb+/7sYE6M225gRQt4RbMX6MSwMsVR/phdjVUgRLg=="], @@ -285,6 +344,10 @@ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "oxfmt": ["oxfmt@0.70.0", "", { "dependencies": { "tinypool": "2.1.2" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.70.0", "@oxfmt/binding-android-arm64": "0.70.0", "@oxfmt/binding-darwin-arm64": "0.70.0", "@oxfmt/binding-darwin-x64": "0.70.0", "@oxfmt/binding-freebsd-x64": "0.70.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.70.0", "@oxfmt/binding-linux-arm-musleabihf": "0.70.0", "@oxfmt/binding-linux-arm64-gnu": "0.70.0", "@oxfmt/binding-linux-arm64-musl": "0.70.0", "@oxfmt/binding-linux-ppc64-gnu": "0.70.0", "@oxfmt/binding-linux-riscv64-gnu": "0.70.0", "@oxfmt/binding-linux-riscv64-musl": "0.70.0", "@oxfmt/binding-linux-s390x-gnu": "0.70.0", "@oxfmt/binding-linux-x64-gnu": "0.70.0", "@oxfmt/binding-linux-x64-musl": "0.70.0", "@oxfmt/binding-openharmony-arm64": "0.70.0", "@oxfmt/binding-win32-arm64-msvc": "0.70.0", "@oxfmt/binding-win32-ia32-msvc": "0.70.0", "@oxfmt/binding-win32-x64-msvc": "0.70.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-IsHxZ4y0wQLLMhnrJblBJgZsLDzfULrJnAw5j/QqsTlMa/m3AqsbToi+W71uhBGaqlqq/PbbjvHc09TJwdv3Tw=="], + + "oxlint": ["oxlint@1.85.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.85.0", "@oxlint/binding-android-arm64": "1.85.0", "@oxlint/binding-darwin-arm64": "1.85.0", "@oxlint/binding-darwin-x64": "1.85.0", "@oxlint/binding-freebsd-x64": "1.85.0", "@oxlint/binding-linux-arm-gnueabihf": "1.85.0", "@oxlint/binding-linux-arm-musleabihf": "1.85.0", "@oxlint/binding-linux-arm64-gnu": "1.85.0", "@oxlint/binding-linux-arm64-musl": "1.85.0", "@oxlint/binding-linux-ppc64-gnu": "1.85.0", "@oxlint/binding-linux-riscv64-gnu": "1.85.0", "@oxlint/binding-linux-riscv64-musl": "1.85.0", "@oxlint/binding-linux-s390x-gnu": "1.85.0", "@oxlint/binding-linux-x64-gnu": "1.85.0", "@oxlint/binding-linux-x64-musl": "1.85.0", "@oxlint/binding-openharmony-arm64": "1.85.0", "@oxlint/binding-win32-arm64-msvc": "1.85.0", "@oxlint/binding-win32-ia32-msvc": "1.85.0", "@oxlint/binding-win32-x64-msvc": "1.85.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-bc26s97nuvPj1ViyPsqmKecVkUWFMEdtayO8MaQ6oiLfs1pj94cQlZZhrh4BPNlr9HQosjhIlwgZKsfcwmcNgg=="], + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -331,6 +394,8 @@ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + "tinypool": ["tinypool@2.1.2", "", {}, "sha512-9YodfrxS9g9IbFr/KOjE5bAeJ0p61n3bW6mqvy0jtoeKd1kTW1Cxm0oulm6KX2lyM9Gl6WIe8nEbY7LWv5ZJww=="], + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], diff --git a/package.json b/package.json index a88323f..3ca7d63 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,5 @@ { - "workspaces": [ - "rpc", - "shared-types" - ], - "devDependencies": { - "@biomejs/biome": "^2.1.1", - "@types/bun": "^1.2.18" - }, - "peerDependencies": { - "typescript": "^5" - }, - "scripts": { - "check": "bunx biome check", - "format": "bunx biome format --write" - }, "private": true, - "type": "module", "license": "CC0-1.0", "author": "Entity Seven Group", "contributors": [ @@ -33,5 +17,24 @@ "repository": { "type": "git", "url": "https://github.com/rilaxik/fivem-rpc.git" + }, + "workspaces": [ + "rpc", + "shared-types" + ], + "type": "module", + "scripts": { + "check": "oxfmt --check && oxlint", + "format": "oxfmt", + "format:check": "oxfmt --check", + "lint": "oxlint" + }, + "devDependencies": { + "@types/bun": "^1.2.18", + "oxfmt": "^0.70.0", + "oxlint": "^1.85.0" + }, + "peerDependencies": { + "typescript": "^5" } } diff --git a/readme.md b/readme.md index 223ef90..ae6997d 100644 --- a/readme.md +++ b/readme.md @@ -1,41 +1,54 @@ # FiveM RPC + is an all-in-one package with asynchronous RPC implementation for FiveM servers in JS/TS ## Installation + ```bash pnpm i @entityseven/fivem-rpc ``` + ```bash yarn add @entityseven/fivem-rpc ``` + ```bash bun add @entityseven/fivem-rpc ``` + It is highly recommended to also install additional package for enhanced typing + ```bash pnpm i @entityseven/fivem-rpc-shared-types -D ``` + ```bash yarn add @entityseven/fivem-rpc-shared-types --dev ``` + ```bash bun add @entityseven/fivem-rpc-shared-types -d ``` ## Docs + Can be found in [/rpc/readme.md](https://github.com/rilaxik/fivem-rpc/blob/master/rpc/readme.md) ## Features + - Type-Safe Development: Eliminate runtime errors and enhance code reliability with comprehensive type safety - All-in-one package: Communicate effortlessly between server, client and webview ## Contributing + Issues and pull requests are very welcome ## License + Licensed under Custom Attribution-NoDerivs Software License ## WIP + - client observers to catch events between server and webview (subscribe-like behaviour) - client observers to prevent events (middleware-like behaviour) -- player manager (transform player id to desired data straight from a listener) \ No newline at end of file +- player manager (transform player id to desired data straight from a listener) diff --git a/rpc/package.json b/rpc/package.json index 46ca8d6..d09e124 100644 --- a/rpc/package.json +++ b/rpc/package.json @@ -1,20 +1,14 @@ { "name": "@entityseven/fivem-rpc", - "description": "FiveM RPC is an all-in-one package with asynchronous RPC implementation for FiveM servers in JS/TS", "version": "0.1.0", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*", - "readme.md", - "license.md" - ], + "description": "FiveM RPC is an all-in-one package with asynchronous RPC implementation for FiveM servers in JS/TS", "keywords": [ + "fivem", "fivem-rpc", "fivem-rpc-shared-types", - "fivem", "gta" ], + "license": "Custom-Attribution-NoDerivs", "author": "Entity Seven Group", "contributors": [ { @@ -23,18 +17,24 @@ "url": "https://github.com/rilaxik/" } ], - "license": "Custom-Attribution-NoDerivs", "repository": { "type": "git", "url": "https://github.com/rilaxik/fivem-rpc.git" }, + "files": [ + "dist/**/*", + "readme.md", + "license.md" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", "scripts": { "build": "tsup" }, "devDependencies": { - "@microsoft/api-extractor": "^7.47.9", "@citizenfx/client": "^2.0.15015-1", "@citizenfx/server": "^2.0.14862-1", + "@microsoft/api-extractor": "^7.47.9", "tsup": "^8.3.0" }, "peerDependencies": { diff --git a/rpc/readme.md b/rpc/readme.md index 577e648..bdc7f99 100644 --- a/rpc/readme.md +++ b/rpc/readme.md @@ -1,32 +1,43 @@ # FiveM RPC + is an all-in package with asynchronous RPC implementation for RageMP servers in JS/TS. [Extra info](https://github.com/rilaxik/fivem-rpc/blob/master/readme.md) # Motivation + The idea was to create an extensible package, with various features to simplify the development process and provide as much comfort as possible. Inspired by usage of [altv-xrpc](https://github.com/xxshady/altv-xrpc) # Installation + ```bash pnpm i @entityseven/fivem-rpc ``` + ```bash yarn add @entityseven/fivem-rpc ``` + ```bash bun add @entityseven/fivem-rpc ``` + It is highly recommended to also install additional package for enhanced typing + ```bash pnpm i @entityseven/fivem-rpc-shared-types -D ``` + ```bash yarn add @entityseven/fivem-rpc-shared-types --dev ``` + ```bash bun add @entityseven/fivem-rpc-shared-types -d ``` ## Usage + FiveM RPC is meant to be a singletone per environment. This means you _must create only one_ `RPCFactory` per your server/client/web. This also enables modifying `const rpc` to your needs, adding new methods or variables by forcing you to import it from file instead of library reference + ```ts // lib/rpc.ts import { RPCFactory } from '@entityseven/fivem-rpc' @@ -36,21 +47,25 @@ export const rpc = new RPCFactory(/* options */).get() # Docs ## Extras + Along with `RPCFactory` you can also import all the types used internally, types for native client/server events and lists of native client/server events. All of that is documented in JSDoc, so no need to duplicate it here ## RPCConfig + ```ts type RPCConfig = { - env: T + env: T debug?: boolean } ``` + Failing to set `env` to provided type will result in `RPCErrors.UNKNOWN_ENVIRONMENT` `debug` adds additional console logs to events - ## Errors + Known errors could be one of following or an error throw by a callback specifically + ```ts enum RPCErrors { EVENT_NOT_REGISTERED = 'Event not registered', @@ -62,7 +77,9 @@ enum RPCErrors { ``` ### Example error + Values wrapped in `<>` always exist, just not relevant for an example. Keep in mind that some errors are thrown in their destination(`To`) point: this example will throw on server + ``` Error: No player (failed to resolve from local index) Event: 'clientServerEvent' @@ -75,77 +92,113 @@ Data: [] ``` ## Server ([source](https://github.com/rilaxik/fivem-rpc/blob/master/rpc/src/core/server.ts)) + ### onClient + Listens to client event + ```ts rpc.onClient('clientServerEvent', (player, arg1, arg2, ...rest) => { // logic return someData // this will be forwarded back to caller }) ``` + ### offClient + Stops listening to client event + ```ts rpc.offClient('clientServerEvent') ``` + ### emitClient + Sends event to specified client + ```ts -const response = await rpc.emitClient(playerServerId, 'serverClientEvent', someData) +const response = await rpc.emitClient(playerServerId, 'serverClientEvent', someData) // response will come from client listener with returned data ``` + ### emitClientEveryone + Sends event to all clients + ```ts rpc.emitClientEveryone('serverClientEvent', someData) ``` + ### onWebview + Listens to webview event + ```ts rpc.onWebview('webviewServerEvent', (player, arg1, arg2, ...rest) => { // logic return someData // this will be forwarded back to caller }) ``` + ### offWebview + Stops listening to webview event + ```ts rpc.offWebview('webviewServerEvent') ``` + ### emitWebview + Sends event to specified webview + ```ts const response = await rpc.emitWebview(playerServerId, 'serverWebviewEvent', someData) // response will come from webview listener with returned data ``` + ### onSelf + Listens to server event + ```ts rpc.onSelf('serverEvent', (arg1, arg2, ...rest) => { - // logic + // logic return someData // this will be forwarded back to caller }) ``` + ### offSelf + Stops listening to server event + ```ts rpc.offSelf('serverEvent') ``` + ### emitSelf + Sends event to server + ```ts const response = await rpc.emitSelf('serverEvent', someData) // response will come from server listener with returned data ``` + ### onCommand + Registers chat command. Since arguments are untyped you must validate them yourself + ```ts rpc.onCommand('serverCommand', (player, args, commandRaw) => { // logic }) ``` + ### onNativeEvent + Listens to native server event ([reference](https://docs.fivem.net/docs/scripting-reference/events/server-events/)) + ```ts rpc.onNativeEvent('playerJoining', (source, oldId) => { // logic @@ -153,148 +206,215 @@ rpc.onNativeEvent('playerJoining', (source, oldId) => { ``` ## Client ([source](https://github.com/rilaxik/fivem-rpc/blob/master/rpc/src/core/client.ts)) + ### onServer + Listens to server event + ```ts rpc.onServer('serverClientEvent', (arg1, arg2, ...rest) => { // logic return someData // this will be forwarded back to caller }) ``` + ### offServer + Stops listening to server event + ```ts rpc.offServer('serverClientEvent') ``` + ### emitServer + Sends event to server + ```ts const response = await rpc.emitServer('clientServerEvent', someData) // response will come from webview listener with returned data ``` + ### onWebview + Listens to webview event + ```ts rpc.onWebview('webviewClientEvent', (arg1, arg2, ...rest) => { // logic return someData // this will be forwarded back to caller }) ``` + ### offWebview + Stops listening to webview event + ```ts rpc.offWebview('webviewClientEvent') ``` + ### emitWebview + Sends event to specified webview + ```ts const response = await rpc.emitWebview('clientWebviewEvent', someData) // response will come from webview listener with returned data ``` + ### onSelf + Listens to client event + ```ts rpc.onSelf('clientEvent', (arg1, arg2, ...rest) => { - // logic + // logic return someData // this will be forwarded back to caller }) ``` + ### offSelf + Stops listening to client event + ```ts rpc.offSelf('clientEvent') ``` + ### emitSelf + Sends event to client + ```ts const response = await rpc.emitSelf('clientEvent', someData) // response will come from client listener with returned data ``` + ### onCommand + Registers chat command. Since arguments are untyped you must validate them yourself + ```ts rpc.onCommand('clientCommand', (player, args, commandRaw) => { // logic }) ``` + ### onNativeEvent + Listens to native client event ([reference](https://docs.fivem.net/docs/scripting-reference/events/client-events/)) + ```ts rpc.onNativeEvent('entityDamaged', (victim, culprit, weapon, baseDamage) => { // logic }) ``` + ### onNativeNetworkEvent + Listens to native client network event ([reference](https://docs.fivem.net/docs/game-references/game-events/)) + ```ts rpc.onNativeNetworkEvent('CEventShockingCarCrash', (entities, eventEntity, data) => { // logic }) ``` + ### setWebviewFocus + Sets or removes focus and cursor from own webview + ```ts rpc.setWebviewFocus(true /* focus */, true /* show cursor */) ``` ## Webview ([source](https://github.com/rilaxik/fivem-rpc/blob/master/rpc/src/core/webview.ts)) + ### onClient + Listens to client event + ```ts rpc.onClient('clientWebviewEvent', (arg1, arg2, ...rest) => { // logic return someData // this will be forwarded back to caller }) ``` + ### offClient + Stops listening to client event + ```ts rpc.offClient('clientWebviewEvent') ``` + ### emitClient + Sends event to own client + ```ts -const response = await rpc.emitClient('webviewClientEvent', someData) +const response = await rpc.emitClient('webviewClientEvent', someData) // response will come from client listener with returned data ``` + ### onServer + Listens to server event + ```ts rpc.onServer('serverWebviewEvent', (arg1, arg2, ...rest) => { // logic return someData // this will be forwarded back to caller }) ``` + ### offServer + Stops listening to server event + ```ts rpc.offServer('serverWebviewEvent') ``` + ### emitServer + Sends event to server + ```ts const response = await rpc.emitServer('webviewServerEvent', someData) // response will come from webview listener with returned data ``` + ### onSelf + Listens to webview event + ```ts rpc.onSelf('webviewEvent', (arg1, arg2, ...rest) => { - // logic + // logic return someData // this will be forwarded back to caller }) ``` + ### offSelf + Stops listening to webview event + ```ts rpc.offSelf('webviewEvent') ``` + ### emitSelf + Sends event to webview + ```ts const response = await rpc.emitSelf('webviewEvent', someData) // response will come from webview listener with returned data ``` # License + Licensed under Custom Attribution-NoDerivs Software License diff --git a/rpc/src/core/client.ts b/rpc/src/core/client.ts index 1bc064d..dd1cc94 100644 --- a/rpc/src/core/client.ts +++ b/rpc/src/core/client.ts @@ -1,4 +1,5 @@ import type * as s from '@entityseven/fivem-rpc-shared-types' + import { Emitter } from '../utils/emitter' import { generateUUID, parse, stringify, stringifyWeb } from '../utils/funcs' import { diff --git a/rpc/src/core/server.ts b/rpc/src/core/server.ts index 3807217..4aa41ff 100644 --- a/rpc/src/core/server.ts +++ b/rpc/src/core/server.ts @@ -1,4 +1,5 @@ import type * as s from '@entityseven/fivem-rpc-shared-types' + import { Emitter } from '../utils/emitter' import { generateUUID, parse, stringify } from '../utils/funcs' import { NATIVE_SERVER_EVENTS } from '../utils/native' diff --git a/rpc/src/core/webview.ts b/rpc/src/core/webview.ts index a92cb52..837fadb 100644 --- a/rpc/src/core/webview.ts +++ b/rpc/src/core/webview.ts @@ -1,4 +1,5 @@ import type * as s from '@entityseven/fivem-rpc-shared-types' + import { Emitter } from '../utils/emitter' import { generateUUID, stringify } from '../utils/funcs' import { diff --git a/shared-types/package.json b/shared-types/package.json index 344657c..b618f90 100644 --- a/shared-types/package.json +++ b/shared-types/package.json @@ -1,20 +1,14 @@ { "name": "@entityseven/fivem-rpc-shared-types", - "description": "Shared (enhanced) types for @entityseven/fivem-rpc. Highly recommended to install together", "version": "0.1.0", - "types": "types/types/index.d.ts", - "files": [ - "types/**/*", - "readme.md", - "license.md" - ], + "description": "Shared (enhanced) types for @entityseven/fivem-rpc. Highly recommended to install together", "keywords": [ - "fivem-rpc-shared-types", - "fivem-rpc", "fivem", + "fivem-rpc", + "fivem-rpc-shared-types", "gta" ], - "type": "module", + "license": "Custom-Attribution-NoDerivs", "author": "Entity Seven Group", "contributors": [ { @@ -23,11 +17,17 @@ "url": "https://github.com/rilaxik/" } ], - "license": "Custom-Attribution-NoDerivs", "repository": { "type": "git", "url": "https://github.com/rilaxik/fivem-rpc.git" }, + "files": [ + "types/**/*", + "readme.md", + "license.md" + ], + "type": "module", + "types": "types/types/index.d.ts", "peerDependencies": { "typescript": "^5" } diff --git a/shared-types/readme.md b/shared-types/readme.md index 2a23bfd..31f08bf 100644 --- a/shared-types/readme.md +++ b/shared-types/readme.md @@ -1,22 +1,29 @@ # FiveM RPC Shared Types + ### [Docs & Info](https://github.com/rilaxik/fivem-rpc/blob/master/readme.md) ## Installation + ```bash pnpm i @entityseven/fivem-rpc-shared-types -D ``` + ```bash yarn add @entityseven/fivem-rpc-shared-types --dev ``` + ```bash bun add @entityseven/fivem-rpc-shared-types -d ``` ## Usage + This package is an enhanced type support for `@entityseven/fivem-rpc`. It provides ability to strictly type your events for better dx. ## Example + This example is neat way to follow up but you can change it as you wish. It will use bun workspaces, pnpm workspaces work in a similar manner. Referring the following folder structure: + ```markdown apps/ - server/ @@ -38,131 +45,139 @@ apps/ - Environment folder: folder with server, client or webview code in it 1. Install this package as dev dependency in your root package or in each environment folder separately - ```markdown - apps/ - - server/ <- (if not installed root) - - client/ <- (if not installed root) - - webview/ <- (if not installed root) - - shared/ - - - package.json <- here - ``` + + ```markdown + apps/ + - server/ <- (if not installed root) + - client/ <- (if not installed root) + - webview/ <- (if not installed root) + - shared/ + + - package.json <- here + ``` 2. In `shared/` create folder `fivem-rpc` (or similar), inside it create `index.d.ts` - ```markdown - apps/ - - server/ - - client/ - - webview/ - - shared/ - - fivem-rpc/ - - index.d.ts <- here - - - package.json - ``` + + ```markdown + apps/ + - server/ + - client/ + - webview/ + - shared/ + - fivem-rpc/ + - index.d.ts <- here + + - package.json + ``` 3. In `index.d.ts` add following: - ```ts - declare module '@entityseven/fivem-rpc-shared-types' { - // Client commands names - export type RPCCommands_Client = '' - - // Server commands names - export type RPCCommands_Server = '' - - // Client -> Client events - export interface RPCEvents_Client {} - - // Client -> Server events - export interface RPCEvents_ClientServer {} - - // Client -> Webview events - export interface RPCEvents_ClientWebview {} - - // Server -> Server events - export interface RPCEvents_Server {} - - // Server -> Client events - export interface RPCEvents_ServerClient {} - - // Server -> Server events - export interface RPCEvents_ServerWebview {} - - // Webview -> Webview events - export interface RPCEvents_Webview {} - - // Webview -> Client events - export interface RPCEvents_WebviewClient {} - - // Webview -> Server events - export interface RPCEvents_WebviewServer {} - } - ``` + + ```ts + declare module '@entityseven/fivem-rpc-shared-types' { + // Client commands names + export type RPCCommands_Client = '' + + // Server commands names + export type RPCCommands_Server = '' + + // Client -> Client events + export interface RPCEvents_Client {} + + // Client -> Server events + export interface RPCEvents_ClientServer {} + + // Client -> Webview events + export interface RPCEvents_ClientWebview {} + + // Server -> Server events + export interface RPCEvents_Server {} + + // Server -> Client events + export interface RPCEvents_ServerClient {} + + // Server -> Server events + export interface RPCEvents_ServerWebview {} + + // Webview -> Webview events + export interface RPCEvents_Webview {} + + // Webview -> Client events + export interface RPCEvents_WebviewClient {} + + // Webview -> Server events + export interface RPCEvents_WebviewServer {} + } + ``` 4. We just created a declaration which will overwrite types from the package. Now we need our packages to refer to these types when linting `rpc` functions. To do this in each environment folder of your project in `tsconfig.json` do these: - ```json5 - { - "compilerOptions": { - "types": [ - "../shared/fivem-rpc/" // or your specific folder - ] - } - } - ``` + ```json5 + { + "compilerOptions": { + "types": [ + "../shared/fivem-rpc/" // or your specific folder + ] + } + } + ``` 5. We also need to populate interfaces we created in step 3. + - `RPCCommands_Client` and `RPCCommands_Server` will include your commands names an union strings: - ```ts - export type RPCCommands_Client = 'afk' | 'vanish' | '...' // example names - export type RPCCommands_Server = 'report' | 'ban' | '...' // example names - ``` + ```ts + export type RPCCommands_Client = 'afk' | 'vanish' | '...' // example names + export type RPCCommands_Server = 'report' | 'ban' | '...' // example names + ``` - Other interfaces will include your events types. The example will show one but all of the work same way - ```ts - export interface RPCEvents_ClientServer { - clientToServerEventName(data: string, moreData: boolean): number - "client-to-server-event-name"(data: string, moreData: boolean): number // can also include characters you cannot use as variable or function names - } - ``` - - `clientToServerEventName` or `client-to-server-event-name` is an event name - - `data` and `moreData` are the arguments you need to pass when calling an event and argument you will receive when listening (may also include extra, as player, check type hints) - - `number` is a return type that will be forwarded back to caller - - Doing this will create type hints for you: - ```ts - // assuming this is in client - const response /* number */ = await rpc.emitServer( - 'clientToServerEventName', /* suggested name */ - 'data', /* will pass typecheck */ - 'moreData', /* will NOT pass typecheck, since required type is `boolean` */ - ) - ``` + + ```ts + export interface RPCEvents_ClientServer { + clientToServerEventName(data: string, moreData: boolean): number + "client-to-server-event-name"(data: string, moreData: boolean): number // can also include characters you cannot use as variable or function names + } + ``` + - `clientToServerEventName` or `client-to-server-event-name` is an event name + - `data` and `moreData` are the arguments you need to pass when calling an event and argument you will receive when listening (may also include extra, as player, check type hints) + - `number` is a return type that will be forwarded back to caller + + Doing this will create type hints for you: + + ```ts + // assuming this is in client + const response /* number */ = await rpc.emitServer( + 'clientToServerEventName', /* suggested name */ + 'data', /* will pass typecheck */ + 'moreData', /* will NOT pass typecheck, since required type is `boolean` */ + ) + ``` ## Example (alternative) + If previous example does not work or you do not like you can also try it this way. Steps that are not mentioned are the same as previous 2. In `shared/` create folders `declarations/fivem-rpc`, inside it create `index.d.ts` - ```markdown - apps/ - - server/ - - client/ - - webview/ - - shared/ - - declarations/ - - fivem-rpc/ - - index.d.ts <- here - - - package.json - ``` -4. We just created a declaration which will overwrite types from the package. Now we need our packages to refer to these types when linting `rpc` functions. To do this in each environment folder of your project in `tsconfig.json` do these: - ```json5 - { - "compilerOptions": { - "typeRoots": [ - "../shared/declarations/", // or your specific folder - "../../node_modules/@types", // you may also want to add this if some of your other libraries are not showing types now - ] - } - } - ``` + ```markdown + apps/ + - server/ + - client/ + - webview/ + - shared/ + - declarations/ + - fivem-rpc/ + - index.d.ts <- here -If a any point this stops working for you, do your research on how to redeclare library types and refer to it \ No newline at end of file + - package.json + ``` + +3. We just created a declaration which will overwrite types from the package. Now we need our packages to refer to these types when linting `rpc` functions. To do this in each environment folder of your project in `tsconfig.json` do these: + ```json5 + { + "compilerOptions": { + "typeRoots": [ + "../shared/declarations/", // or your specific folder + "../../node_modules/@types", // you may also want to add this if some of your other libraries are not showing types now + ] + } + } + ``` + +If a any point this stops working for you, do your research on how to redeclare library types and refer to it