From 44d06c2c8b54e595c5b86abfb3ade6e1dd91d054 Mon Sep 17 00:00:00 2001 From: LeonardSSH Date: Fri, 24 Dec 2021 03:51:01 +0200 Subject: [PATCH] feat: more type-safe & static type-definitions --- .github/workflows/continuous-delivery.yml | 1 + api-extractor.json | 56 ------- package.json | 4 +- pnpm-lock.yaml | 150 ------------------ src/@types/index.d.ts | 13 -- src/helpers.ts | 14 ++ src/index.ts | 102 ++++++------ tsconfig.eslint.json | 2 +- types/index.d.ts | 179 ++++++++++++++++++++++ 9 files changed, 255 insertions(+), 266 deletions(-) delete mode 100644 api-extractor.json delete mode 100644 src/@types/index.d.ts create mode 100644 types/index.d.ts diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index ddb6870..8490c8b 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -70,6 +70,7 @@ jobs: rsync -vaI README.md out/ rsync -vaI LICENSE out/ rsync -vaI dist/ out/dist + rsync -vaI types/index.d.ts out/dist echo -e "\n# Commit and push" cd out diff --git a/api-extractor.json b/api-extractor.json deleted file mode 100644 index 0a08ad9..0000000 --- a/api-extractor.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "dist/src/index.d.ts", - "projectFolder": "./src", - "apiReport": { - "enabled": true, - "reportFolder": "/temp/" - }, - "docModel": { - "enabled": true - }, - "dtsRollup": { - "enabled": true, - "publicTrimmedFilePath": "./dist/index.d.ts" - }, - "tsdocMetadata": { - "enabled": false - }, - "messages": { - "compilerMessageReporting": { - "default": { - "logLevel": "warning" - } - }, - "extractorMessageReporting": { - "default": { - "logLevel": "warning", - "addToApiReportFile": true - }, - "ae-missing-release-tag": { - "logLevel": "none" - } - }, - - "tsdocMessageReporting": { - "default": { - "logLevel": "warning" - }, - "tsdoc-undefined-tag": { - "logLevel": "none" - }, - "tsdoc-escape-greater-than": { - "logLevel": "none" - }, - "tsdoc-malformed-inline-tag": { - "logLevel": "none" - }, - "tsdoc-escape-right-brace": { - "logLevel": "none" - }, - "tsdoc-unnecessary-backslash": { - "logLevel": "none" - } - } - } -} diff --git a/package.json b/package.json index 590b0c9..b873015 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,7 @@ "prepare": "husky install .github/husky", "prebuild": "pnpm run clean", "build": "rollup -c ./scripts/rollup.config.js", - "postbuild": "pnpm run types && rimraf ./dist/src && pnpm pack", - "types": "api-extractor run --local --verbose", + "postbuild": "rimraf ./dist/src && pnpm pack", "clean": "rimraf {dist,*.tgz}", "watch": "rollup -w -c ./scripts/rollup.config.js", "update": "pnpm update --latest --interactive", @@ -39,7 +38,6 @@ "devDependencies": { "@commitlint/cli": "^15.0.0", "@commitlint/config-conventional": "^15.0.0", - "@microsoft/api-extractor": "^7.19.2", "@rollup/plugin-node-resolve": "^13.1.1", "@types/node": "^17.0.2", "@typescript-eslint/eslint-plugin": "^5.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 398816a..fef4a7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,7 +3,6 @@ lockfileVersion: 5.3 specifiers: '@commitlint/cli': ^15.0.0 '@commitlint/config-conventional': ^15.0.0 - '@microsoft/api-extractor': ^7.19.2 '@rollup/plugin-node-resolve': ^13.1.1 '@types/node': ^17.0.2 '@typescript-eslint/eslint-plugin': ^5.8.0 @@ -27,7 +26,6 @@ specifiers: devDependencies: '@commitlint/cli': 15.0.0 '@commitlint/config-conventional': 15.0.0 - '@microsoft/api-extractor': 7.19.2 '@rollup/plugin-node-resolve': 13.1.1_rollup@2.61.1 '@types/node': 17.0.2 '@typescript-eslint/eslint-plugin': 5.8.0_836011a006f4f5d67178564baf2b6d34 @@ -258,45 +256,6 @@ packages: resolution: { integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== } dev: true - /@microsoft/api-extractor-model/7.15.1: - resolution: { integrity: sha512-DWfS1o3oMY0mzdO3OuQbD/9vzn80jwM6tFd7XbiYnkpxwhD83LMGXz7NZWwSh+IaA+9w3LF4w62fT31Qq+dAMw== } - dependencies: - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.44.2 - dev: true - - /@microsoft/api-extractor/7.19.2: - resolution: { integrity: sha512-LxSa9lwp7eYtM4i5y/1n79QpotPKlmpCrVQbkb0LAHE1sCRHpZDTb6p3cMJthDhYPMjAYKOLfq639GwtZrg23Q== } - hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.15.1 - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.44.2 - '@rushstack/rig-package': 0.3.6 - '@rushstack/ts-command-line': 4.10.5 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.17.0 - semver: 7.3.5 - source-map: 0.6.1 - typescript: 4.5.4 - dev: true - - /@microsoft/tsdoc-config/0.15.2: - resolution: { integrity: sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA== } - dependencies: - '@microsoft/tsdoc': 0.13.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true - - /@microsoft/tsdoc/0.13.2: - resolution: { integrity: sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg== } - dev: true - /@nodelib/fs.scandir/2.1.5: resolution: { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } engines: { node: '>= 8' } @@ -353,36 +312,6 @@ packages: picomatch: 2.3.0 dev: true - /@rushstack/node-core-library/3.44.2: - resolution: { integrity: sha512-lQ8Ct267UKkNSJSDxpBWn7SyyITWQ9l3Xqww0V+YY0rMt02r9eiGvwwPaU1ugJW7IMVo6r/HXvgbmpOSPyzGyg== } - dependencies: - '@types/node': 12.20.24 - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.17.0 - semver: 7.3.5 - timsort: 0.3.0 - z-schema: 5.0.2 - dev: true - - /@rushstack/rig-package/0.3.6: - resolution: { integrity: sha512-H/uFsAT6cD4JCYrlQXYMZg+wPVECByFoJLGqfGRiTwSS5ngQw9QxnFV2mPG2LrxFUsMjLQ2lsrYr523700XzfA== } - dependencies: - resolve: 1.17.0 - strip-json-comments: 3.1.1 - dev: true - - /@rushstack/ts-command-line/4.10.5: - resolution: { integrity: sha512-5fVlTDbKsJ5WyT6L7NrnOlLG3uoITKxoqTPP2j0QZEi95kPbVT4+VPZaXXDJtkrao9qrIyig8pLK9WABY1bb3w== } - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.1 - dev: true - /@ts-type/package-dts/1.0.56_@types+node@17.0.2: resolution: { integrity: sha512-nBjbCaVV+R81jk7q/6sRuNYOhDAbBOmaCkPI2quK0Rnye2f4FUHX+4JL+3rDPiRPHxgX3pNfVKKHBlPAHiRddw== } dependencies: @@ -394,10 +323,6 @@ packages: - ts-toolbelt dev: true - /@types/argparse/1.0.38: - resolution: { integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== } - dev: true - /@types/estree/0.0.39: resolution: { integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== } dev: true @@ -414,10 +339,6 @@ packages: resolution: { integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== } dev: true - /@types/node/12.20.24: - resolution: { integrity: sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== } - dev: true - /@types/node/17.0.2: resolution: { integrity: sha512-JepeIUPFDARgIs0zD/SKPgFsJEAF0X5/qO80llx59gOxFTboS9Amv3S+QfB7lqBId5sFXJ99BN0J6zFRvL9dDA== } dev: true @@ -658,12 +579,6 @@ packages: resolution: { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } dev: true - /argparse/1.0.10: - resolution: { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse/2.0.1: resolution: { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } dev: true @@ -849,11 +764,6 @@ packages: resolution: { integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== } dev: true - /colors/1.2.5: - resolution: { integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== } - engines: { node: '>=0.1.90' } - dev: true - /commander/2.20.3: resolution: { integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== } requiresBuild: true @@ -1446,15 +1356,6 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/7.0.1: - resolution: { integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== } - engines: { node: '>=6 <7 || >=8' } - dependencies: - graceful-fs: 4.2.8 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs-extra/8.1.0: resolution: { integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== } engines: { node: '>=6 <7 || >=8' } @@ -1680,11 +1581,6 @@ packages: resolve-from: 4.0.0 dev: true - /import-lazy/4.0.0: - resolution: { integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== } - engines: { node: '>=8' } - dev: true - /imurmurhash/0.1.4: resolution: { integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= } engines: { node: '>=0.8.19' } @@ -1819,10 +1715,6 @@ packages: supports-color: 7.2.0 dev: true - /jju/1.4.0: - resolution: { integrity: sha1-o6vicYryQaKykE+EpiWXDzia4yo= } - dev: true - /js-tokens/4.0.0: resolution: { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } dev: true @@ -1946,10 +1838,6 @@ packages: resolution: { integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= } dev: true - /lodash.isequal/4.5.0: - resolution: { integrity: sha1-QVxEePK8wwEgwizhDtMib30+GOA= } - dev: true - /lodash.map/4.6.0: resolution: { integrity: sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= } dev: true @@ -2436,19 +2324,6 @@ packages: global-dirs: 0.1.1 dev: true - /resolve/1.17.0: - resolution: { integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== } - dependencies: - path-parse: 1.0.7 - dev: true - - /resolve/1.19.0: - resolution: { integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== } - dependencies: - is-core-module: 2.8.0 - path-parse: 1.0.7 - dev: true - /resolve/1.20.0: resolution: { integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== } dependencies: @@ -2686,10 +2561,6 @@ packages: readable-stream: 3.6.0 dev: true - /sprintf-js/1.0.3: - resolution: { integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= } - dev: true - /string-argv/0.3.1: resolution: { integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== } engines: { node: '>=0.6.19' } @@ -2835,10 +2706,6 @@ packages: readable-stream: 3.6.0 dev: true - /timsort/0.3.0: - resolution: { integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= } - dev: true - /tmp/0.0.33: resolution: { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== } engines: { node: '>=0.6.0' } @@ -2997,11 +2864,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /validator/13.7.0: - resolution: { integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== } - engines: { node: '>= 0.10' } - dev: true - /which/1.3.1: resolution: { integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== } hasBin: true @@ -3090,15 +2952,3 @@ packages: resolution: { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } engines: { node: '>=10' } dev: true - - /z-schema/5.0.2: - resolution: { integrity: sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw== } - engines: { node: '>=8.0.0' } - hasBin: true - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.7.0 - optionalDependencies: - commander: 2.20.3 - dev: true diff --git a/src/@types/index.d.ts b/src/@types/index.d.ts deleted file mode 100644 index ad3bc64..0000000 --- a/src/@types/index.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -// eslint-disable-next-line no-var -declare var mp: any; - -declare interface BrowserMp { - url: string; - execute: (code: string) => void; - [property: string]: any; -} - -declare interface PlayerMp { - call: (eventName: string, args?: any[]) => void; - [property: string]: any; -} diff --git a/src/helpers.ts b/src/helpers.ts index 1f7d480..f828ad5 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,3 +1,17 @@ +// eslint-disable-next-line no-var +export var mp: any; + +export interface BrowserMp { + url: string; + execute: (code: string) => void; + [property: string]: any; +} + +export interface PlayerMp { + call: (eventName: string, args?: any[]) => void; + [property: string]: any; +} + enum MpTypes { Blip = 'b', Checkpoint = 'cp', diff --git a/src/index.ts b/src/index.ts index 22838a7..8ef6c9d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,17 @@ -import { getEnvironment, isBrowserValid, parseData, stringifyData, generateId, chunkSubstr, promiseTimeout, setDebugMode, log } from './helpers'; +import { + getEnvironment, + isBrowserValid, + parseData, + stringifyData, + generateId, + chunkSubstr, + promiseTimeout, + setDebugMode, + log, + PlayerMp, + BrowserMp, + mp +} from './helpers'; export type ProcedureListener = (args: any, info: ProcedureListenerInfo) => any; @@ -280,8 +293,8 @@ function sendEventData(event: Event, player?: PlayerMp) { * @returns The function, which unregister the event. */ export function register(name: string, cb: ProcedureListener) { - if (arguments.length !== 2) { - throw new Error(`register expects 2 arguments: "name" and "cb" ("${name}")`); + if (typeof name !== 'string' || !cb || typeof cb !== 'function') { + throw new Error(`register expects 2 arguments: "name" and "cb" - ("${name}")`); } log(`Registered procedure "${name}"`); @@ -300,8 +313,8 @@ export function register(name: string, cb: ProcedureListener) { * @param {string} name - The name of the procedure. */ export function unregister(name: string) { - if (arguments.length !== 1) { - throw new Error(`unregister expects 1 argument: "name" ("${name}")`); + if (typeof name !== 'string') { + throw new Error(`unregister expects 1 argument: "name" - ("${name}")`); } log(`Unregistered procedure "${name}"`); @@ -324,8 +337,8 @@ export function unregister(name: string) { * @returns The result from the procedure. */ export function call(name: string, args?: any, options: CallOptions = {}): Promise { - if (arguments.length < 1 || arguments.length > 3) { - return Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${name}")`); + if (typeof name !== 'string') { + return Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${name}")`); } return promiseTimeout(callProcedure(name, args, { environment }), options.timeout); @@ -374,8 +387,8 @@ function _callServer(name: string, args?: any, extraData: any = {}): Pr * @returns The result from the procedure. */ export function callServer(name: string, args?: any, options: CallOptions = {}): Promise { - if (arguments.length < 1 || arguments.length > 3) { - return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${name}")`); + if (typeof name !== 'string') { + return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${name}")`); } const extraData: any = {}; @@ -464,9 +477,9 @@ export function callClient(player: PlayerMp | string, name?: string | a // @ts-ignore gives access to assign 'null' type player = null; - if (arguments.length < 1 || arguments.length > 3 || typeof name !== 'string') { + if (typeof name !== 'string') { return Promise.reject( - `callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${name}")` + `callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${name}")` ); } @@ -474,9 +487,9 @@ export function callClient(player: PlayerMp | string, name?: string | a } case 'server': { - if (arguments.length < 2 || arguments.length > 4 || typeof player !== 'object') { + if (typeof name !== 'string' || typeof player !== 'object') { return Promise.reject( - `callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${name}")` + `callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" - ("${name}")` ); } @@ -491,9 +504,9 @@ export function callClient(player: PlayerMp | string, name?: string | a // @ts-ignore gives access to assign 'null' type player = null; - if (arguments.length < 1 || arguments.length > 3 || typeof name !== 'string') { + if (typeof name !== 'string') { return Promise.reject( - `callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${name}")` + `callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${name}")` ); } @@ -581,9 +594,9 @@ export function callBrowsers(player: PlayerMp | string, name?: string | args = name; name = player; - if (arguments.length < 1 || arguments.length > 3) { + if (typeof name !== 'string') { return Promise.reject( - `callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${name}")` + `callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${name}")` ); } @@ -596,9 +609,9 @@ export function callBrowsers(player: PlayerMp | string, name?: string | } case 'server': - if (arguments.length < 2 || arguments.length > 4) { + if (typeof name !== 'string' || typeof player !== 'object') { return Promise.reject( - `callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${name}")` + `callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" - ("${name}")` ); } @@ -630,11 +643,12 @@ export function callBrowsers(player: PlayerMp | string, name?: string | */ export function callBrowser(browser: BrowserMp, name: string, args?: any, options: CallOptions = {}): Promise { if (environment !== 'client') { - return Promise.reject(`callBrowser can only be used in the client environment ("${name}")`); + return Promise.reject(`callBrowser can only be used in the client environment - ("${name}")`); } - if (arguments.length < 2 || arguments.length > 4) - return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${name}")`); + if (!isBrowserValid(browser) || typeof name !== 'string') { + return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" - ("${name}")`); + } const extraData: any = {}; @@ -659,8 +673,8 @@ function callEvent(name: string, args: any, info: ProcedureListenerInfo) { * @returns The function, which off the event. */ export function on(name: string, cb: ProcedureListener) { - if (arguments.length !== 2) { - throw new Error(`on expects 2 arguments: "name" and "cb" ("${name}")`); + if (typeof name !== 'string' || !cb || typeof cb !== 'function') { + throw new Error(`on expects 2 arguments: "name" and "cb" - ("${name}")`); } log(`Registered procedure listener "${name}"`); @@ -679,8 +693,8 @@ export function on(name: string, cb: ProcedureListener) { * @param {ProcedureListener} cb - The callback for the event. */ export function off(name: string, cb: ProcedureListener) { - if (arguments.length !== 2) { - throw new Error(`off expects 2 arguments: "name" and "cb" ("${name}")`); + if (typeof name !== 'string' || !cb || typeof cb !== 'function') { + throw new Error(`off expects 2 arguments: "name" and "cb" - ("${name}")`); } const listeners = glob.__rpcEvListeners[name]; @@ -700,8 +714,8 @@ export function off(name: string, cb: ProcedureListener) { * @param args - Any parameters for the event. */ export function trigger(name: string, args?: any) { - if (arguments.length < 1 || arguments.length > 2) { - throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${name}")`); + if (typeof name !== 'string') { + throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${name}")`); } callEvent(name, args, { environment }); @@ -725,19 +739,21 @@ export function triggerClient(player: PlayerMp | string, name?: string | any, ar // @ts-ignore gives access to assign 'null' type player = null; - if (arguments.length < 1 || arguments.length > 2 || typeof name !== 'string') { - throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${name}")`); + if (typeof name !== 'string') { + throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${name}")`); } break; } + case 'server': { - if (arguments.length < 2 || arguments.length > 3 || typeof player !== 'object') { - throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${name}")`); + if (typeof name !== 'string' || typeof player !== 'object') { + throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" - ("${name}")`); } break; } + case 'cef': { args = name; name = player; @@ -745,8 +761,8 @@ export function triggerClient(player: PlayerMp | string, name?: string | any, ar // @ts-ignore gives access to assign 'null' type player = null; - if (arguments.length < 1 || arguments.length > 2 || typeof name !== 'string') { - throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${name}")`); + if (typeof name !== 'string') { + throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" - ("${name}")`); } break; @@ -765,8 +781,8 @@ export function triggerClient(player: PlayerMp | string, name?: string | any, ar * @param args - Any parameters for the event. */ export function triggerServer(name: string, args?: any) { - if (arguments.length < 1 || arguments.length > 2) { - throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${name}")`); + if (typeof name !== 'string') { + throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" - ("${name}")`); } void _callServer(TRIGGER_EVENT, [name, args], { noRet: 1 }); @@ -791,16 +807,16 @@ export function triggerBrowsers(player: PlayerMp | string, name?: string | any, // @ts-ignore gives access to assign 'null' type player = null; - if (arguments.length < 1 || arguments.length > 2) { - throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${name}")`); + if (typeof name !== 'string') { + throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${name}")`); } break; } case 'server': { - if (arguments.length < 2 || arguments.length > 3) { - throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${name}")`); + if (typeof name !== 'string' || typeof player !== 'object') { + throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" - ("${name}")`); } break; @@ -821,11 +837,11 @@ export function triggerBrowsers(player: PlayerMp | string, name?: string | any, */ export function triggerBrowser(browser: BrowserMp, name: string, args?: any) { if (environment !== 'client') { - throw new Error(`callBrowser can only be used in the client environment ("${name}")`); + throw new Error(`callBrowser can only be used in the client environment - ("${name}")`); } - if (arguments.length < 2 || arguments.length > 4) { - throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${name}")`); + if (!isBrowserValid(browser) || typeof name !== 'string') { + throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" - ("${name}")`); } void _callBrowser(browser, TRIGGER_EVENT, [name, args], { noRet: 1 }); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 87a1c6b..92e4552 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.base.json", - "include": ["src/**/*.ts", "scripts"] + "include": ["src/**/*.ts", "scripts", "types"] } diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..2189185 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,179 @@ +declare interface BrowserMp { + url: string; + execute: (code: string) => void; + [property: string]: any; +} + +declare interface PlayerMp { + call: (eventName: string, args?: any[]) => void; + [property: string]: any; +} + +export declare type ProcedureListener = (args: any, info: ProcedureListenerInfo) => any; + +export declare interface ProcedureListenerInfo { + environment: string; + id?: string; + player?: PlayerMp; + browser?: BrowserMp; +} + +/** + * Calls a local procedure. Only procedures registered in the same context will be resolved. + * + * Can be called from any environment. + * + * @param name - The name of the locally registered procedure. + * @param args - Any parameters for the procedure. + * @param options - Any options. + * @returns The result from the procedure. + */ +export declare function call(name: string, args?: any, options?: CallOptions): Promise; + +/** + * Calls a remote procedure registered in a specific browser instance. + * + * Client-side environment only. + * + * @param browser - The browser instance. + * @param name - The name of the registered procedure. + * @param args - Any parameters for the procedure. + * @param options - Any options. + * @returns The result from the procedure. + */ +export declare function callBrowser(browser: BrowserMp, name: string, args?: any, options?: CallOptions): Promise; + +/** + * Calls a remote procedure registered in any browser context. + * + * Can be called from any environment. + * + * @param player - The player to call the procedure on. + * @param name - The name of the registered procedure. + * @param args - Any parameters for the procedure. + * @param options - Any options. + * @returns The result from the procedure. + */ +export declare function callBrowsers(name: string, args?: any, options?: CallOptions): Promise | undefined; +export declare function callBrowsers(player: PlayerMp, name: string, args?: any, options?: CallOptions): Promise | undefined; + +/** + * Calls a remote procedure registered on the client. + * + * Can be called from any environment. + * + * @param player - The player to call the procedure on. + * @param name - The name of the registered procedure. + * @param args - Any parameters for the procedure. + * @param options - Any options. + * @returns The result from the procedure. + */ +export declare function callClient(name: string, args?: any, options?: CallOptions): Promise; +export declare function callClient(player: PlayerMp, name: string, args?: any, options?: CallOptions): Promise; + +export declare interface CallOptions { + timeout?: number; + noRet?: boolean; +} + +/** + * Calls a remote procedure registered on the server. + * + * Can be called from any environment. + * + * @param name - The name of the registered procedure. + * @param args - Any parameters for the procedure. + * @param options - Any options. + * @returns The result from the procedure. + */ +export declare function callServer(name: string, args?: any, options?: CallOptions): Promise; + +/** + * Unregister an event handler. + * @param {string} name - The name of the event. + * @param {ProcedureListener} cb - The callback for the event. + */ +export declare function off(name: string, cb: ProcedureListener): void; + +/** + * Register an event handler. + * @param {string} name - The name of the event. + * @param {ProcedureListener} cb - The callback for the event. + * @returns The function, which off the event. + */ +export declare function on(name: string, cb: ProcedureListener): () => void; + +/** + * Register a procedure. + * @param {string} name - The name of the procedure. + * @param {ProcedureListener} cb - The procedure's callback. The return value will be sent back to the caller. + * @returns The function, which unregister the event. + */ +export declare function register(name: string, cb: ProcedureListener): () => void; + +export declare function setDebugMode(state: boolean): void; + +/** + * Triggers a local event. Only events registered in the same context will be triggered. + * + * Can be called from any environment. + * + * @param name - The name of the locally registered event. + * @param args - Any parameters for the event. + */ +export declare function trigger(name: string, args?: any): void; + +/** + * Triggers an event registered in a specific browser instance. + * + * Client-side environment only. + * + * @param browser - The browser instance. + * @param name - The name of the event. + * @param args - Any parameters for the event. + */ +export declare function triggerBrowser(browser: BrowserMp, name: string, args?: any): void; + +/** + * Triggers an event registered in any browser context. + * + * Can be called from any environment. + * + * @param player - The player to call the procedure on. + * @param name - The name of the event. + * @param args - Any parameters for the event. + */ +export declare function triggerBrowsers(name: string, args?: any): void; +export declare function triggerBrowsers(player: PlayerMp, name: string, args?: any): void; + +/** + * Triggers an event registered on the client. + * + * Can be called from any environment. + * + * @param player - The player to call the procedure on. + * @param name - The name of the event. + * @param args - Any parameters for the event. + */ +export declare function triggerClient(name: string, args?: any): void; +export declare function triggerClient(player: PlayerMp, name: string, args?: any): void; + +/** + * Triggers an event registered on the server. + * + * Can be called from any environment. + * + * @param name - The name of the event. + * @param args - Any parameters for the event. + */ +export declare function triggerServer(name: string, args?: any): void; + +/** + * Unregister a procedure. + * @param {string} name - The name of the procedure. + */ +export declare function unregister(name: string): void; + +export declare const version: string; + +export {};