diff --git a/.gitignore b/.gitignore index 1e5da3933..7071d55ac 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,4 @@ twa/*.apk twa/*.aab twa/assetlinks.json +tsconfig.json diff --git a/connection.js b/connection.js index 10d164cb7..74ee7552f 100644 --- a/connection.js +++ b/connection.js @@ -10,7 +10,7 @@ import { connectionEstablished, connectionFailed, constructOptions -} from './react/features/base/connection/actions'; +} from './react/features/base/connection/actions.web'; import { openDialog } from './react/features/base/dialog/actions'; import { setJWT } from './react/features/base/jwt'; import { diff --git a/globals.native.d.ts b/globals.native.d.ts new file mode 100644 index 000000000..989bb4d78 --- /dev/null +++ b/globals.native.d.ts @@ -0,0 +1,21 @@ +import { IConfig } from "./react/features/base/config/configType"; + +export {}; + +interface IWindow { + JITSI_MEET_LITE_SDK: boolean; + config: IConfig; + interfaceConfig: any; + location: URL; +} + +interface INavigator { + product: string; +} + +declare global { + const APP: any; + const interfaceConfig: any; + const navigator: INavigator; + const window: IWindow; +} diff --git a/package-lock.json b/package-lock.json index 5a571e9d6..8c00c852b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,7 +160,7 @@ "circular-dependency-plugin": "5.2.0", "clean-css-cli": "4.3.0", "css-loader": "3.6.0", - "eslint": "8.1.0", + "eslint": "8.25.0", "eslint-plugin-flowtype": "8.0.3", "eslint-plugin-import": "2.25.2", "eslint-plugin-jsdoc": "37.0.3", @@ -176,8 +176,8 @@ "string-replace-loader": "3.0.3", "style-loader": "3.3.1", "traverse": "0.6.6", - "ts-loader": "9.2.6", - "typescript": "4.6.4", + "ts-loader": "9.4.1", + "typescript": "4.7.4", "unorm": "1.6.0", "webpack": "5.57.1", "webpack-bundle-analyzer": "4.4.2", @@ -3393,23 +3393,26 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", - "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { @@ -3419,9 +3422,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3610,12 +3613,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -3623,6 +3626,19 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -6705,15 +6721,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -7407,9 +7414,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -7578,15 +7585,6 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-fragments": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", @@ -9816,18 +9814,6 @@ "node": ">=10.13.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", @@ -9981,49 +9967,49 @@ } }, "node_modules/eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.3", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", + "find-up": "^5.0.0", "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -10382,9 +10368,9 @@ "dev": true }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -10403,10 +10389,26 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -10455,19 +10457,58 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/eslint/node_modules/supports-color": { @@ -10495,17 +10536,20 @@ } }, "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { @@ -11482,15 +11526,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/globby/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -11934,9 +11969,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -12955,6 +12990,12 @@ "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.6.1.tgz", "integrity": "sha512-lyUTXOqMEaA9mm38mHxbTo83WsYAvMJm850kxJcRno3T2qL+e40B2G89E0/4r9TdAeB3jN0TdSVp/VHNI6/WyQ==" }, + "node_modules/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, "node_modules/js-sha512": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", @@ -15749,15 +15790,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", @@ -18854,9 +18886,9 @@ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" }, "node_modules/ts-loader": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", - "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -19061,9 +19093,9 @@ } }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -20542,6 +20574,18 @@ "node": ">=8" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/youtube-player": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz", @@ -22861,19 +22905,19 @@ } }, "@eslint/eslintrc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", - "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -22884,9 +22928,9 @@ "dev": true }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -23040,16 +23084,22 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -25316,12 +25366,6 @@ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -25806,9 +25850,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-import-assertions": { @@ -25931,12 +25975,6 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-fragments": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", @@ -27663,15 +27701,6 @@ "tapable": "^2.2.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", @@ -27786,49 +27815,49 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", + "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.3", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", + "find-up": "^5.0.0", "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ansi-styles": { @@ -27872,9 +27901,9 @@ "dev": true }, "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -27887,10 +27916,20 @@ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -27921,15 +27960,39 @@ "argparse": "^2.0.1" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "p-locate": "^5.0.0" } }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -28178,13 +28241,13 @@ "dev": true }, "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -28948,12 +29011,6 @@ "slash": "^3.0.0" }, "dependencies": { - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -29307,9 +29364,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "image-capture": { @@ -30039,6 +30096,12 @@ "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.6.1.tgz", "integrity": "sha512-lyUTXOqMEaA9mm38mHxbTo83WsYAvMJm850kxJcRno3T2qL+e40B2G89E0/4r9TdAeB3jN0TdSVp/VHNI6/WyQ==" }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, "js-sha512": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", @@ -32220,12 +32283,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "promise": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", @@ -34581,9 +34638,9 @@ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" }, "ts-loader": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", - "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -34732,9 +34789,9 @@ } }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "ua-parser-js": { @@ -35782,6 +35839,12 @@ "decamelize": "^1.2.0" } }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "youtube-player": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz", diff --git a/package.json b/package.json index 80c430ae9..95be5acd9 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,7 @@ "circular-dependency-plugin": "5.2.0", "clean-css-cli": "4.3.0", "css-loader": "3.6.0", - "eslint": "8.1.0", + "eslint": "8.25.0", "eslint-plugin-flowtype": "8.0.3", "eslint-plugin-import": "2.25.2", "eslint-plugin-jsdoc": "37.0.3", @@ -181,8 +181,8 @@ "string-replace-loader": "3.0.3", "style-loader": "3.3.1", "traverse": "0.6.6", - "ts-loader": "9.2.6", - "typescript": "4.6.4", + "ts-loader": "9.4.1", + "typescript": "4.7.4", "unorm": "1.6.0", "webpack": "5.57.1", "webpack-bundle-analyzer": "4.4.2", @@ -195,7 +195,11 @@ }, "license": "Apache-2.0", "scripts": { - "lint": "eslint --ext .js,.ts,.tsx --max-warnings 0 . && tsc --noEmit --skipLibCheck", + "lint": "eslint --ext .js,.ts,.tsx --max-warnings 0 . && npm run tsc:web", + "tsc:web": "tsc --noEmit --project tsconfig.web.json", + "tsc:native": "tsc --noEmit --project tsconfig.native.json", + "tsc:ci": "npm run tsc:web && npm run tsc:native", + "lint:ci": "eslint --ext .js,.ts,.tsx --max-warnings 0 . && npm run tsc:ci", "lang-sort": "./resources/lang-sort.sh", "lint-fix": "eslint --ext .js,.ts,.tsx --max-warnings 0 --fix .", "postinstall": "patch-package --error-on-fail && jetify", diff --git a/react/.eslintrc.js b/react/.eslintrc.js index c8f83e891..f4779d949 100644 --- a/react/.eslintrc.js +++ b/react/.eslintrc.js @@ -9,7 +9,11 @@ module.exports = { 'overrides': [ { 'files': [ '*.ts', '*.tsx' ], - extends: [ '@jitsi/eslint-config/typescript' ] + extends: [ '@jitsi/eslint-config/typescript' ], + parserOptions: { + sourceType: 'module', + project: [ './tsconfig.web.json', './tsconfig.native.json' ] + } } ], 'rules': { diff --git a/react/features/analytics/handlers/AmplitudeHandler.ts b/react/features/analytics/handlers/AmplitudeHandler.ts index 4d0ee1a1a..a99455091 100644 --- a/react/features/analytics/handlers/AmplitudeHandler.ts +++ b/react/features/analytics/handlers/AmplitudeHandler.ts @@ -33,9 +33,10 @@ export default class AmplitudeHandler extends AbstractHandler { }; if (navigator.product === 'ReactNative') { - amplitude.getInstance().init(amplitudeAPPKey); + amplitude.getInstance().init(amplitudeAPPKey); // @ts-ignore fixDeviceID(amplitude.getInstance()).then(() => { amplitude.getInstance().getDeviceId() + // @ts-ignore .then((deviceId: string) => { this._deviceId = deviceId; }); @@ -46,6 +47,7 @@ export default class AmplitudeHandler extends AbstractHandler { onError }; + // @ts-ignore amplitude.getInstance().init(amplitudeAPPKey, undefined, amplitudeOptions); fixDeviceID(amplitude.getInstance()); } @@ -81,7 +83,7 @@ export default class AmplitudeHandler extends AbstractHandler { return; } - amplitude.getInstance().logEvent(this._extractName(event), event); + amplitude.getInstance().logEvent(this._extractName(event) ?? '', event); } /** diff --git a/react/features/base/buttons/CopyButton.tsx b/react/features/base/buttons/CopyButton.web.tsx similarity index 100% rename from react/features/base/buttons/CopyButton.tsx rename to react/features/base/buttons/CopyButton.web.tsx diff --git a/react/features/base/conference/middleware.any.js b/react/features/base/conference/middleware.any.js index 8d6af979e..adbf09a92 100644 --- a/react/features/base/conference/middleware.any.js +++ b/react/features/base/conference/middleware.any.js @@ -135,7 +135,7 @@ function _conferenceFailed({ dispatch, getState }, next, action) { }, NOTIFICATION_TIMEOUT_TYPE.LONG)); if (TRIGGER_READY_TO_CLOSE_REASONS.includes(reason)) { - if (typeof APP === undefined) { + if (typeof APP === 'undefined') { dispatch(readyToClose()); } else { APP.API.notifyReadyToClose(); diff --git a/react/features/base/connection/actions.any.ts b/react/features/base/connection/actions.any.ts index 8b1e66d4c..8f93db080 100644 --- a/react/features/base/connection/actions.any.ts +++ b/react/features/base/connection/actions.any.ts @@ -7,8 +7,131 @@ import { parseURIString } from '../util/uri'; +import { + CONNECTION_DISCONNECTED, + CONNECTION_ESTABLISHED, + CONNECTION_FAILED, + SET_LOCATION_URL +} from './actionTypes'; import logger from './logger'; +/** + * The error structure passed to the {@link connectionFailed} action. + * + * Note there was an intention to make the error resemble an Error instance (to + * the extent that jitsi-meet needs it). + */ +export type ConnectionFailedError = { + + /** + * The invalid credentials that were used to authenticate and the + * authentication failed. + */ + credentials?: { + + /** + * The XMPP user's ID. + */ + jid: string; + + /** + * The XMPP user's password. + */ + password: string; + }; + + /** + * The details about the connection failed event. + */ + details?: Object; + + /** + * Error message. + */ + message?: string; + + /** + * One of {@link JitsiConnectionError} constants (defined in + * lib-jitsi-meet). + */ + name: string; + + /** + * Indicates whether this event is recoverable or not. + */ + recoverable?: boolean; +}; + +/** + * Create an action for when the signaling connection has been lost. + * + * @param {JitsiConnection} connection - The {@code JitsiConnection} which + * disconnected. + * @private + * @returns {{ + * type: CONNECTION_DISCONNECTED, + * connection: JitsiConnection + * }} + */ +export function connectionDisconnected(connection: Object) { + return { + type: CONNECTION_DISCONNECTED, + connection + }; +} + +/** + * Create an action for when the signaling connection has been established. + * + * @param {JitsiConnection} connection - The {@code JitsiConnection} which was + * established. + * @param {number} timeEstablished - The time at which the + * {@code JitsiConnection} which was established. + * @public + * @returns {{ + * type: CONNECTION_ESTABLISHED, + * connection: JitsiConnection, + * timeEstablished: number + * }} + */ +export function connectionEstablished( + connection: Object, timeEstablished: number) { + return { + type: CONNECTION_ESTABLISHED, + connection, + timeEstablished + }; +} + +/** + * Create an action for when the signaling connection could not be created. + * + * @param {JitsiConnection} connection - The {@code JitsiConnection} which + * failed. + * @param {ConnectionFailedError} error - Error. + * @public + * @returns {{ + * type: CONNECTION_FAILED, + * connection: JitsiConnection, + * error: ConnectionFailedError + * }} + */ +export function connectionFailed( + connection: Object, + error: ConnectionFailedError) { + const { credentials } = error; + + if (credentials && !Object.keys(credentials).length) { + error.credentials = undefined; + } + + return { + type: CONNECTION_FAILED, + connection, + error + }; +} + /** * Constructs options to be passed to the constructor of {@code JitsiConnection} * based on the redux state. @@ -70,3 +193,20 @@ export function constructOptions(state: IState) { return options; } + +/** + * Sets the location URL of the application, connection, conference, etc. + * + * @param {URL} [locationURL] - The location URL of the application, + * connection, conference, etc. + * @returns {{ + * type: SET_LOCATION_URL, + * locationURL: URL + * }} + */ +export function setLocationURL(locationURL?: URL) { + return { + type: SET_LOCATION_URL, + locationURL + }; +} diff --git a/react/features/base/connection/actions.native.ts b/react/features/base/connection/actions.native.ts index a5ce44983..945376c46 100644 --- a/react/features/base/connection/actions.native.ts +++ b/react/features/base/connection/actions.native.ts @@ -4,65 +4,19 @@ import { getCurrentConference } from '../conference/functions'; import JitsiMeetJS, { JitsiConnectionEvents } from '../lib-jitsi-meet'; import { - CONNECTION_DISCONNECTED, - CONNECTION_ESTABLISHED, - CONNECTION_FAILED, - CONNECTION_WILL_CONNECT, - SET_LOCATION_URL + CONNECTION_WILL_CONNECT } from './actionTypes'; -import { constructOptions } from './actions.any'; +import { + connectionDisconnected, + connectionEstablished, + connectionFailed, + constructOptions +} from './actions.any'; import { JITSI_CONNECTION_URL_KEY } from './constants'; import logger from './logger'; export * from './actions.any'; -/** - * The error structure passed to the {@link connectionFailed} action. - * - * Note there was an intention to make the error resemble an Error instance (to - * the extent that jitsi-meet needs it). - */ -export type ConnectionFailedError = { - - /** - * The invalid credentials that were used to authenticate and the - * authentication failed. - */ - credentials?: { - - /** - * The XMPP user's ID. - */ - jid: string; - - /** - * The XMPP user's password. - */ - password: string; - }; - - /** - * The details about the connection failed event. - */ - details?: Object; - - /** - * Error message. - */ - message?: string; - - /** - * One of {@link JitsiConnectionError} constants (defined in - * lib-jitsi-meet). - */ - name: string; - - /** - * Indicates whether this event is recoverable or not. - */ - recoverable?: boolean; -}; - /** * Opens new connection. * @@ -169,76 +123,6 @@ export function connect(id?: string, password?: string) { }; } -/** - * Create an action for when the signaling connection has been lost. - * - * @param {JitsiConnection} connection - The {@code JitsiConnection} which - * disconnected. - * @private - * @returns {{ - * type: CONNECTION_DISCONNECTED, - * connection: JitsiConnection - * }} - */ -export function connectionDisconnected(connection: Object) { - return { - type: CONNECTION_DISCONNECTED, - connection - }; -} - -/** - * Create an action for when the signaling connection has been established. - * - * @param {JitsiConnection} connection - The {@code JitsiConnection} which was - * established. - * @param {number} timeEstablished - The time at which the - * {@code JitsiConnection} which was established. - * @public - * @returns {{ - * type: CONNECTION_ESTABLISHED, - * connection: JitsiConnection, - * timeEstablished: number - * }} - */ -export function connectionEstablished( - connection: Object, timeEstablished: number) { - return { - type: CONNECTION_ESTABLISHED, - connection, - timeEstablished - }; -} - -/** - * Create an action for when the signaling connection could not be created. - * - * @param {JitsiConnection} connection - The {@code JitsiConnection} which - * failed. - * @param {ConnectionFailedError} error - Error. - * @public - * @returns {{ - * type: CONNECTION_FAILED, - * connection: JitsiConnection, - * error: ConnectionFailedError - * }} - */ -export function connectionFailed( - connection: Object, - error: ConnectionFailedError) { - const { credentials } = error; - - if (credentials && !Object.keys(credentials).length) { - error.credentials = undefined; - } - - return { - type: CONNECTION_FAILED, - connection, - error - }; -} - /** * Create an action for when a connection will connect. * @@ -314,20 +198,3 @@ export function disconnect() { return promise; }; } - -/** - * Sets the location URL of the application, connection, conference, etc. - * - * @param {URL} [locationURL] - The location URL of the application, - * connection, conference, etc. - * @returns {{ - * type: SET_LOCATION_URL, - * locationURL: URL - * }} - */ -export function setLocationURL(locationURL?: URL) { - return { - type: SET_LOCATION_URL, - locationURL - }; -} diff --git a/react/features/base/connection/actions.web.ts b/react/features/base/connection/actions.web.ts index a5b96c798..a84ad1b96 100644 --- a/react/features/base/connection/actions.web.ts +++ b/react/features/base/connection/actions.web.ts @@ -2,14 +2,12 @@ import { IStore } from '../../app/types'; import { configureInitialDevices } from '../devices/actions'; import { getBackendSafeRoomName } from '../util/uri'; -declare const APP: any; - export { connectionDisconnected, connectionEstablished, connectionFailed, setLocationURL -} from './actions.native'; +} from './actions.any'; import logger from './logger'; export * from './actions.any'; diff --git a/react/features/base/connection/reducer.ts b/react/features/base/connection/reducer.ts index a3ef8e341..54f056423 100644 --- a/react/features/base/connection/reducer.ts +++ b/react/features/base/connection/reducer.ts @@ -11,7 +11,7 @@ import { SET_LOCATION_URL, SHOW_CONNECTION_INFO } from './actionTypes'; -import { ConnectionFailedError } from './actions.native'; +import { ConnectionFailedError } from './actions.any'; export interface IConnectionState { connecting?: any; diff --git a/react/features/base/lib-jitsi-meet/functions.any.ts b/react/features/base/lib-jitsi-meet/functions.any.ts index 72e70f12d..cfad3c665 100644 --- a/react/features/base/lib-jitsi-meet/functions.any.ts +++ b/react/features/base/lib-jitsi-meet/functions.any.ts @@ -18,7 +18,8 @@ const JitsiConnectionErrors = JitsiMeetJS.errors.connection; * * @returns {Promise} */ -export function createLocalTrack(type: string, deviceId: string, timeout?: number, additionalOptions?: Object) { +export function createLocalTrack(type: string, deviceId: string | null, timeout?: number | null, + additionalOptions?: Object) { return ( JitsiMeetJS.createLocalTracks({ cameraDeviceId: deviceId, diff --git a/react/features/chat/components/AbstractChatPrivacyDialog.tsx b/react/features/chat/components/AbstractChatPrivacyDialog.tsx index 22275e80d..50d8f0e60 100644 --- a/react/features/chat/components/AbstractChatPrivacyDialog.tsx +++ b/react/features/chat/components/AbstractChatPrivacyDialog.tsx @@ -86,7 +86,7 @@ export class AbstractChatPrivacyDialog extends PureComponent { */ export function _mapDispatchToProps(dispatch: IStore['dispatch']) { return { - _onSendMessage: (message: Object) => { + _onSendMessage: (message: string) => { dispatch(sendMessage(message, true)); }, diff --git a/react/features/conference/components/native/Conference.js b/react/features/conference/components/native/Conference.js index 2b01aba3d..b921972d2 100644 --- a/react/features/conference/components/native/Conference.js +++ b/react/features/conference/components/native/Conference.js @@ -14,7 +14,7 @@ import { ASPECT_RATIO_NARROW } from '../../../base/responsive-ui/constants'; import { TestConnectionInfo } from '../../../base/testing'; import { ConferenceNotification, isCalendarEnabled } from '../../../calendar-sync'; import { DisplayNameLabel } from '../../../display-name'; -import { BrandingImageBackground } from '../../../dynamic-branding'; +import { BrandingImageBackground } from '../../../dynamic-branding/components/native'; import { FILMSTRIP_SIZE, Filmstrip, diff --git a/react/features/dynamic-branding/components/index.native.ts b/react/features/dynamic-branding/components/index.native.ts deleted file mode 100644 index a855f3949..000000000 --- a/react/features/dynamic-branding/components/index.native.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './native/index'; diff --git a/react/features/dynamic-branding/index.ts b/react/features/dynamic-branding/index.ts deleted file mode 100644 index 7d87f907a..000000000 --- a/react/features/dynamic-branding/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './components/index.native'; diff --git a/react/features/embed-meeting/components/EmbedMeetingDialog.tsx b/react/features/embed-meeting/components/EmbedMeetingDialog.tsx index 222f1ed0b..03590c58c 100644 --- a/react/features/embed-meeting/components/EmbedMeetingDialog.tsx +++ b/react/features/embed-meeting/components/EmbedMeetingDialog.tsx @@ -3,14 +3,13 @@ import { WithTranslation } from 'react-i18next'; import { connect } from 'react-redux'; import { IState } from '../../app/types'; -import CopyButton from '../../base/buttons/CopyButton'; +import CopyButton from '../../base/buttons/CopyButton.web'; import { getInviteURL } from '../../base/connection/functions'; import { translate } from '../../base/i18n/functions'; import Dialog from '../../base/ui/components/web/Dialog'; interface Props extends WithTranslation { - /** * The URL of the conference. */ diff --git a/react/features/invite/components/add-people-dialog/web/CopyMeetingLinkSection.js b/react/features/invite/components/add-people-dialog/web/CopyMeetingLinkSection.js index 04c2faa5a..a850ab643 100644 --- a/react/features/invite/components/add-people-dialog/web/CopyMeetingLinkSection.js +++ b/react/features/invite/components/add-people-dialog/web/CopyMeetingLinkSection.js @@ -2,7 +2,7 @@ import React from 'react'; -import CopyButton from '../../../../base/buttons/CopyButton'; +import CopyButton from '../../../../base/buttons/CopyButton.web'; import { translate } from '../../../../base/i18n'; import { getDecodedURI } from '../../../../base/util'; diff --git a/react/features/lobby/components/native/LobbyScreen.js b/react/features/lobby/components/native/LobbyScreen.js index 9889a2311..66925251e 100644 --- a/react/features/lobby/components/native/LobbyScreen.js +++ b/react/features/lobby/components/native/LobbyScreen.js @@ -12,7 +12,7 @@ import { ASPECT_RATIO_NARROW } from '../../../base/responsive-ui'; import BaseTheme from '../../../base/ui/components/BaseTheme'; import Button from '../../../base/ui/components/native/Button'; import { BUTTON_TYPES } from '../../../base/ui/constants'; -import { BrandingImageBackground } from '../../../dynamic-branding'; +import { BrandingImageBackground } from '../../../dynamic-branding/components/native'; import { LargeVideo } from '../../../large-video/components'; import { navigate } from '../../../mobile/navigation/components/lobby/LobbyNavigationContainerRef'; diff --git a/react/features/participants-pane/components/web/FooterContextMenu.tsx b/react/features/participants-pane/components/web/FooterContextMenu.tsx index ba7fb503d..a990382b4 100644 --- a/react/features/participants-pane/components/web/FooterContextMenu.tsx +++ b/react/features/participants-pane/components/web/FooterContextMenu.tsx @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; import { makeStyles } from 'tss-react/mui'; +import { IState } from '../../../app/types'; import { requestDisableAudioModeration, requestDisableVideoModeration, @@ -87,7 +88,7 @@ type Props = { export const FooterContextMenu = ({ isOpen, onDrawerClose, onMouseLeave }: Props) => { const dispatch = useDispatch(); - const isModerationSupported = useSelector(isAvModerationSupported); + const isModerationSupported = useSelector((state: IState) => isAvModerationSupported()(state)); const allModerators = useSelector(isEveryoneModerator); const isModeratorSettingsTabEnabled = useSelector(shouldShowModeratorSettings); const participantCount = useSelector(getParticipantCount); diff --git a/react/features/prejoin/components/Prejoin.native.tsx b/react/features/prejoin/components/Prejoin.native.tsx index bd73b501b..6424c89ad 100644 --- a/react/features/prejoin/components/Prejoin.native.tsx +++ b/react/features/prejoin/components/Prejoin.native.tsx @@ -19,7 +19,6 @@ import { appNavigate } from '../../app/actions.native'; import { IState } from '../../app/types'; import { setAudioOnly } from '../../base/audio-only/actions'; import { getConferenceName } from '../../base/conference/functions'; -// @ts-ignore import { connect } from '../../base/connection/actions.native'; import { IconClose } from '../../base/icons/svg'; // @ts-ignore @@ -32,7 +31,7 @@ import { updateSettings } from '../../base/settings/actions'; import BaseTheme from '../../base/ui/components/BaseTheme.native'; import Button from '../../base/ui/components/native/Button'; import { BUTTON_TYPES } from '../../base/ui/constants'; -import { BrandingImageBackground } from '../../dynamic-branding'; +import { BrandingImageBackground } from '../../dynamic-branding/components/native'; // @ts-ignore import { LargeVideo } from '../../large-video/components'; // @ts-ignore diff --git a/react/features/video-menu/components/web/ParticipantContextMenu.tsx b/react/features/video-menu/components/web/ParticipantContextMenu.tsx index 858dd2638..e2805b2bb 100644 --- a/react/features/video-menu/components/web/ParticipantContextMenu.tsx +++ b/react/features/video-menu/components/web/ParticipantContextMenu.tsx @@ -151,7 +151,7 @@ const ParticipantContextMenu = ({ const _volume = (participant?.local ?? true ? undefined : participant?.id ? participantsVolume[participant?.id] : undefined) ?? 1; const isBreakoutRoom = useSelector(isInBreakoutRoom); - const isModerationSupported = useSelector(isAvModerationSupported); + const isModerationSupported = useSelector((state: IState) => isAvModerationSupported()(state)); const stageFilmstrip = useSelector(isStageFilmstripAvailable); const _currentRoomId = useSelector(getCurrentRoomId); diff --git a/react/features/welcome/constants.tsx b/react/features/welcome/constants.tsx index e74287ef4..886564a28 100644 --- a/react/features/welcome/constants.tsx +++ b/react/features/welcome/constants.tsx @@ -8,6 +8,7 @@ import BaseTheme from '../base/ui/components/BaseTheme'; // @ts-ignore import TabIcon from './components/TabIcon'; +// @ts-ignore export const INACTIVE_TAB_COLOR = BaseTheme.palette.tab01Disabled; export const tabBarOptions = { @@ -16,7 +17,7 @@ export const tabBarOptions = { tabBarLabelStyle: { fontSize: 12 }, - tabBarStyle: { + tabBarStyle: { // @ts-ignore backgroundColor: BaseTheme.palette.screen01Header } }; diff --git a/tsconfig.native.json b/tsconfig.native.json new file mode 100644 index 000000000..5c26eb29a --- /dev/null +++ b/tsconfig.native.json @@ -0,0 +1,33 @@ +{ + "include": ["react/features/**/*.ts", "react/features/**/*.tsx", "./custom.d.ts", "./globals.native.d.ts"], + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "target": "ESNext", + "jsx": "react-native", + "lib": [ "ES2017"], + "types": [ "react-native" ], + "skipLibCheck": true, + "moduleResolution": "Node", + "strict": true, + "noImplicitAny": true, + "strictPropertyInitialization": false, + "resolveJsonModule": true, + "moduleSuffixes": [".native", ""] + }, + "exclude": [ + "node_modules", + "react/features/base/components/participants-pane-list", + "react/features/connection-stats", + "react/features/e2ee", + "react/features/embed-meeting", + "react/features/face-landmarks", + "react/features/feedback", + "react/features/screen-share", + "react/features/stream-effects/noise-suppression", + "react/features/stream-effects/rnnoise", + "react/features/virtual-background", + "**/web/*", + "**/*.web.ts", + "**/*.web.tsx" + ] +} diff --git a/tsconfig.json b/tsconfig.web.json similarity index 67% rename from tsconfig.json rename to tsconfig.web.json index 0a7a1e78b..3d2a4ac89 100644 --- a/tsconfig.json +++ b/tsconfig.web.json @@ -6,14 +6,19 @@ "target": "es6", "jsx": "react", "lib": [ "webworker", "ES2020", "DOM" ], - "noEmit": false, + "skipLibCheck": true, "moduleResolution": "Node", "strict": true, "noImplicitAny": true, "strictPropertyInitialization": false, - "resolveJsonModule": true + "resolveJsonModule": true, + "moduleSuffixes": [".web", ""] }, "exclude": [ - "node_modules" + "node_modules", + "**/mobile/*", + "**/native/*", + "**/*.native.ts", + "**/*.native.tsx" ] } diff --git a/webpack.config.js b/webpack.config.js index 0cd8806bf..6ada1ff2c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -178,7 +178,8 @@ function getConfig(options = {}) { exclude: /node_modules/, loader: 'ts-loader', options: { - transpileOnly: !isProduction // Skip type checking for dev builds. + configFile: 'tsconfig.web.json', + transpileOnly: !isProduction // Skip type checking for dev builds., } } ] },