diff --git a/.browserslistrc b/.browserslistrc index e890a964e0..0561183fee 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1,12 +1,12 @@ -safari >= 11.1 -ios_saf >= 11.3 -chrome >= 64 -and_chr >= 64 -android >= 64 -firefox >= 58 -and_ff >= 58 -edge >= 79 -Opera >= 52 -Samsung >= 9.2 +safari >= 14.1 +ios_saf >= 14.5 +chrome >= 100 +and_chr >= 100 +android >= 100 +firefox >= 102 +and_ff >= 100 +edge >= 100 +Opera >= 100 +Samsung >= 15 not IE 11 not dead \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d118e9ede4..ca6adca093 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,6 +1,12 @@ module.exports = { root: true, - extends: ['plugin:import/recommended', 'airbnb-typescript/base', 'prettier'], + plugins: ['compat'], + extends: [ + 'plugin:import/recommended', + 'airbnb-typescript/base', + 'prettier', + 'plugin:compat/recommended', + ], parserOptions: { project: './tsconfig.eslint.json', }, @@ -15,4 +21,7 @@ module.exports = { 'no-underscore-dangle': 'off', '@typescript-eslint/no-use-before-define': 'off', }, + env: { + browser: true, + }, }; diff --git a/package.json b/package.json index 110ddc6953..1af4424f1b 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "eslint": "8.57.1", "eslint-config-airbnb-typescript": "18.0.0", "eslint-config-prettier": "10.1.8", + "eslint-plugin-compat": "^6.0.2", "eslint-plugin-ecmascript-compat": "^3.2.1", "eslint-plugin-import": "2.32.0", "gh-pages": "6.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2be76120c3..966fa67375 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,6 +108,9 @@ importers: eslint-config-prettier: specifier: 10.1.8 version: 10.1.8(eslint@8.57.1) + eslint-plugin-compat: + specifier: ^6.0.2 + version: 6.0.2(eslint@8.57.1) eslint-plugin-ecmascript-compat: specifier: ^3.2.1 version: 3.2.1(eslint@8.57.1) @@ -1052,6 +1055,9 @@ packages: '@mdn/browser-compat-data@5.5.6': resolution: {integrity: sha512-dZgfsA1v8r+8QBPh7YqPaNz9KRlLi/iyac1/mwbaIV7yFrtW1qCkmzBJiJGsMhI1/JdayJvC81lVS/UEzHsgbA==} + '@mdn/browser-compat-data@5.7.6': + resolution: {integrity: sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1579,6 +1585,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-metadata-inferer@0.8.1: + resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -2013,6 +2022,12 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-plugin-compat@6.0.2: + resolution: {integrity: sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==} + engines: {node: '>=18.x'} + peerDependencies: + eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-ecmascript-compat@3.2.1: resolution: {integrity: sha512-ONunl+ucRFb9yarnVJSLzrmTYBdaWvUgzq6lXEk4OjIEV+CVxmMt9agZzzk5Ev/kaOHdkhsidAzyAS4sxEFfdg==} engines: {node: '>=16.0.0'} @@ -2276,6 +2291,10 @@ packages: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -2689,6 +2708,9 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3139,6 +3161,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} @@ -3462,8 +3489,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@6.0.0-dev.20251015: - resolution: {integrity: sha512-jsK1+Xef9OdqeNUPymZg5AxCGJoFJpO4V0eQwOh6fYvcmYNpCzv4bnG4VeGldDxTvtTJ+JnLGRt1iHUvNNNhSQ==} + typescript@6.0.0-dev.20251020: + resolution: {integrity: sha512-nffOgcZZ+fqBm5Mx78isLGAANnMqfKyI2A2WqJitf/STrrlhCAqHlsgzn+0C44XOYx/ebugU3z+es41HoF+nxQ==} engines: {node: '>=14.17'} hasBin: true @@ -4845,6 +4872,8 @@ snapshots: '@mdn/browser-compat-data@5.5.6': {} + '@mdn/browser-compat-data@5.7.6': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5411,6 +5440,10 @@ snapshots: assertion-error@2.0.1: {} + ast-metadata-inferer@0.8.1: + dependencies: + '@mdn/browser-compat-data': 5.7.6 + async-function@1.0.0: {} async@3.2.5: {} @@ -5692,7 +5725,7 @@ snapshots: dependencies: semver: 7.6.0 shelljs: 0.8.5 - typescript: 6.0.0-dev.20251015 + typescript: 6.0.0-dev.20251020 dunder-proto@1.0.1: dependencies: @@ -5962,6 +5995,18 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-compat@6.0.2(eslint@8.57.1): + dependencies: + '@mdn/browser-compat-data': 5.7.6 + ast-metadata-inferer: 0.8.1 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001726 + eslint: 8.57.1 + find-up: 5.0.0 + globals: 15.15.0 + lodash.memoize: 4.1.2 + semver: 7.7.3 + eslint-plugin-ecmascript-compat@3.2.1(eslint@8.57.1): dependencies: '@mdn/browser-compat-data': 5.5.6 @@ -6299,6 +6344,8 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@15.15.0: {} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 @@ -6713,6 +6760,8 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} lodash.startcase@4.4.0: {} @@ -7166,6 +7215,8 @@ snapshots: dependencies: lru-cache: 6.0.0 + semver@7.7.3: {} + serialize-javascript@6.0.1: dependencies: randombytes: 2.1.0 @@ -7534,7 +7585,7 @@ snapshots: typescript@5.8.3: {} - typescript@6.0.0-dev.20251015: {} + typescript@6.0.0-dev.20251020: {} uc.micro@2.1.0: {} diff --git a/src/room/Room.ts b/src/room/Room.ts index 1784688f39..35df46369f 100644 --- a/src/room/Room.ts +++ b/src/room/Room.ts @@ -576,6 +576,7 @@ class Room extends (EventEmitter as new () => TypedEmitter) static cleanupRegistry = typeof FinalizationRegistry !== 'undefined' && + // eslint-disable-next-line compat/compat new FinalizationRegistry((cleanup: () => void) => { cleanup(); }); diff --git a/src/room/utils.ts b/src/room/utils.ts index 08d6f79327..35adcc56fb 100644 --- a/src/room/utils.ts +++ b/src/room/utils.ts @@ -210,6 +210,7 @@ export function isMobile(): boolean { return ( // @ts-expect-error `userAgentData` is not yet part of typescript + // eslint-disable-next-line compat/compat navigator.userAgentData?.mobile ?? /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent) ); @@ -670,6 +671,7 @@ export function bigIntToNumber( export function numberToBigInt( value: T, ): T extends number ? bigint : undefined { + // eslint-disable-next-line compat/compat return (value !== undefined ? BigInt(value) : undefined) as T extends number ? bigint : undefined; }