diff --git a/.eslintrc b/.eslintrc index 7fba89c9..4aa09035 100644 --- a/.eslintrc +++ b/.eslintrc @@ -12,7 +12,8 @@ "airbnb", "plugin:react/recommended", "plugin:prettier/recommended", - "plugin:react-hooks/recommended" + "plugin:react-hooks/recommended", + "plugin:arco-mobile/recommended" ], "parserOptions": { "ecmaFeatures": { @@ -21,7 +22,7 @@ }, "sourceType": "module" }, - "plugins": ["import", "react", "babel", "@typescript-eslint/eslint-plugin"], + "plugins": ["import", "react", "babel", "@typescript-eslint/eslint-plugin", "arco-mobile"], "globals": { "ActiveXObject": false, "describe": false, diff --git a/package-lock.json b/package-lock.json index 688b488a..683d47d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,6 +66,7 @@ "eslint": "^7.32.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^8.3.0", + "eslint-plugin-arco-mobile": "^1.0.1", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.25.4", "eslint-plugin-jsx-a11y": "^6.5.1", @@ -2618,6 +2619,33 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -7028,11 +7056,10 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true, - "license": "MIT" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -7199,6 +7226,12 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -12742,6 +12775,227 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-arco-mobile": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-arco-mobile/-/eslint-plugin-arco-mobile-1.0.1.tgz", + "integrity": "sha512-6j/3Iksi8Hm6QlPlfxhs7v8030oTH8RxEQCxhTXNekJZH8QsnlzR6f4d1W508mKhki2GFBo0/z8VqQfN4npFcA==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^7.0.1", + "@typescript-eslint/utils": "^7.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" + }, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/@typescript-eslint/parser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", + "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/@typescript-eslint/scope-manager": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", + "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/@typescript-eslint/types": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", + "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", + "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/@typescript-eslint/utils": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", + "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", + "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.0.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/eslint-plugin-arco-mobile/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/eslint-plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", @@ -33223,6 +33477,23 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + } + } + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -36540,9 +36811,9 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { @@ -36692,6 +36963,12 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "dev": true }, + "@types/semver": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -40805,6 +41082,135 @@ } } }, + "eslint-plugin-arco-mobile": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-arco-mobile/-/eslint-plugin-arco-mobile-1.0.1.tgz", + "integrity": "sha512-6j/3Iksi8Hm6QlPlfxhs7v8030oTH8RxEQCxhTXNekJZH8QsnlzR6f4d1W508mKhki2GFBo0/z8VqQfN4npFcA==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^7.0.1", + "@typescript-eslint/utils": "^7.0.1" + }, + "dependencies": { + "@typescript-eslint/parser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", + "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", + "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2" + } + }, + "@typescript-eslint/types": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", + "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", + "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/visitor-keys": "7.0.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", + "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.0.2", + "@typescript-eslint/types": "7.0.2", + "@typescript-eslint/typescript-estree": "7.0.2", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", + "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.0.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "requires": {} + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "peer": true + } + } + }, "eslint-plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", diff --git a/package.json b/package.json index 7f822755..4d1fa1a0 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "eslint": "^7.32.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^8.3.0", + "eslint-plugin-arco-mobile": "^1.0.1", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.25.4", "eslint-plugin-jsx-a11y": "^6.5.1", diff --git a/packages/arcodesign/components/_helpers/render.tsx b/packages/arcodesign/components/_helpers/render.tsx index a8e9423d..ac837c03 100644 --- a/packages/arcodesign/components/_helpers/render.tsx +++ b/packages/arcodesign/components/_helpers/render.tsx @@ -2,6 +2,8 @@ import React, { FunctionComponent } from 'react'; import { RootType, render as copyRender } from './react-dom'; import { GlobalContextParams } from '../context-provider'; +export const renderRootCache: Record = {}; + export class ReactDOMRender { root: RootType | undefined; @@ -11,14 +13,20 @@ export class ReactDOMRender { context: GlobalContextParams | undefined; + rootCacheId: string | undefined; + constructor( app: FunctionComponent, container: Element | DocumentFragment, context?: GlobalContextParams, + rootCacheId?: string, // root id in cache + root?: RootType, // use root in cache ) { this.app = app; this.container = container; this.context = context; + this.rootCacheId = rootCacheId; + this.root = root; } render = props => { @@ -31,8 +39,21 @@ export class ReactDOMRender { } }; + setRootCache = () => { + if (this.rootCacheId) { + renderRootCache[this.rootCacheId] = this.root; + } + }; + + clearRootCache = () => { + if (this.rootCacheId) { + delete renderRootCache[this.rootCacheId]; + } + }; + unmount = () => { this.root?._unmount(); this.root = undefined; + this.clearRootCache(); }; } diff --git a/packages/arcodesign/components/dialog/__test__/index.spec.js b/packages/arcodesign/components/dialog/__test__/index.spec.js index 1438a984..3cd2e325 100644 --- a/packages/arcodesign/components/dialog/__test__/index.spec.js +++ b/packages/arcodesign/components/dialog/__test__/index.spec.js @@ -31,7 +31,7 @@ describe('Dialog', () => { jest.useRealTimers(); }); - testMaskingCase('dialog', Dialog, prefix, `${prefix}-container`); + testMaskingCase('dialog', Dialog, prefix, 'ARCO_DIALOG', `${prefix}-container`); it('should support `footer` to customize operation buttons', async () => { const onOk = jest.fn(); diff --git a/packages/arcodesign/components/image-preview/methods.tsx b/packages/arcodesign/components/image-preview/methods.tsx index 71cee569..8b2c171d 100644 --- a/packages/arcodesign/components/image-preview/methods.tsx +++ b/packages/arcodesign/components/image-preview/methods.tsx @@ -17,7 +17,6 @@ export function open

(Component: React.FunctionComponent const baseProps: Config & { // 从config继承的属性 // @en Properties inherited from config - unmountOnExit?: boolean; getContainer?: () => HTMLElement; key?: string; openIndex: P['openIndex']; @@ -26,7 +25,6 @@ export function open

(Component: React.FunctionComponent onClose?: P['onClose']; close: P['close']; } = { - unmountOnExit: true, ...(config || {}), close: () => {}, }; @@ -56,9 +54,7 @@ export function open

(Component: React.FunctionComponent dynamicProps.close = close; dynamicProps.onClose = () => { baseProps.onClose && baseProps.onClose(); - if (baseProps.unmountOnExit) { - removeElement(div); - } + removeElement(div); }; dynamicProps.openIndex = -1; render(dynamicProps); diff --git a/packages/arcodesign/components/masking/__test__/index.spec.js b/packages/arcodesign/components/masking/__test__/index.spec.js index 36b9c7be..f4f67e18 100644 --- a/packages/arcodesign/components/masking/__test__/index.spec.js +++ b/packages/arcodesign/components/masking/__test__/index.spec.js @@ -16,5 +16,5 @@ describe('Masking', () => { jest.useRealTimers(); }); - testMaskingCase('masking', Masking, prefix); + testMaskingCase('masking', Masking, prefix, 'ARCO_MASKING'); }); diff --git a/packages/arcodesign/components/masking/__test__/utils.js b/packages/arcodesign/components/masking/__test__/utils.js index cfdcae00..531c3edb 100644 --- a/packages/arcodesign/components/masking/__test__/utils.js +++ b/packages/arcodesign/components/masking/__test__/utils.js @@ -4,6 +4,7 @@ import userEvent from '@testing-library/user-event'; import { defaultContext } from '../../context-provider'; import Button from '../../button'; import '@testing-library/jest-dom'; +import { pureDelay } from '../../../tests/helpers/utils'; const maskingPrefix = `${defaultContext.prefixCls}-masking`; @@ -39,6 +40,7 @@ export function testMaskingCase( compName, Comp, prefix, + containerId, contentClass = `${prefix}-content`, maskClass = `${prefix}-mask`, ) { @@ -97,23 +99,35 @@ export function testMaskingCase( it('should support `open`', () => { const onClose = jest.fn(); const ref = React.createRef(); - window.maskingInstance = Comp.open({ + const props = { ref, onClose, maskTransitionTimeout: 1000, className: 'demo-global', children: 'Content', + }; + const divId = `#_${containerId}_DIV__`; + // keep div after close when unmountOnExit=false + window.maskingInstance = Comp.open({ + ...props, + unmountOnExit: false, }); - act(() => { - jest.advanceTimersByTime(1100); - }); + pureDelay(1100); + expect(document.querySelectorAll(divId)).toHaveLength(1); + window.maskingInstance.close(); + pureDelay(1100); + expect(onClose.mock.calls).toHaveLength(1); + expect(document.querySelectorAll(divId)).toHaveLength(1); + expect(document.querySelectorAll('.demo-global')).toHaveLength(1); + // open again without unmountOnExit=false to clear side effects + window.maskingInstance = Comp.open(props); + pureDelay(1100); expect(document.querySelectorAll('.demo-global')).toHaveLength(1); + expect(document.querySelectorAll(divId)).toHaveLength(1); expect(typeof window.maskingInstance.close).toBe('function'); expect(typeof window.maskingInstance.update).toBe('function'); window.maskingInstance.close(); - act(() => { - jest.advanceTimersByTime(1100); - }); - expect(onClose.mock.calls).toHaveLength(1); + pureDelay(1100); + expect(document.querySelectorAll(divId)).toHaveLength(0); }); } diff --git a/packages/arcodesign/components/masking/methods.tsx b/packages/arcodesign/components/masking/methods.tsx index 68183a5f..a7015140 100644 --- a/packages/arcodesign/components/masking/methods.tsx +++ b/packages/arcodesign/components/masking/methods.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { appendElementById, removeElement, nextTick } from '@arco-design/mobile-utils'; -import { ReactDOMRender } from '../_helpers/render'; +import { ReactDOMRender, renderRootCache } from '../_helpers/render'; import { GlobalContextParams } from '../context-provider'; export interface OpenBaseProps { @@ -28,9 +28,16 @@ export function getOpenMethod div }; function update(newConfig: T) { @@ -51,10 +58,14 @@ export function getOpenMethod { baseProps.onClose && baseProps.onClose(scene); if (baseProps.unmountOnExit) { + unmount(); removeElement(div); } }; render(dynamicProps); + if (!baseProps.unmountOnExit) { + setRootCache(); + } nextTick(() => { if (leaving) return; dynamicProps.visible = true; diff --git a/packages/arcodesign/components/popup-swiper/__test__/index.spec.js b/packages/arcodesign/components/popup-swiper/__test__/index.spec.js index 78d7c9c0..3e444da4 100644 --- a/packages/arcodesign/components/popup-swiper/__test__/index.spec.js +++ b/packages/arcodesign/components/popup-swiper/__test__/index.spec.js @@ -48,6 +48,7 @@ describe('PopupSwiper', () => { 'popup-swiper', PopupSwiper, prefix, + 'ARCO_POPUP_SWIPER', `${popupPrefix}-content`, `${popupPrefix}-mask`, ); diff --git a/packages/arcodesign/components/popup/__test__/index.spec.js b/packages/arcodesign/components/popup/__test__/index.spec.js index c724ded1..bfbde5e4 100644 --- a/packages/arcodesign/components/popup/__test__/index.spec.js +++ b/packages/arcodesign/components/popup/__test__/index.spec.js @@ -16,5 +16,5 @@ describe('Popup', () => { jest.useRealTimers(); }); - testMaskingCase('popup', Popup, prefix); + testMaskingCase('popup', Popup, prefix, 'ARCO_POPUP'); }); diff --git a/packages/arcodesign/components/show-monitor/README.en-US.md b/packages/arcodesign/components/show-monitor/README.en-US.md index 9be67468..1cfc5ca3 100644 --- a/packages/arcodesign/components/show-monitor/README.en-US.md +++ b/packages/arcodesign/components/show-monitor/README.en-US.md @@ -31,3 +31,4 @@ Use scroll events to monitor whether children enter or leave the viewport. |----------|-------------|------| |dom|The outermost element DOM|HTMLDivElement| |checkVisible|Ignore the state of the element before and after, manually check whether the element is in the viewport, trigger the onVisibleChange callback function|() =\> boolean| +|flushVisibleStatus|Reset the initial visible state of the element to false, and re\-detect the visibility of the element, the priority is lower than 'disabled'(Usually used to re\-listen when elements inside ShowMonitor change)|() =\> void| diff --git a/packages/arcodesign/components/show-monitor/README.md b/packages/arcodesign/components/show-monitor/README.md index c75d0a05..be8bdff3 100644 --- a/packages/arcodesign/components/show-monitor/README.md +++ b/packages/arcodesign/components/show-monitor/README.md @@ -31,3 +31,4 @@ |----------|-------------|------| |dom|最外层元素 DOM|HTMLDivElement| |checkVisible|忽略元素前后状态,手动检查元素是否在视口内,触发onVisibleChange回调函数|() =\> boolean| +|flushVisibleStatus|重置元素初始可见态为false,并重新对元素可见度发起检测,优先级低于disabled(通常用在对ShowMonitor内部元素变化时发起的重新监听)|() =\> void| diff --git a/packages/arcodesign/components/show-monitor/__ast__/index.ast.json b/packages/arcodesign/components/show-monitor/__ast__/index.ast.json index 8244499e..64b229ec 100644 --- a/packages/arcodesign/components/show-monitor/__ast__/index.ast.json +++ b/packages/arcodesign/components/show-monitor/__ast__/index.ast.json @@ -318,6 +318,19 @@ "en": "Ignore the state of the element before and after, manually check whether the element is in the viewport, trigger the onVisibleChange callback function" }, "descWithTags": "忽略元素前后状态,手动检查元素是否在视口内,触发onVisibleChange回调函数" + }, + "flushVisibleStatus": { + "name": "flushVisibleStatus", + "required": true, + "description": "重置元素初始可见态为false,并重新对元素可见度发起检测,优先级低于disabled(通常用在对ShowMonitor内部元素变化时发起的重新监听)\n@en Reset the initial visible state of the element to false, and re-detect the visibility of the element, the priority is lower than 'disabled'(Usually used to re-listen when elements inside ShowMonitor change)", + "defaultValue": null, + "type": { + "name": "() => void" + }, + "tags": { + "en": "Reset the initial visible state of the element to false, and re-detect the visibility of the element, the priority is lower than 'disabled'(Usually used to re-listen when elements inside ShowMonitor change)" + }, + "descWithTags": "重置元素初始可见态为false,并重新对元素可见度发起检测,优先级低于disabled(通常用在对ShowMonitor内部元素变化时发起的重新监听)" } } },