From aa427812049a02e21f66b229ccdfba7d873d6777 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 13:42:04 -0400 Subject: [PATCH 01/75] fix(deps): bumping to latest module-federation versions --- package-lock.json | 183 ++++++++++++++++--------------- package.json | 4 +- test-project/package-lock.json | 192 +++++++++++++++++---------------- 3 files changed, 196 insertions(+), 183 deletions(-) diff --git a/package-lock.json b/package-lock.json index aed282d9..913199a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,8 +19,8 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", - "@module-federation/enhanced": "^0.4.0", - "@module-federation/runtime": "^0.2.6", + "@module-federation/enhanced": "^0.6.12", + "@module-federation/runtime": "^0.6.12", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@types/gradient-string": "^1.1.6", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -2920,24 +2920,51 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.4.0.tgz", - "integrity": "sha512-su/ZpRZcyZ8yVa5+zmZyh2pW/BdCQsto52Xmp75GRgPgwG7IrczcQ/GlMCHZz9hQQdmLEQuPe4BIvpnH+GS9Jw==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.6.12.tgz", + "integrity": "sha512-AF+5iKtfBsQU8XDudw55C5zo442uiqU3hY1uGJInr+/v16MrXviFQqrZ2VuXKiu9C8vPXbsAtBNB6MbOH5JARA==", "dependencies": { - "@module-federation/sdk": "0.4.0" + "@module-federation/sdk": "0.6.12", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.6.12.tgz", + "integrity": "sha512-Pg0N/H9stucS6Olmrc8Ib75f5bqx0I3ayWgkY5dahe2B8E3Bhbr1zw3seidPKXIosemRZxA11QsPD5of5SyNmA==", + "dependencies": { + "@module-federation/runtime": "0.6.12", + "@module-federation/sdk": "0.6.12", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, "node_modules/@module-federation/dts-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.4.0.tgz", - "integrity": "sha512-KCFIdUh6PhoNqU8OlLmbhjec+wWyo9HAUukR84TnjiktVYMcCqmlmSeWoma2llyPE3GeOHqln+cPR7hMPXbR6w==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.6.12.tgz", + "integrity": "sha512-JFoHXVrwQDqcbRc7Ws/19zmCajx3xyRZarvM8592OLoLOK/QzrA9xg/o1ltiC4a7tRA3aubm9clo+pzVgqECwQ==", "dependencies": { - "@module-federation/managers": "0.4.0", - "@module-federation/sdk": "0.4.0", - "@module-federation/third-party-dts-extractor": "0.4.0", + "@module-federation/managers": "0.6.12", + "@module-federation/sdk": "0.6.12", + "@module-federation/third-party-dts-extractor": "0.6.12", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", - "axios": "^1.6.7", + "axios": "^1.7.4", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", @@ -2946,7 +2973,7 @@ "log4js": "6.9.1", "node-schedule": "2.1.1", "rambda": "^9.1.0", - "ws": "8.17.1" + "ws": "8.18.0" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", @@ -2971,17 +2998,18 @@ } }, "node_modules/@module-federation/enhanced": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.4.0.tgz", - "integrity": "sha512-F398RJioMiU4zpXjtF+bJG7sROGNnY1dyPxwfhAnfDxtm/5urWnR2od2+zTvucyWdNeWQxbEe9XUOpgt42egqw==", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.4.0", - "@module-federation/dts-plugin": "0.4.0", - "@module-federation/managers": "0.4.0", - "@module-federation/manifest": "0.4.0", - "@module-federation/rspack": "0.4.0", - "@module-federation/runtime-tools": "0.4.0", - "@module-federation/sdk": "0.4.0", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.6.12.tgz", + "integrity": "sha512-HkcXPbgugcYKq5gFWWh/VSlPYEPEunVFWAINgKPu03YGSTDaFRo9jbvNWA+CR7pFNUOMTg2weudlP10olbvPdQ==", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.6.12", + "@module-federation/data-prefetch": "0.6.12", + "@module-federation/dts-plugin": "0.6.12", + "@module-federation/managers": "0.6.12", + "@module-federation/manifest": "0.6.12", + "@module-federation/rspack": "0.6.12", + "@module-federation/runtime-tools": "0.6.12", + "@module-federation/sdk": "0.6.12", "btoa": "^1.2.1", "upath": "2.0.1" }, @@ -3003,23 +3031,23 @@ } }, "node_modules/@module-federation/managers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.4.0.tgz", - "integrity": "sha512-c4apAaQjwR01qlDSNwPfBBTTzVyErO6POayaRIeAoQMoJLgf+HvL2YFsVPTc4+n8w4lNBMAghPr/BVGlTK9SJQ==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.6.12.tgz", + "integrity": "sha512-86UH9UuGBkoQvUOW7Xgl5PEyTj86YLUfvnj7MBS7p7XEJyFjcg1EwlS+JJGmLx0csovWgNkaUlNveKiZjYIbTQ==", "dependencies": { - "@module-federation/sdk": "0.4.0", + "@module-federation/sdk": "0.6.12", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/manifest": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.4.0.tgz", - "integrity": "sha512-TT2H5z3tFtkVarWz6Zsyi4T6wGxxRQjk3O6lSjYrZzWDYyVnrVhAkBgcN9WlkxqSY/V/ifZlTUWUpfSMObRTig==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.6.12.tgz", + "integrity": "sha512-blpSrM9mQfV56L7jZAgjWL5xoBeSFxdQtQoiIyrs6CC4v2RCMGVwJeBGyvenwvu+K1sLeWZN2dVU9E+WBqDgnQ==", "dependencies": { - "@module-federation/dts-plugin": "0.4.0", - "@module-federation/managers": "0.4.0", - "@module-federation/sdk": "0.4.0", + "@module-federation/dts-plugin": "0.6.12", + "@module-federation/managers": "0.6.12", + "@module-federation/sdk": "0.6.12", "chalk": "3.0.0", "find-pkg": "2.0.0" } @@ -3037,16 +3065,16 @@ } }, "node_modules/@module-federation/rspack": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.4.0.tgz", - "integrity": "sha512-yPzJwVs/JQcWPw5wy79nEydYAX74TMOJqf4AQijEpdAcE52wWSAm84GymZmAAo55rC74wLGy/DgqQlYNF8WIxw==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.6.12.tgz", + "integrity": "sha512-hGduVfTEf7xYcaSOWTJG6Y8SzOEjClImpc8mw6MbysBDf62dK4fWE/1nY+ienHlkMTuONg44DulTUSgh/Aotjw==", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.4.0", - "@module-federation/dts-plugin": "0.4.0", - "@module-federation/managers": "0.4.0", - "@module-federation/manifest": "0.4.0", - "@module-federation/runtime-tools": "0.4.0", - "@module-federation/sdk": "0.4.0" + "@module-federation/bridge-react-webpack-plugin": "0.6.12", + "@module-federation/dts-plugin": "0.6.12", + "@module-federation/managers": "0.6.12", + "@module-federation/manifest": "0.6.12", + "@module-federation/runtime-tools": "0.6.12", + "@module-federation/sdk": "0.6.12" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", @@ -3062,44 +3090,31 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.2.8.tgz", - "integrity": "sha512-8xmA/+z1zD09F5qU8VnSWLExqTCVWoHOguXsCX79kkqp7i0c+D2YaebWzlQ2kku+DU+0VIzXpQ3BBcumZ3v3wQ==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.6.12.tgz", + "integrity": "sha512-zNIhdNc/LcYUqb5guAZRyIGEVQSSALbr7TLuIyzF9eF4jVKBnkOcR/kphaisspkhc467x/mC99/41TzCfAORfA==", "dependencies": { - "@module-federation/sdk": "0.2.8" + "@module-federation/sdk": "0.6.12" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.4.0.tgz", - "integrity": "sha512-Mr/ewsZbKmv4ZG3FYNrfdgRh5OauJy5IiZ/Z5jtYlNkLfYjUBHSBkh986l/Bpa385+RCCPs3Lg6yFBQlOiYlug==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.6.12.tgz", + "integrity": "sha512-oiTRUZ/Sj+Nw10oheh8EizhYavBfAWCmlScTtjxSFvya2ixt6h4j1Z2EV0SFpylI7WugjkckRNEsUq1UCCCuLQ==", "dependencies": { - "@module-federation/runtime": "0.4.0", - "@module-federation/webpack-bundler-runtime": "0.4.0" + "@module-federation/runtime": "0.6.12", + "@module-federation/webpack-bundler-runtime": "0.6.12" } }, - "node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.4.0.tgz", - "integrity": "sha512-zEhMil0JbB0eS1bflV9qOJFJNmDCWMJbKUN7Xw5OMLDnveKTg9l/rLqDGwt/kAP0/Lhq1PNuXEvYm1CeIKKU8A==", - "dependencies": { - "@module-federation/sdk": "0.4.0" - } - }, - "node_modules/@module-federation/runtime/node_modules/@module-federation/sdk": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.2.8.tgz", - "integrity": "sha512-eGMnJxdRDgt6dtMv8gkAlzEbTPWVHb3AHUNUG0w56wcbIF0RHC6kmvpHpSQyq4DVGWv3U4g/ZiH5BvBlqEelDQ==" - }, "node_modules/@module-federation/sdk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.4.0.tgz", - "integrity": "sha512-fQ/5aABzksXajRLJsocN9XkW8SOB5JRt7xoDmkFFEeb0HLmcbq5K5GURImPm/jysy0Y7a6DkpxhzP9QJU2Z1Zw==" + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.6.12.tgz", + "integrity": "sha512-QC2uwlnDPxf7OYJAKot0zCJl95VV+iBmvCKGGeXLlzbdBFYIFpmE8IkFBLQqTRxtSKF9hv2z4Zltonu7YjRUdQ==" }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.4.0.tgz", - "integrity": "sha512-zXIfgHiOyZFF6rLjHFt0LJ1SgjO5t/UP05HQgIyMvyZ/Q1cQAcNHGy4iLshrPHthh25sJkClAcrfNTw3/JD9xQ==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.6.12.tgz", + "integrity": "sha512-jhHjd4WYA+Td1c0wK5zYxDEXyZYV4ldIUb2blnE8GuwXRWr5nbdG4RgmPbV7ISyQo6B+uEmE55YIbLeX5r6M5g==", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -3107,20 +3122,12 @@ } }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.4.0.tgz", - "integrity": "sha512-IVwqAuBxvgj2j2HEkV2Q1tDrD9ha6mS0qkBgbtabBjbg8fDc4k+NCmZMB7ou5DCojchqtKXBH2iYNzX062CQ8A==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.6.12.tgz", + "integrity": "sha512-LeeRualyA6vA2syhzveNK61JFTMixUFu08JD+jW6OcubXN7EV11K8w6IyWemQ5qmM8V2sDjXCebOyZ+TGafSdg==", "dependencies": { - "@module-federation/runtime": "0.4.0", - "@module-federation/sdk": "0.4.0" - } - }, - "node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/runtime": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.4.0.tgz", - "integrity": "sha512-zEhMil0JbB0eS1bflV9qOJFJNmDCWMJbKUN7Xw5OMLDnveKTg9l/rLqDGwt/kAP0/Lhq1PNuXEvYm1CeIKKU8A==", - "dependencies": { - "@module-federation/sdk": "0.4.0" + "@module-federation/runtime": "0.6.12", + "@module-federation/sdk": "0.6.12" } }, "node_modules/@newrelic/publish-sourcemap": { @@ -17556,9 +17563,9 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 7a23dbf6..3d1aedbf 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,8 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", - "@module-federation/enhanced": "^0.4.0", - "@module-federation/runtime": "^0.2.6", + "@module-federation/enhanced": "^0.6.12", + "@module-federation/runtime": "^0.6.12", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@types/gradient-string": "^1.1.6", "@typescript-eslint/eslint-plugin": "^6.21.0", diff --git a/test-project/package-lock.json b/test-project/package-lock.json index 7186b6c6..2d7a2532 100644 --- a/test-project/package-lock.json +++ b/test-project/package-lock.json @@ -2962,26 +2962,55 @@ "peer": true }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.4.0.tgz", - "integrity": "sha512-su/ZpRZcyZ8yVa5+zmZyh2pW/BdCQsto52Xmp75GRgPgwG7IrczcQ/GlMCHZz9hQQdmLEQuPe4BIvpnH+GS9Jw==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.6.12.tgz", + "integrity": "sha512-AF+5iKtfBsQU8XDudw55C5zo442uiqU3hY1uGJInr+/v16MrXviFQqrZ2VuXKiu9C8vPXbsAtBNB6MbOH5JARA==", + "peer": true, + "dependencies": { + "@module-federation/sdk": "0.6.12", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.6.12.tgz", + "integrity": "sha512-Pg0N/H9stucS6Olmrc8Ib75f5bqx0I3ayWgkY5dahe2B8E3Bhbr1zw3seidPKXIosemRZxA11QsPD5of5SyNmA==", "peer": true, "dependencies": { - "@module-federation/sdk": "0.4.0" + "@module-federation/runtime": "0.6.12", + "@module-federation/sdk": "0.6.12", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, "node_modules/@module-federation/dts-plugin": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.4.0.tgz", - "integrity": "sha512-KCFIdUh6PhoNqU8OlLmbhjec+wWyo9HAUukR84TnjiktVYMcCqmlmSeWoma2llyPE3GeOHqln+cPR7hMPXbR6w==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.6.12.tgz", + "integrity": "sha512-JFoHXVrwQDqcbRc7Ws/19zmCajx3xyRZarvM8592OLoLOK/QzrA9xg/o1ltiC4a7tRA3aubm9clo+pzVgqECwQ==", "peer": true, "dependencies": { - "@module-federation/managers": "0.4.0", - "@module-federation/sdk": "0.4.0", - "@module-federation/third-party-dts-extractor": "0.4.0", + "@module-federation/managers": "0.6.12", + "@module-federation/sdk": "0.6.12", + "@module-federation/third-party-dts-extractor": "0.6.12", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", - "axios": "^1.6.7", + "axios": "^1.7.4", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", @@ -2990,7 +3019,7 @@ "log4js": "6.9.1", "node-schedule": "2.1.1", "rambda": "^9.1.0", - "ws": "8.17.1" + "ws": "8.18.0" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", @@ -3016,18 +3045,19 @@ } }, "node_modules/@module-federation/enhanced": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.4.0.tgz", - "integrity": "sha512-F398RJioMiU4zpXjtF+bJG7sROGNnY1dyPxwfhAnfDxtm/5urWnR2od2+zTvucyWdNeWQxbEe9XUOpgt42egqw==", - "peer": true, - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.4.0", - "@module-federation/dts-plugin": "0.4.0", - "@module-federation/managers": "0.4.0", - "@module-federation/manifest": "0.4.0", - "@module-federation/rspack": "0.4.0", - "@module-federation/runtime-tools": "0.4.0", - "@module-federation/sdk": "0.4.0", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.6.12.tgz", + "integrity": "sha512-HkcXPbgugcYKq5gFWWh/VSlPYEPEunVFWAINgKPu03YGSTDaFRo9jbvNWA+CR7pFNUOMTg2weudlP10olbvPdQ==", + "peer": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.6.12", + "@module-federation/data-prefetch": "0.6.12", + "@module-federation/dts-plugin": "0.6.12", + "@module-federation/managers": "0.6.12", + "@module-federation/manifest": "0.6.12", + "@module-federation/rspack": "0.6.12", + "@module-federation/runtime-tools": "0.6.12", + "@module-federation/sdk": "0.6.12", "btoa": "^1.2.1", "upath": "2.0.1" }, @@ -3049,25 +3079,25 @@ } }, "node_modules/@module-federation/managers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.4.0.tgz", - "integrity": "sha512-c4apAaQjwR01qlDSNwPfBBTTzVyErO6POayaRIeAoQMoJLgf+HvL2YFsVPTc4+n8w4lNBMAghPr/BVGlTK9SJQ==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.6.12.tgz", + "integrity": "sha512-86UH9UuGBkoQvUOW7Xgl5PEyTj86YLUfvnj7MBS7p7XEJyFjcg1EwlS+JJGmLx0csovWgNkaUlNveKiZjYIbTQ==", "peer": true, "dependencies": { - "@module-federation/sdk": "0.4.0", + "@module-federation/sdk": "0.6.12", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/manifest": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.4.0.tgz", - "integrity": "sha512-TT2H5z3tFtkVarWz6Zsyi4T6wGxxRQjk3O6lSjYrZzWDYyVnrVhAkBgcN9WlkxqSY/V/ifZlTUWUpfSMObRTig==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.6.12.tgz", + "integrity": "sha512-blpSrM9mQfV56L7jZAgjWL5xoBeSFxdQtQoiIyrs6CC4v2RCMGVwJeBGyvenwvu+K1sLeWZN2dVU9E+WBqDgnQ==", "peer": true, "dependencies": { - "@module-federation/dts-plugin": "0.4.0", - "@module-federation/managers": "0.4.0", - "@module-federation/sdk": "0.4.0", + "@module-federation/dts-plugin": "0.6.12", + "@module-federation/managers": "0.6.12", + "@module-federation/sdk": "0.6.12", "chalk": "3.0.0", "find-pkg": "2.0.0" } @@ -3086,17 +3116,17 @@ } }, "node_modules/@module-federation/rspack": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.4.0.tgz", - "integrity": "sha512-yPzJwVs/JQcWPw5wy79nEydYAX74TMOJqf4AQijEpdAcE52wWSAm84GymZmAAo55rC74wLGy/DgqQlYNF8WIxw==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.6.12.tgz", + "integrity": "sha512-hGduVfTEf7xYcaSOWTJG6Y8SzOEjClImpc8mw6MbysBDf62dK4fWE/1nY+ienHlkMTuONg44DulTUSgh/Aotjw==", "peer": true, "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.4.0", - "@module-federation/dts-plugin": "0.4.0", - "@module-federation/managers": "0.4.0", - "@module-federation/manifest": "0.4.0", - "@module-federation/runtime-tools": "0.4.0", - "@module-federation/sdk": "0.4.0" + "@module-federation/bridge-react-webpack-plugin": "0.6.12", + "@module-federation/dts-plugin": "0.6.12", + "@module-federation/managers": "0.6.12", + "@module-federation/manifest": "0.6.12", + "@module-federation/runtime-tools": "0.6.12", + "@module-federation/sdk": "0.6.12" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", @@ -3112,49 +3142,34 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.2.8.tgz", - "integrity": "sha512-8xmA/+z1zD09F5qU8VnSWLExqTCVWoHOguXsCX79kkqp7i0c+D2YaebWzlQ2kku+DU+0VIzXpQ3BBcumZ3v3wQ==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.6.12.tgz", + "integrity": "sha512-zNIhdNc/LcYUqb5guAZRyIGEVQSSALbr7TLuIyzF9eF4jVKBnkOcR/kphaisspkhc467x/mC99/41TzCfAORfA==", "peer": true, "dependencies": { - "@module-federation/sdk": "0.2.8" + "@module-federation/sdk": "0.6.12" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.4.0.tgz", - "integrity": "sha512-Mr/ewsZbKmv4ZG3FYNrfdgRh5OauJy5IiZ/Z5jtYlNkLfYjUBHSBkh986l/Bpa385+RCCPs3Lg6yFBQlOiYlug==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.6.12.tgz", + "integrity": "sha512-oiTRUZ/Sj+Nw10oheh8EizhYavBfAWCmlScTtjxSFvya2ixt6h4j1Z2EV0SFpylI7WugjkckRNEsUq1UCCCuLQ==", "peer": true, "dependencies": { - "@module-federation/runtime": "0.4.0", - "@module-federation/webpack-bundler-runtime": "0.4.0" + "@module-federation/runtime": "0.6.12", + "@module-federation/webpack-bundler-runtime": "0.6.12" } }, - "node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.4.0.tgz", - "integrity": "sha512-zEhMil0JbB0eS1bflV9qOJFJNmDCWMJbKUN7Xw5OMLDnveKTg9l/rLqDGwt/kAP0/Lhq1PNuXEvYm1CeIKKU8A==", - "peer": true, - "dependencies": { - "@module-federation/sdk": "0.4.0" - } - }, - "node_modules/@module-federation/runtime/node_modules/@module-federation/sdk": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.2.8.tgz", - "integrity": "sha512-eGMnJxdRDgt6dtMv8gkAlzEbTPWVHb3AHUNUG0w56wcbIF0RHC6kmvpHpSQyq4DVGWv3U4g/ZiH5BvBlqEelDQ==", - "peer": true - }, "node_modules/@module-federation/sdk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.4.0.tgz", - "integrity": "sha512-fQ/5aABzksXajRLJsocN9XkW8SOB5JRt7xoDmkFFEeb0HLmcbq5K5GURImPm/jysy0Y7a6DkpxhzP9QJU2Z1Zw==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.6.12.tgz", + "integrity": "sha512-QC2uwlnDPxf7OYJAKot0zCJl95VV+iBmvCKGGeXLlzbdBFYIFpmE8IkFBLQqTRxtSKF9hv2z4Zltonu7YjRUdQ==", "peer": true }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.4.0.tgz", - "integrity": "sha512-zXIfgHiOyZFF6rLjHFt0LJ1SgjO5t/UP05HQgIyMvyZ/Q1cQAcNHGy4iLshrPHthh25sJkClAcrfNTw3/JD9xQ==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.6.12.tgz", + "integrity": "sha512-jhHjd4WYA+Td1c0wK5zYxDEXyZYV4ldIUb2blnE8GuwXRWr5nbdG4RgmPbV7ISyQo6B+uEmE55YIbLeX5r6M5g==", "peer": true, "dependencies": { "find-pkg": "2.0.0", @@ -3163,22 +3178,13 @@ } }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.4.0.tgz", - "integrity": "sha512-IVwqAuBxvgj2j2HEkV2Q1tDrD9ha6mS0qkBgbtabBjbg8fDc4k+NCmZMB7ou5DCojchqtKXBH2iYNzX062CQ8A==", - "peer": true, - "dependencies": { - "@module-federation/runtime": "0.4.0", - "@module-federation/sdk": "0.4.0" - } - }, - "node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/runtime": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.4.0.tgz", - "integrity": "sha512-zEhMil0JbB0eS1bflV9qOJFJNmDCWMJbKUN7Xw5OMLDnveKTg9l/rLqDGwt/kAP0/Lhq1PNuXEvYm1CeIKKU8A==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.6.12.tgz", + "integrity": "sha512-LeeRualyA6vA2syhzveNK61JFTMixUFu08JD+jW6OcubXN7EV11K8w6IyWemQ5qmM8V2sDjXCebOyZ+TGafSdg==", "peer": true, "dependencies": { - "@module-federation/sdk": "0.4.0" + "@module-federation/runtime": "0.6.12", + "@module-federation/sdk": "0.6.12" } }, "node_modules/@newrelic/publish-sourcemap": { @@ -3234,7 +3240,7 @@ "node_modules/@openedx/frontend-base": { "version": "1.0.0", "resolved": "file:../openedx-frontend-base-1.0.0.tgz", - "integrity": "sha512-iBMUOzGqyS3QyZGRw0HmSFgfwZZ4WSmsWtmkAGxdrPy+0bSgkjSRq1O8bXzeeNxJWItV6zAoM9nfTUJZpmCVrg==", + "integrity": "sha512-R/5Tj+ZjhqWgp4qzsColTdkKJUfdJnuB1474vfyV8B2SPd6YOcxSRPQExP1D6uHY5Q5ee8Ba+V29gnz9CINJpw==", "peer": true, "dependencies": { "@babel/core": "^7.24.9", @@ -3247,8 +3253,8 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", - "@module-federation/enhanced": "^0.4.0", - "@module-federation/runtime": "^0.2.6", + "@module-federation/enhanced": "^0.6.12", + "@module-federation/runtime": "^0.6.12", "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@types/gradient-string": "^1.1.6", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -17701,9 +17707,9 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "peer": true, "engines": { "node": ">=10.0.0" From 12ed1a8d7d04b09d38247f6086032086508ee4f7 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 13:46:01 -0400 Subject: [PATCH 02/75] fix(deps): bump jest monorepo versions --- package-lock.json | 40 +++++++++++++++++----------------- package.json | 6 ++--- test-project/package-lock.json | 40 +++++++++++++++++----------------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 913199a4..91a98cf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,8 +55,8 @@ "i18n-iso-countries": "^4.3.1", "identity-obj-proxy": "3.0.0", "image-minimizer-webpack-plugin": "3.8.3", - "jest": "29.6.1", - "jest-environment-jsdom": "29.6.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "jwt-decode": "^3.1.2", "localforage": "^1.10.0", "localforage-memoryStorageDriver": "^0.9.2", @@ -109,7 +109,7 @@ "@testing-library/user-event": "^14.5.2", "@tsconfig/node18": "^18.2.4", "@types/compression": "^1.7.5", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.14", "@types/lodash.camelcase": "^4.3.9", "@types/lodash.merge": "^4.6.9", "@types/node": "^18.19.43", @@ -3773,9 +3773,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.13", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", - "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -10160,14 +10160,14 @@ } }, "node_modules/jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", - "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dependencies": { - "@jest/core": "^29.6.1", - "@jest/types": "^29.6.1", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.1" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -10520,17 +10520,17 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-environment-jsdom": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.1.tgz", - "integrity": "sha512-PoY+yLaHzVRhVEjcVKSfJ7wXmJW4UqPYNhR05h7u/TK0ouf6DmRNZFBL/Z00zgQMyWGMBXn69/FmOvhEJu8cIw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { diff --git a/package.json b/package.json index 3d1aedbf..e0609e6a 100644 --- a/package.json +++ b/package.json @@ -94,8 +94,8 @@ "i18n-iso-countries": "^4.3.1", "identity-obj-proxy": "3.0.0", "image-minimizer-webpack-plugin": "3.8.3", - "jest": "29.6.1", - "jest-environment-jsdom": "29.6.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "jwt-decode": "^3.1.2", "localforage": "^1.10.0", "localforage-memoryStorageDriver": "^0.9.2", @@ -143,7 +143,7 @@ "@testing-library/user-event": "^14.5.2", "@tsconfig/node18": "^18.2.4", "@types/compression": "^1.7.5", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.14", "@types/lodash.camelcase": "^4.3.9", "@types/lodash.merge": "^4.6.9", "@types/node": "^18.19.43", diff --git a/test-project/package-lock.json b/test-project/package-lock.json index 2d7a2532..c6185379 100644 --- a/test-project/package-lock.json +++ b/test-project/package-lock.json @@ -3240,7 +3240,7 @@ "node_modules/@openedx/frontend-base": { "version": "1.0.0", "resolved": "file:../openedx-frontend-base-1.0.0.tgz", - "integrity": "sha512-R/5Tj+ZjhqWgp4qzsColTdkKJUfdJnuB1474vfyV8B2SPd6YOcxSRPQExP1D6uHY5Q5ee8Ba+V29gnz9CINJpw==", + "integrity": "sha512-/VoPZDQLv+h03+ttJ4GuueKL6OfxwH/TF+vLGO+IiV48qrONKuRevObHLbe/05uLM1spj6UKUNvZoEOkaqs1IQ==", "peer": true, "dependencies": { "@babel/core": "^7.24.9", @@ -3289,8 +3289,8 @@ "i18n-iso-countries": "^4.3.1", "identity-obj-proxy": "3.0.0", "image-minimizer-webpack-plugin": "3.8.3", - "jest": "29.6.1", - "jest-environment-jsdom": "29.6.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "jwt-decode": "^3.1.2", "localforage": "^1.10.0", "localforage-memoryStorageDriver": "^0.9.2", @@ -10446,15 +10446,15 @@ } }, "node_modules/jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", - "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "peer": true, "dependencies": { - "@jest/core": "^29.6.1", - "@jest/types": "^29.6.1", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.1" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -10696,18 +10696,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.1.tgz", - "integrity": "sha512-PoY+yLaHzVRhVEjcVKSfJ7wXmJW4UqPYNhR05h7u/TK0ouf6DmRNZFBL/Z00zgQMyWGMBXn69/FmOvhEJu8cIw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "peer": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { @@ -12158,9 +12158,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", "peer": true }, "node_modules/object-assign": { From fd5540227464f0a2095350cf28e20c45edc72625 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 13:49:52 -0400 Subject: [PATCH 03/75] fix(deps): eslint, autoprefixer, postcss version bumps --- package-lock.json | 432 ++++++++++++++++++++-------- package.json | 14 +- test-project/package-lock.json | 497 +++++++++++++++++++++++++-------- 3 files changed, 697 insertions(+), 246 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91a98cf5..a088526e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@types/gradient-string": "^1.1.6", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "autoprefixer": "10.4.19", + "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", "babel-jest": "^29.7.0", @@ -36,14 +36,14 @@ "compression": "^1.7.4", "css-loader": "5.2.7", "cssnano": "6.0.3", - "eslint": "8.44.0", + "eslint": "^8.57.1", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^4.6.2", "express": "^4.18.2", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", @@ -66,7 +66,7 @@ "lodash.snakecase": "^4.1.1", "mini-css-extract-plugin": "1.6.2", "parse5": "7.1.2", - "postcss": "8.4.40", + "postcss": "^8.4.47", "postcss-custom-media": "10.0.8", "postcss-loader": "7.3.4", "postcss-rtlcss": "5.1.2", @@ -2150,9 +2150,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2457,12 +2457,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -3385,6 +3385,11 @@ "react": ">=16.8.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4277,6 +4282,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -4735,6 +4745,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -4794,6 +4805,44 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -4871,9 +4920,9 @@ "peer": true }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -4898,9 +4947,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "funding": [ { "type": "opencollective", @@ -4916,11 +4965,11 @@ } ], "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4998,9 +5047,9 @@ } }, "node_modules/axobject-query": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.4.tgz", - "integrity": "sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "engines": { "node": ">= 0.4" } @@ -6506,6 +6555,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", @@ -7116,6 +7166,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -7131,6 +7182,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", @@ -7238,26 +7313,28 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7267,7 +7344,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -7279,7 +7355,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -7363,9 +7438,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz", - "integrity": "sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dependencies": { "debug": "^3.2.7" }, @@ -7413,31 +7488,35 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -7480,32 +7559,40 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz", + "integrity": "sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g==", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.1.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "engines": { + "node": ">= 0.4" } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { @@ -7534,37 +7621,40 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "engines": { "node": ">=10" }, @@ -8836,14 +8926,6 @@ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -9570,6 +9652,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9601,6 +9684,20 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -9736,6 +9833,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -10159,6 +10267,21 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -11402,11 +11525,14 @@ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/launch-editor": { @@ -12275,6 +12401,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -12341,20 +12468,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dependencies": { + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { @@ -12832,9 +12956,9 @@ } }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -12851,8 +12975,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -14533,6 +14657,26 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -15633,6 +15777,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, "dependencies": { "internal-slot": "^1.0.4" }, @@ -15761,6 +15906,19 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -15786,6 +15944,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -17483,6 +17650,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", diff --git a/package.json b/package.json index e0609e6a..8138699a 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@types/gradient-string": "^1.1.6", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "autoprefixer": "10.4.19", + "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", "babel-jest": "^29.7.0", @@ -75,14 +75,14 @@ "compression": "^1.7.4", "css-loader": "5.2.7", "cssnano": "6.0.3", - "eslint": "8.44.0", + "eslint": "^8.57.1", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^4.6.2", "express": "^4.18.2", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", @@ -105,7 +105,7 @@ "lodash.snakecase": "^4.1.1", "mini-css-extract-plugin": "1.6.2", "parse5": "7.1.2", - "postcss": "8.4.40", + "postcss": "^8.4.47", "postcss-custom-media": "10.0.8", "postcss-loader": "7.3.4", "postcss-rtlcss": "5.1.2", diff --git a/test-project/package-lock.json b/test-project/package-lock.json index c6185379..b442b3e3 100644 --- a/test-project/package-lock.json +++ b/test-project/package-lock.json @@ -2185,9 +2185,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2510,13 +2510,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -3240,7 +3240,7 @@ "node_modules/@openedx/frontend-base": { "version": "1.0.0", "resolved": "file:../openedx-frontend-base-1.0.0.tgz", - "integrity": "sha512-/VoPZDQLv+h03+ttJ4GuueKL6OfxwH/TF+vLGO+IiV48qrONKuRevObHLbe/05uLM1spj6UKUNvZoEOkaqs1IQ==", + "integrity": "sha512-JvSfShhhXULQvnmhudTml16jEzEGR9xJiAKgYhMKj1Djx9k041jz2RxN4yJYYl+n04SSKYo6PueTQRgBQlFoJw==", "peer": true, "dependencies": { "@babel/core": "^7.24.9", @@ -3259,7 +3259,7 @@ "@types/gradient-string": "^1.1.6", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "autoprefixer": "10.4.19", + "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", "babel-jest": "^29.7.0", @@ -3270,14 +3270,14 @@ "compression": "^1.7.4", "css-loader": "5.2.7", "cssnano": "6.0.3", - "eslint": "8.44.0", + "eslint": "^8.57.1", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^4.6.2", "express": "^4.18.2", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", @@ -3300,7 +3300,7 @@ "lodash.snakecase": "^4.1.1", "mini-css-extract-plugin": "1.6.2", "parse5": "7.1.2", - "postcss": "8.4.40", + "postcss": "^8.4.47", "postcss-custom-media": "10.0.8", "postcss-loader": "7.3.4", "postcss-rtlcss": "5.1.2", @@ -3556,6 +3556,12 @@ "react": ">=16.8.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "peer": true + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4269,6 +4275,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "peer": true + }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -4838,6 +4850,46 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -4919,9 +4971,9 @@ "peer": true }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "peer": true }, "node_modules/asynckit": { @@ -4949,9 +5001,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "funding": [ { "type": "opencollective", @@ -4968,11 +5020,11 @@ ], "peer": true, "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5041,9 +5093,9 @@ } }, "node_modules/axobject-query": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.4.tgz", - "integrity": "sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "peer": true, "engines": { "node": ">= 0.4" @@ -7276,6 +7328,31 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", @@ -7393,27 +7470,29 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7423,7 +7502,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -7435,7 +7513,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -7524,9 +7601,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz", - "integrity": "sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "peer": true, "dependencies": { "debug": "^3.2.7" @@ -7578,32 +7655,36 @@ "peer": true }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "peer": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -7650,33 +7731,33 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz", + "integrity": "sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g==", "peer": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.1.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { @@ -7708,38 +7789,41 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "peer": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "peer": true, "engines": { "node": ">=10" @@ -9122,15 +9206,6 @@ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "peer": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -9915,6 +9990,21 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "peer": true }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -10036,6 +10126,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -10090,6 +10192,18 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -10223,6 +10337,18 @@ "node": ">=6" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -10307,6 +10433,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -10319,6 +10457,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -10445,6 +10599,22 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -11425,12 +11595,15 @@ "peer": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "peer": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/launch-editor": { @@ -12254,21 +12427,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "peer": true, "dependencies": { + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { @@ -12790,9 +12960,9 @@ } }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -12810,8 +12980,8 @@ "peer": true, "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -14543,6 +14713,27 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -15833,6 +16024,20 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "peer": true }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -15859,6 +16064,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "peer": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -17639,6 +17854,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "peer": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "peer": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", From 6046223ba5650296fcb18c31395d7eb033fe02a3 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 14:25:57 -0400 Subject: [PATCH 04/75] fix(deps): bumping webpack and style/scss related build dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There were several breaking changes, new warnings, and changes in here. - Migrate from @import to @use in SCSS files. - replace “compileType” with “mode” in css-loader options - Set “namedExport” to false to preserve behavior of earlier css-loader versions - Switching from ‘sass’ to ‘sass-embedded’ to improve build performance. --- package-lock.json | 2100 ++++++++++++----- package.json | 20 +- shell/index.scss | 4 +- test-project/src/project.scss | 2 +- .../common-config/all/getStylesheetRule.ts | 6 +- .../webpack/common-config/dev/getDevServer.ts | 9 +- 6 files changed, 1547 insertions(+), 594 deletions(-) diff --git a/package-lock.json b/package-lock.json index a088526e..ab7c7789 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,8 +34,8 @@ "classnames": "^2.5.1", "clean-webpack-plugin": "4.0.0", "compression": "^1.7.4", - "css-loader": "5.2.7", - "cssnano": "6.0.3", + "css-loader": "^7.1.2", + "cssnano": "^6.1.2", "eslint": "^8.57.1", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", @@ -69,7 +69,7 @@ "postcss": "^8.4.47", "postcss-custom-media": "10.0.8", "postcss-loader": "7.3.4", - "postcss-rtlcss": "5.1.2", + "postcss-rtlcss": "^5.5.0", "prop-types": "^15.8.1", "pubsub-js": "^1.9.4", "react-dev-utils": "12.0.1", @@ -79,20 +79,20 @@ "react-refresh-typescript": "^2.0.9", "react-responsive": "^10.0.0", "react-transition-group": "^4.4.5", - "resolve-url-loader": "5.0.0", - "sass": "1.69.7", - "sass-loader": "13.3.3", - "sharp": "0.32.6", + "resolve-url-loader": "^5.0.0", + "sass-embedded": "^1.80.4", + "sass-loader": "^16.0.2", + "sharp": "^0.33.5", "source-map-loader": "4.0.2", - "style-loader": "3.3.4", + "style-loader": "^4.0.0", "ts-loader": "^9.5.1", "typescript": "^5.5.3", "universal-cookie": "^4.0.4", "url-loader": "4.1.1", - "webpack": "^5.89.0", + "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^5.1.0", "webpack-merge": "^5.10.0", "webpack-remove-empty-scripts": "1.0.4" }, @@ -1937,6 +1937,11 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", + "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==" + }, "node_modules/@cospired/i18n-iso-languages": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.2.0.tgz", @@ -2044,6 +2049,15 @@ "@newrelic/publish-sourcemap": "^5.0.1" } }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.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", @@ -2508,6 +2522,348 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead" }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2914,6 +3270,57 @@ "node": ">=v12.0.0" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -3228,71 +3635,358 @@ "react-intl": "^5.25.1 || ^6.4.0" } }, - "node_modules/@openedx/paragon/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/@openedx/paragon/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@openedx/paragon/node_modules/matchmediaquery": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", + "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "peer": true, + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, + "node_modules/@openedx/paragon/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@openedx/paragon/node_modules/react-responsive": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", + "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "peer": true, + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@openedx/paragon/node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "peer": true + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, "engines": { - "node": ">=12" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@openedx/paragon/node_modules/matchmediaquery": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", - "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "peer": true, - "dependencies": { - "css-mediaquery": "^0.1.2" + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@openedx/paragon/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@openedx/paragon/node_modules/react-responsive": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", - "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true, "peer": true, - "dependencies": { - "hyphenate-style-name": "^1.0.0", - "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1", - "shallow-equal": "^1.1.0" + "bin": { + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": ">= 0.10" - }, - "peerDependencies": { - "react": ">=16.8.0" + "node": ">=0.10" } }, - "node_modules/@openedx/paragon/node_modules/shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", - "peer": true - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", @@ -3970,9 +4664,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==" }, "node_modules/@types/scheduler": { "version": "0.16.8", @@ -5054,11 +5748,6 @@ "node": ">= 0.4" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -5207,48 +5896,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", - "optional": true, - "dependencies": { - "b4a": "^1.6.6", - "streamx": "^2.20.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5266,7 +5913,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/batch": { "version": "0.6.1", @@ -5296,6 +5944,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5473,16 +6122,36 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5677,11 +6346,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -5889,6 +6553,11 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -6172,47 +6841,37 @@ } }, "node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dependencies": { "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-loader/node_modules/semver": { @@ -6287,12 +6946,12 @@ } }, "node_modules/cssnano": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.3.tgz", - "integrity": "sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dependencies": { - "cssnano-preset-default": "^6.0.3", - "lilconfig": "^3.0.0" + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6524,20 +7183,6 @@ "node": ">=0.10" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -6583,14 +7228,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6604,15 +7241,30 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defaults": { @@ -7026,14 +7678,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -7956,14 +8600,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -8092,11 +8728,6 @@ "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -8579,11 +9210,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8731,11 +9357,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9333,6 +9954,14 @@ "node": ">=10.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "engines": { + "node": ">=10.18" + } + }, "node_modules/hyphenate-style-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", @@ -9399,7 +10028,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/ignore": { "version": "5.3.2", @@ -9885,6 +10515,37 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -9916,6 +10577,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -11997,17 +12669,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -12093,11 +12754,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -12146,11 +12802,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -12169,35 +12820,13 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node_modules/node-abort-controller": { @@ -12206,9 +12835,11 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "optional": true, + "peer": true }, "node_modules/node-forge": { "version": "1.3.1", @@ -12668,15 +13299,19 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -13448,11 +14083,11 @@ } }, "node_modules/postcss-rtlcss": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-5.1.2.tgz", - "integrity": "sha512-cmcgRoO1wL7IJyVHw0RneWI/5Oe75NLC2NLlQLsNI7hcui+yRcW4RrILfQa4FqKQRLTU4r5eF0YPi1qZpMzQpA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-5.5.0.tgz", + "integrity": "sha512-NkUw3Pq6JNLk/4yE4BszZNpvmLvcX5phTNA0X2thOOPmVVR7sgQXWY+0UjvucsLFL9mQ9IY+YckLyy07yLVijQ==", "dependencies": { - "rtlcss": "4.1.1" + "rtlcss": "4.3.0" }, "engines": { "node": ">=18.0.0" @@ -13507,57 +14142,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13685,15 +14269,6 @@ "resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.9.4.tgz", "integrity": "sha512-hJYpaDvPH4w8ZX/0Fdf9ma1AwRgU353GfbaVfPjfJQf1KxZ2iHaHl3fAUw1qlJIR5dr4F3RzjGaWohYUEyoh7A==" }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -13782,11 +14357,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/rambda": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.3.0.tgz", @@ -13830,28 +14400,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -14988,9 +15536,9 @@ } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -15004,6 +15552,17 @@ "node": ">=12.0.0" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -15031,101 +15590,459 @@ "url": "https://feross.org/support" } ], - "dependencies": { - "queue-microtask": "^1.2.2" + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.4.tgz", + "integrity": "sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w==", + "optional": true, + "peer": true, + "dependencies": { + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.80.4.tgz", + "integrity": "sha512-lPzKX5g79ZxohlPxh0pXTPFseWj9RfgYI0cPm14CH5ok77Ujuheq/DCp7RStvNDWS8RCQ8Ii6gJC/5WTkGyrhA==", + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.80.4", + "sass-embedded-android-arm64": "1.80.4", + "sass-embedded-android-ia32": "1.80.4", + "sass-embedded-android-riscv64": "1.80.4", + "sass-embedded-android-x64": "1.80.4", + "sass-embedded-darwin-arm64": "1.80.4", + "sass-embedded-darwin-x64": "1.80.4", + "sass-embedded-linux-arm": "1.80.4", + "sass-embedded-linux-arm64": "1.80.4", + "sass-embedded-linux-ia32": "1.80.4", + "sass-embedded-linux-musl-arm": "1.80.4", + "sass-embedded-linux-musl-arm64": "1.80.4", + "sass-embedded-linux-musl-ia32": "1.80.4", + "sass-embedded-linux-musl-riscv64": "1.80.4", + "sass-embedded-linux-musl-x64": "1.80.4", + "sass-embedded-linux-riscv64": "1.80.4", + "sass-embedded-linux-x64": "1.80.4", + "sass-embedded-win32-arm64": "1.80.4", + "sass-embedded-win32-ia32": "1.80.4", + "sass-embedded-win32-x64": "1.80.4" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.4.tgz", + "integrity": "sha512-iAZ7AiKTLGxQGTkZ37c2/7YC4lkbP1o3eP/K74YaF8O+qhKTLyLOwV7OcmzIywac7dqLcNuGqhFCmFqTYpewZw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.4.tgz", + "integrity": "sha512-htAuBmRvvN2d4smrqxZ6WBw4+OOURaoHzq5oZKqS/E35zYl5FHmrJzp4S5e26a0tEBcjca014tfb/uu9cQgnqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.4.tgz", + "integrity": "sha512-IIee89Jco8/ad2s/oRJTFqpLhBMzg0UXteJyZ5waZPZmkeSR/t9l67Ef1lLQVh9t9/fJ1ViTTiGYm/g/zu6UGw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.4.tgz", + "integrity": "sha512-iJM2kqmWrOeE1aUyTp3uMAG86hyAqbpbOEV7tv828fUsMRDM4uHsHtmyp2n8P2Y0Y2FnLzJpvIm3SwDXGDzT1Q==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.4.tgz", + "integrity": "sha512-vd8VrLvUoHeTcsDoIJesXLbQYZH26a8lAzXy6u4+vEuAwikF4WiXBDFrpqiv38QeD3faLeoPtksRsFbAdQqJAA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.4.tgz", + "integrity": "sha512-SJz7EM1i4NXa7CT/njIWMNYJ6CvbHljDIzUAZEe3V3u1KWl/eNO3pbWAnnDN62tBppwgWx/UdDUbAKowsT6Z8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.4.tgz", + "integrity": "sha512-J/QlBVO66DLtgALgCmM8rZ5zG0dBCIYW1eXIAnnDwC7vGkbAXMtO60M0O/2WNrAfmFfJz1hvKDLjlsxB2XGBLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.4.tgz", + "integrity": "sha512-vuaWhc4ebnaY1AgIWNvFv1snxmkWfvlCU7vnQf4qkn3R2Yyd2J+sjkO8o0NgMX8n5XRUSkAaYUJFCH+Nim6KgQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.4.tgz", + "integrity": "sha512-hI6zQyrR6qJbvyEHfj8UGXNB8VyUa72jel46406AuxUnViA0RyZDSqXUF8vwVw/Hjv1LkA5ihK9dBmWNbLz1zQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.4.tgz", + "integrity": "sha512-wcPExI8UbYrrJvGvo4v2Q+RktbCp44i3qZQ18hglPcVZOC1IzT9NPqZn0XmrqD4hmNbgsYR+picODkvqGw7iDA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.4.tgz", + "integrity": "sha512-HWo0G/9tuhj/uSEwte9KiDK2Xezrfh7nhdEH69ZIfOAqP5byTXL7o08TYagbvMAoljR43Vfna6MelV7NUX4WCw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.4.tgz", + "integrity": "sha512-y8slzQ8Jjkl+53mUDkp3zxcDrTXVVxzpa+6nKh5Ue8l1YU2KdVZG1v2PoDXxE6o99B5I2TVBG8i02IsdYoL8jQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.4.tgz", + "integrity": "sha512-A2WSwnomho491iCeHh3c0YRympfAoJOKr+IyxalTcRH/pjENOWZWZUt00WE2q0tTpEd2V+goWvgS5pmUGewgmg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.4.tgz", + "integrity": "sha512-tYQsAHZLr2mnlJQBJ8Z/n/ySIFJ9JWpsUsoLe9fYgGDaBUfItdzUnj15CChRWld8vFe/I84hb7fbCtYXrI60Jg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.4.tgz", + "integrity": "sha512-NZnr+SYbWlmXx0IaSQ8oF0jYkOULp9qKWMmmZQ1mxuGQ3z7tJqFhpH3M+hYkrFNeOq+GaH+nhHGOD4ZNBxeRkg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.4.tgz", + "integrity": "sha512-h/BmU7QONa7ScvQztFp4Th4aSo3X+Olu3I+RYsaH9s7P683WT3f2w5zr+wwP1V4roM5eyKDCRJBuefT3Fkkkgw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.4.tgz", + "integrity": "sha512-aZbZFs/X9bEmzDiBEiV4IAsKEA0zrCM+s/u2OzvrX4GRvZFJ+/XRTTvf+RTm7mgvTFgfPwCkNGVECQZ1eHh+6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/sass-embedded-win32-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.4.tgz", + "integrity": "sha512-8JiatFi2VVFqCdJzKNDteaPC4KPmh8/giaVh7TyMcDhKjnvRLeu3v5V1egTMiwwpnQHuwzU3uqBlm/llVNR2Pw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.4.tgz", + "integrity": "sha512-SodmTD6mjxEgoq44jWMibmBQvWkCfENK/70zp4qsztcBSOggg3nYUzwG0YpraClAMXpB1xOvzrArWu9/9fguAg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/sass-embedded-win32-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.4.tgz", + "integrity": "sha512-7+oRRwCCcnOmw152qDiC7x7SphYBo1eLB4KdyThO+7+rYRO8AftXO+kqBPTVSkM8kGp4wxCMF9auPpYBZbjsow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/sass": { - "version": "1.69.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", - "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", + "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -15136,9 +16053,42 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -15421,25 +16371,41 @@ "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==" }, "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "hasInstallScript": true, "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" + "detect-libc": "^2.0.3", + "semver": "^7.6.3" }, "engines": { - "node": ">=14.15.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" } }, "node_modules/sharp/node_modules/semver": { @@ -15502,49 +16468,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -15827,19 +16750,6 @@ "node": ">= 4.0.0" } }, - "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -16050,18 +16960,18 @@ } }, "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.27.0" } }, "node_modules/stylehacks": { @@ -16276,29 +17186,6 @@ "node": ">=6" } }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/terser": { "version": "5.34.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.0.tgz", @@ -16448,19 +17335,22 @@ "node": "*" } }, - "node_modules/text-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", - "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -16590,6 +17480,21 @@ "node": ">=12" } }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -16674,17 +17579,6 @@ "node": ">=0.6.x" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -17139,6 +18033,11 @@ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -17363,75 +18262,97 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", + "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", + "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.19.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", + "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -17442,6 +18363,17 @@ } } }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -17450,19 +18382,35 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": { - "glob": "^7.1.3" + "is-inside-container": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-merge": { diff --git a/package.json b/package.json index 8138699a..ac6d6fcd 100644 --- a/package.json +++ b/package.json @@ -73,8 +73,8 @@ "classnames": "^2.5.1", "clean-webpack-plugin": "4.0.0", "compression": "^1.7.4", - "css-loader": "5.2.7", - "cssnano": "6.0.3", + "css-loader": "^7.1.2", + "cssnano": "^6.1.2", "eslint": "^8.57.1", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", @@ -108,7 +108,7 @@ "postcss": "^8.4.47", "postcss-custom-media": "10.0.8", "postcss-loader": "7.3.4", - "postcss-rtlcss": "5.1.2", + "postcss-rtlcss": "^5.5.0", "prop-types": "^15.8.1", "pubsub-js": "^1.9.4", "react-dev-utils": "12.0.1", @@ -118,20 +118,20 @@ "react-refresh-typescript": "^2.0.9", "react-responsive": "^10.0.0", "react-transition-group": "^4.4.5", - "resolve-url-loader": "5.0.0", - "sass": "1.69.7", - "sass-loader": "13.3.3", - "sharp": "0.32.6", + "resolve-url-loader": "^5.0.0", + "sass-embedded": "^1.80.4", + "sass-loader": "^16.0.2", + "sharp": "^0.33.5", "source-map-loader": "4.0.2", - "style-loader": "3.3.4", + "style-loader": "^4.0.0", "ts-loader": "^9.5.1", "typescript": "^5.5.3", "universal-cookie": "^4.0.4", "url-loader": "4.1.1", - "webpack": "^5.89.0", + "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^5.1.0", "webpack-merge": "^5.10.0", "webpack-remove-empty-scripts": "1.0.4" }, diff --git a/shell/index.scss b/shell/index.scss index 7b8dae94..4da264cb 100644 --- a/shell/index.scss +++ b/shell/index.scss @@ -1,6 +1,6 @@ -@import "@openedx/paragon/scss/core/core.scss"; +@use "@openedx/paragon/scss/core/core.scss"; -@import "./footer/footer"; +@use "./footer/footer"; .flex-basis-0 { flex-basis: 0 !important; diff --git a/test-project/src/project.scss b/test-project/src/project.scss index 717c19c5..ab8284d0 100644 --- a/test-project/src/project.scss +++ b/test-project/src/project.scss @@ -1,4 +1,4 @@ -@import '@openedx/frontend-base/shell/index.scss'; +@use '@openedx/frontend-base/shell/index.scss'; $h3-color: red; diff --git a/tools/webpack/common-config/all/getStylesheetRule.ts b/tools/webpack/common-config/all/getStylesheetRule.ts index df18b6c7..219fa641 100644 --- a/tools/webpack/common-config/all/getStylesheetRule.ts +++ b/tools/webpack/common-config/all/getStylesheetRule.ts @@ -56,7 +56,11 @@ function getStyleUseConfig(mode: 'dev' | 'production') { options: { sourceMap: true, modules: { - compileType: 'icss', + // namedExport defaults to true in css-loader v7, but we rely on the old behavior. + // Details here: + // https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md#700-2024-04-04 + namedExport: false, + mode: 'icss', }, }, }, diff --git a/tools/webpack/common-config/dev/getDevServer.ts b/tools/webpack/common-config/dev/getDevServer.ts index 24102089..969c7712 100644 --- a/tools/webpack/common-config/dev/getDevServer.ts +++ b/tools/webpack/common-config/dev/getDevServer.ts @@ -21,12 +21,13 @@ export default function getDevServer(): Configuration { host: 'apps.local.openedx.io', hot: true, port: process.env.PORT || 8080, - proxy: { - '/api/mfe_config/v1': { + proxy: [ + { + context: ['/api/mfe_config/v1'], target: 'http://local.openedx.io:8000', changeOrigin: true, - }, - }, + } + ], // Enable hot reloading server. It will provide WDS_SOCKET_PATH endpoint // for the WebpackDevServer client so it can learn when the files were // updated. The WebpackDevServer client is included as an entry point From 7c3f1fc265db0c8365663b0460097ad3861c0978 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 14:39:55 -0400 Subject: [PATCH 05/75] fix(deps): upgrading eslint-config-airbnb and @typescript-eslint dependencies --- package-lock.json | 414 ++++++++++++++++++++++++++++++++++++++++------ package.json | 16 +- 2 files changed, 373 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab7c7789..ce744445 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,24 +21,24 @@ "@formatjs/ts-transformer": "^3.13.14", "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", - "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@types/gradient-string": "^1.1.6", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", "babel-jest": "^29.7.0", "babel-plugin-formatjs": "^10.5.16", - "chalk": "4.1.2", + "chalk": "^4.1.2", "classnames": "^2.5.1", - "clean-webpack-plugin": "4.0.0", + "clean-webpack-plugin": "^4.0.0", "compression": "^1.7.4", "css-loader": "^7.1.2", "cssnano": "^6.1.2", "eslint": "^8.57.1", - "eslint-config-airbnb": "19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^18.0.0", "eslint-plugin-formatjs": "^4.12.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.1", @@ -88,7 +88,7 @@ "ts-loader": "^9.5.1", "typescript": "^5.5.3", "universal-cookie": "^4.0.4", - "url-loader": "4.1.1", + "url-loader": "^4.1.1", "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", @@ -4762,32 +4762,85 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -4795,6 +4848,57 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -4807,25 +4911,80 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -4833,6 +4992,47 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", @@ -4850,24 +5050,79 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -4875,6 +5130,68 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", @@ -8050,17 +8367,16 @@ } }, "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", - "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", + "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", "dependencies": { "eslint-config-airbnb-base": "^15.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" } }, "node_modules/eslint-import-resolver-node": { diff --git a/package.json b/package.json index ac6d6fcd..ac3aa017 100644 --- a/package.json +++ b/package.json @@ -60,24 +60,24 @@ "@formatjs/ts-transformer": "^3.13.14", "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", - "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@types/gradient-string": "^1.1.6", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", "babel-jest": "^29.7.0", "babel-plugin-formatjs": "^10.5.16", - "chalk": "4.1.2", + "chalk": "^4.1.2", "classnames": "^2.5.1", - "clean-webpack-plugin": "4.0.0", + "clean-webpack-plugin": "^4.0.0", "compression": "^1.7.4", "css-loader": "^7.1.2", "cssnano": "^6.1.2", "eslint": "^8.57.1", - "eslint-config-airbnb": "19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^18.0.0", "eslint-plugin-formatjs": "^4.12.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.1", @@ -127,7 +127,7 @@ "ts-loader": "^9.5.1", "typescript": "^5.5.3", "universal-cookie": "^4.0.4", - "url-loader": "4.1.1", + "url-loader": "^4.1.1", "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", From a7d34723468289a0f1a5d0fba3dff9a36f3154f9 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 14:40:10 -0400 Subject: [PATCH 06/75] docs: noting that @import needs to be converted to @use in MFEs --- docs/how_tos/migrate-frontend-app.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index a1e6e2a4..bdfb150c 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -536,3 +536,5 @@ https://react-redux.js.org/using-react-redux/accessing-store#multiple-stores ## 27. Subdomains!? ## 28. Add LEARNER_DASHBOARD_URL to config + +## 29. Convert @import to @use in SCSS files. From 0f1267269e586466d630cea7db98a2fd2dfa31a7 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 24 Oct 2024 14:41:20 -0400 Subject: [PATCH 07/75] fix(deps): running npm audit fix --- package-lock.json | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce744445..2a4d02b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3584,17 +3584,10 @@ } }, "node_modules/@openedx/paragon": { - "version": "22.8.1", - "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-22.8.1.tgz", - "integrity": "sha512-lm2x0tvNZrtJvp0L+cjvLLmkE9NoUbNIzt9L1FaOx9g92gf8rFVgq4aadq7IVAjN12HW19/QJMEJaQ0SVsvY2A==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-22.9.0.tgz", + "integrity": "sha512-r5xD+z64U3phkgT4ooUQaxE/4Rv0D91tpS3kA+mLfOT1vMD8jXIjDZp+/k4BEw4yqWQ8Eyb//ar8xiwL/ugojQ==", "peer": true, - "workspaces": [ - "example", - "component-generator", - "www", - "icons", - "dependent-usage-analyzer" - ], "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", @@ -7005,9 +6998,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -8943,16 +8936,16 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -10228,9 +10221,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", From 0a21ba04be0ac0a9a0399d5a4fe41ad83f06a995 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 15:51:30 -0400 Subject: [PATCH 08/75] feat: Upgrade to ESLint 9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit upgrades us to the latest ESLint 9. It adds better linting for TypeScript, in particular. It removes eslint-plugin-airbnb and replaces it with the ‘recommended’ configs for eslint, typescript-eslint, react, and react-hooks. It also adds the eslint stylistic config, and modifies it to match our existing code style. Subsequent commits will fix all the styling issues found in this commit; the repository wasn’t linting very consistently before this, so somehow a bunch of stuff slipped through. --- .eslintignore | 5 - .eslintrc.js | 26 - .npmignore | 3 +- eslint.config.js | 18 + package-lock.json | 1528 +++++------------ package.json | 23 +- test-project/.eslintignore | 5 - test-project/.eslintrc.js | 7 - test-project/eslint.config.js | 23 + test-project/package-lock.json | 2930 +++++++++++++++++--------------- test-project/package.json | 2 +- test-project/tsconfig.json | 2 +- tools/eslint.config.js | 15 + tools/eslint/.eslintrc.js | 91 - tools/tsconfig.json | 4 +- tsconfig.json | 3 +- 16 files changed, 2125 insertions(+), 2560 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.js delete mode 100644 test-project/.eslintignore delete mode 100644 test-project/.eslintrc.js create mode 100644 test-project/eslint.config.js create mode 100644 tools/eslint.config.js delete mode 100644 tools/eslint/.eslintrc.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 0db94630..00000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage/* -dist/ -node_modules/ -__mocks__/ -__snapshots__/ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index b8f9a534..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,26 +0,0 @@ -const path = require('path'); -const { merge } = require('webpack-merge'); - -const config = require('./tools/eslint/.eslintrc.js'); - -module.exports = merge(config, { - ignorePatterns: [ - 'test-project', - 'docs', - '.eslintrc.js', - 'frontend-base.d.ts', - 'coverage', - 'tools', - 'config', - 'dist', - ], - parserOptions: { - project: path.resolve(__dirname, './tsconfig.json'), - }, - rules: { - 'no-console': 'off', - 'import/no-dynamic-require': 'off', - 'global-require': 'off', - 'no-template-curly-in-string': 'off', - }, -}); diff --git a/.npmignore b/.npmignore index 2ed768b0..64c5908d 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,5 @@ __mocks__ -.eslintignore -./.eslintrc.js +./eslint.config.js .github .gitignore *.test.js diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..b10cb1ab --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,18 @@ +// @ts-check + +const tseslint = require('typescript-eslint'); +const eslintConfig = require('./tools/eslint/base.eslint.config.js'); + +module.exports = tseslint.config( + { + extends: eslintConfig, + }, + { + ignores: [ + 'tools/*', + 'test-project/*', + 'config/*', + 'docs/*', + ], + }, +); diff --git a/package-lock.json b/package-lock.json index 2a4d02b3..c29a9440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,8 @@ "@babel/preset-typescript": "^7.24.7", "@cospired/i18n-iso-languages": "^4.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", + "@eslint/compat": "^1.2.1", + "@eslint/js": "^9.13.0", "@formatjs/cli": "^6.0.3", "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", @@ -22,9 +24,9 @@ "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@stylistic/eslint-plugin": "^2.9.0", + "@types/eslint__js": "^8.42.3", "@types/gradient-string": "^1.1.6", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", @@ -36,19 +38,18 @@ "compression": "^1.7.4", "css-loader": "^7.1.2", "cssnano": "^6.1.2", - "eslint": "^8.57.1", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "^2.31.0", + "eslint": "^9.13.0", + "eslint-plugin-formatjs": "^5.1.3", + "eslint-plugin-jest": "^28.8.3", "eslint-plugin-jsx-a11y": "^6.10.1", "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-hooks": "^5.0.0", "express": "^4.18.2", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", "form-urlencoded": "^6.1.5", "glob": "^7.2.3", + "globals": "^15.11.0", "gradient-string": "^2.0.2", "history": "^4.10.1", "html-webpack-plugin": "5.6.0", @@ -86,7 +87,8 @@ "source-map-loader": "4.0.2", "style-loader": "^4.0.0", "ts-loader": "^9.5.1", - "typescript": "^5.5.3", + "typescript": "^5.6.3", + "typescript-eslint": "^8.11.0", "universal-cookie": "^4.0.4", "url-loader": "^4.1.1", "webpack": "^5.95.0", @@ -1024,6 +1026,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", @@ -1919,6 +1929,14 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.25.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", @@ -2080,15 +2098,52 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/compat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.1.tgz", + "integrity": "sha512-JbHG2TWuCeNzh87fXo+/46Z1LEo9DBA9T188d0fZgGxAD+cNyS6sx9fdiyxjGPBMyQVRlCutTByZ6a5+YMkF7g==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2096,7 +2151,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2107,24 +2162,12 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2141,34 +2184,31 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@eslint/js": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "dependencies": { + "levn": "^0.4.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@formatjs/cli": { @@ -2470,38 +2510,24 @@ "react": ">=16.x" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2516,11 +2542,17 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", @@ -4072,11 +4104,6 @@ "react": ">=16.8.0" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4098,6 +4125,46 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.9.0.tgz", + "integrity": "sha512-OrDyFAYjBT61122MIY1a3SfEgy3YCMgt2vL4eoPmvTwDBwyQhAXurxNQznlRD/jESNfYWfID8Ej+31LljvF7Xg==", + "dependencies": { + "@typescript-eslint/utils": "^8.8.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@testing-library/dom": { "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", @@ -4339,14 +4406,22 @@ "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" }, "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dependencies": { + "@types/eslint": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -4526,11 +4601,6 @@ "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz", "integrity": "sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -4609,9 +4679,9 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/picomatch": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.4.tgz", - "integrity": "sha512-0so8lU8O5zatZS/2Fi4zrwks+vZv7e0dygrgEZXljODXBig97l4cPQD+9LabXfGJOWwoRkTVz6Q4edZvD12UOA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==" }, "node_modules/@types/prop-types": { "version": "15.7.13", @@ -4755,30 +4825,30 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4786,54 +4856,26 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "node_modules/@typescript-eslint/parser": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4841,139 +4883,73 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", - "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "node_modules/@typescript-eslint/types": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4985,23 +4961,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", @@ -5015,7 +4975,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -5026,278 +4986,50 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.11.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "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/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "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/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { @@ -5828,25 +5560,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -6001,9 +5714,9 @@ } }, "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "engines": { "node": ">=4" } @@ -6941,11 +6654,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -7810,14 +7518,14 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dom-accessibility-api": { @@ -8267,248 +7975,174 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.13.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "node_modules/eslint-plugin-formatjs": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.1.3.tgz", + "integrity": "sha512-6PweMZPBPFX4Corrn2PoKGKPdiUiHabvOts76XuW9//UWSybUUBBqmPtdc+GUTOurv3/kkowBE7r7XsJ1KaSaw==", + "dependencies": { + "@formatjs/icu-messageformat-parser": "2.8.0", + "@formatjs/ts-transformer": "3.13.18", + "@types/eslint": "9", + "@types/picomatch": "3", + "@typescript-eslint/utils": "8.11.0", + "emoji-regex": "10", + "magic-string": "^0.30.0", + "picomatch": "2 || 3 || 4", + "tslib": "^2.7.0", + "typescript": "5", + "unicode-emoji-utils": "^1.2.0" }, "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "eslint": "9" } }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", - "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz", + "integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==", "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@formatjs/fast-memoize": "2.2.1", + "@formatjs/intl-localematcher": "0.5.5", + "tslib": "^2.7.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/fast-memoize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz", + "integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "tslib": "^2.7.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.8.0.tgz", + "integrity": "sha512-r2un3fmF9oJv3mOkH+wwQZ037VpqmdfahbcCZ9Lh+p6Sx+sNsonI7Zcr6jNMm1s+Si7ejQORS4Ezlh05mMPAXA==", "dependencies": { - "ms": "^2.1.1" + "@formatjs/ecma402-abstract": "2.2.0", + "@formatjs/icu-skeleton-parser": "1.8.4", + "tslib": "^2.7.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz", + "integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==", "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "@formatjs/ecma402-abstract": "2.2.0", + "tslib": "^2.7.0" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz", + "integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==", "dependencies": { - "ms": "^2.1.1" + "tslib": "^2.7.0" } }, - "node_modules/eslint-plugin-formatjs": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.13.3.tgz", - "integrity": "sha512-4j3IVwaLEXblnvH2/ZIOZwc9zaaZf2+zyn/b8oLJRt6kMCTu2rIs4UsIxy5nBRYZzsBSh7k34JJ5/ngGtJ3kYw==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/ts-transformer": { + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.18.tgz", + "integrity": "sha512-bRUJsYLJ4n7GcKAa3a05ePmlsJPum0whNzqr4scUazH6DNr5twLLd2qzmQ9Qu4DDSA/l5X7+ZyuawYxYIpmpAQ==", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.7.8", - "@formatjs/ts-transformer": "3.13.14", - "@types/eslint": "7 || 8", - "@types/picomatch": "^2.3.0", - "@typescript-eslint/utils": "^6.18.1", - "emoji-regex": "^10.2.1", - "magic-string": "^0.30.0", - "picomatch": "^2.3.1", - "tslib": "2.6.2", - "typescript": "5", - "unicode-emoji-utils": "^1.2.0" + "@formatjs/icu-messageformat-parser": "2.8.0", + "@types/json-stable-stringify": "1", + "@types/node": "14 || 16 || 17 || 18 || 20", + "chalk": "4", + "json-stable-stringify": "1", + "tslib": "^2.7.0", + "typescript": "5" }, "peerDependencies": { - "eslint": "7 || 8" + "ts-jest": ">=27" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + } } }, - "node_modules/eslint-plugin-formatjs/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "node_modules/eslint-plugin-jest": { + "version": "28.8.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz", + "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "engines": { - "node": ">=4" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, "node_modules/eslint-plugin-jsx-a11y": { @@ -8548,31 +8182,11 @@ "node": ">= 0.4" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react": { "version": "7.37.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", @@ -8605,45 +8219,14 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", + "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { @@ -8663,15 +8246,15 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -8682,26 +8265,23 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -8717,31 +8297,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8756,17 +8311,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -8781,28 +8325,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -9138,14 +8682,14 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-loader": { @@ -9297,31 +8841,15 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -9403,15 +8931,6 @@ "webpack": "^5.11.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -9425,17 +8944,6 @@ "node": ">=12" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -9702,26 +9210,6 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -9758,11 +9246,14 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -10949,14 +10440,6 @@ "node": ">=6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -12753,9 +12236,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -13030,25 +12513,23 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/mkdirp": { @@ -13209,16 +12690,6 @@ "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -13228,18 +12699,6 @@ "node": ">=4" } }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/nodemon/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -13408,19 +12867,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -14806,15 +14252,6 @@ "node": ">=14" } }, - "node_modules/react-dev-utils/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/react-dev-utils/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -14905,17 +14342,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/react-dev-utils/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -15472,26 +14898,6 @@ "node": ">=6.0.0" } }, - "node_modules/recursive-readdir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -17624,26 +17030,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17845,36 +17231,6 @@ "node": ">=10" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", @@ -18000,9 +17356,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18011,6 +17367,28 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz", + "integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", + "@typescript-eslint/utils": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", diff --git a/package.json b/package.json index ac3aa017..50df607a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "clean": "rm -rf dist", "docs": "jsdoc -c jsdoc.json", "docs:watch": "nodemon -w runtime -w docs/template -w README.md -e js,jsx,ts,tsx --exec npm run docs", - "lint": "eslint .", + "lint": "eslint .; npm run lint:tools; npm --prefix ./test-project run lint", + "lint:tools": "cd ./tools && eslint . && cd ..", "test": "npm run test:tools && npm run test:app && npm run test:runtime && npm run test:shell", "test:app": "npm --prefix ./test-project i; npm --prefix ./test-project run build", "test:tools": "jest tools --config tools/jest.config.js --no-cache", @@ -54,6 +55,8 @@ "@babel/preset-typescript": "^7.24.7", "@cospired/i18n-iso-languages": "^4.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", + "@eslint/compat": "^1.2.1", + "@eslint/js": "^9.13.0", "@formatjs/cli": "^6.0.3", "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", @@ -61,9 +64,9 @@ "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@stylistic/eslint-plugin": "^2.9.0", + "@types/eslint__js": "^8.42.3", "@types/gradient-string": "^1.1.6", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", @@ -75,19 +78,18 @@ "compression": "^1.7.4", "css-loader": "^7.1.2", "cssnano": "^6.1.2", - "eslint": "^8.57.1", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "^2.31.0", + "eslint": "^9.13.0", + "eslint-plugin-formatjs": "^5.1.3", + "eslint-plugin-jest": "^28.8.3", "eslint-plugin-jsx-a11y": "^6.10.1", "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-hooks": "^5.0.0", "express": "^4.18.2", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", "form-urlencoded": "^6.1.5", "glob": "^7.2.3", + "globals": "^15.11.0", "gradient-string": "^2.0.2", "history": "^4.10.1", "html-webpack-plugin": "5.6.0", @@ -125,7 +127,8 @@ "source-map-loader": "4.0.2", "style-loader": "^4.0.0", "ts-loader": "^9.5.1", - "typescript": "^5.5.3", + "typescript": "^5.6.3", + "typescript-eslint": "^8.11.0", "universal-cookie": "^4.0.4", "url-loader": "^4.1.1", "webpack": "^5.95.0", diff --git a/test-project/.eslintignore b/test-project/.eslintignore deleted file mode 100644 index 0db94630..00000000 --- a/test-project/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage/* -dist/ -node_modules/ -__mocks__/ -__snapshots__/ diff --git a/test-project/.eslintrc.js b/test-project/.eslintrc.js deleted file mode 100644 index 2cffd1e0..00000000 --- a/test-project/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -const { createConfig } = require('@openedx/frontend-base/config'); - -module.exports = createConfig('lint', { - parserOptions: { - project: './tsconfig.json', - }, -}); diff --git a/test-project/eslint.config.js b/test-project/eslint.config.js new file mode 100644 index 00000000..f394885b --- /dev/null +++ b/test-project/eslint.config.js @@ -0,0 +1,23 @@ +// @ts-check + +const tseslint = require('typescript-eslint'); +const eslintConfig = require('../tools/eslint/base.eslint.config.js'); + +module.exports = tseslint.config( + { + extends: eslintConfig, + }, + { + languageOptions: { + parserOptions: { + projectService: true, + } + } + }, + { + files: [ + 'src/**/*', + 'site.config.*', + ], + }, +); diff --git a/test-project/package-lock.json b/test-project/package-lock.json index b442b3e3..0f7bf116 100644 --- a/test-project/package-lock.json +++ b/test-project/package-lock.json @@ -1950,6 +1950,12 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "peer": true }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", + "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==", + "peer": true + }, "node_modules/@cospired/i18n-iso-languages": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.2.0.tgz", @@ -2070,6 +2076,16 @@ "@newrelic/publish-sourcemap": "^5.0.1" } }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.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", @@ -2094,16 +2110,56 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/compat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.1.tgz", + "integrity": "sha512-JbHG2TWuCeNzh87fXo+/46Z1LEo9DBA9T188d0fZgGxAD+cNyS6sx9fdiyxjGPBMyQVRlCutTByZ6a5+YMkF7g==", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2111,7 +2167,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2123,26 +2179,13 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "peer": true }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2160,37 +2203,34 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/js": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", "peer": true, + "dependencies": { + "levn": "^0.4.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@formatjs/cli": { @@ -2504,68 +2544,420 @@ "dependencies": { "prop-types": "^15.8.1" }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.x" + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.x" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.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==", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "peer": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, "engines": { - "node": ">=10.10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "optional": true, "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "peer": true, "engines": { - "node": ">=12.22" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "peer": true - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2955,6 +3347,60 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "peer": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "peer": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "peer": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -3240,7 +3686,7 @@ "node_modules/@openedx/frontend-base": { "version": "1.0.0", "resolved": "file:../openedx-frontend-base-1.0.0.tgz", - "integrity": "sha512-JvSfShhhXULQvnmhudTml16jEzEGR9xJiAKgYhMKj1Djx9k041jz2RxN4yJYYl+n04SSKYo6PueTQRgBQlFoJw==", + "integrity": "sha512-zMwMaM1yKGKwlEdgN6N+yfnzJREaW8CdYMrLaqtKp6F3Sk5bDOemm1gLQ07knMnIyxwx4h2DOb5/XPV3YqWOng==", "peer": true, "dependencies": { "@babel/core": "^7.24.9", @@ -3249,40 +3695,40 @@ "@babel/preset-typescript": "^7.24.7", "@cospired/i18n-iso-languages": "^4.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", + "@eslint/compat": "^1.2.1", + "@eslint/js": "^9.13.0", "@formatjs/cli": "^6.0.3", "@formatjs/intl-pluralrules": "^4.3.3", "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", - "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@types/eslint__js": "^8.42.3", "@types/gradient-string": "^1.1.6", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.20", "axios": "^1.7.7", "axios-cache-interceptor": "^1.6.0", "babel-jest": "^29.7.0", "babel-plugin-formatjs": "^10.5.16", - "chalk": "4.1.2", + "chalk": "^4.1.2", "classnames": "^2.5.1", - "clean-webpack-plugin": "4.0.0", + "clean-webpack-plugin": "^4.0.0", "compression": "^1.7.4", - "css-loader": "5.2.7", - "cssnano": "6.0.3", - "eslint": "^8.57.1", - "eslint-config-airbnb": "19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-plugin-formatjs": "^4.12.2", - "eslint-plugin-import": "^2.31.0", + "css-loader": "^7.1.2", + "cssnano": "^6.1.2", + "eslint": "^9.13.0", + "eslint-plugin-formatjs": "^5.1.3", + "eslint-plugin-jest": "^28.8.3", "eslint-plugin-jsx-a11y": "^6.10.1", "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-hooks": "^5.0.0", "express": "^4.18.2", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "^9.0.2", "form-urlencoded": "^6.1.5", "glob": "^7.2.3", + "globals": "^15.11.0", "gradient-string": "^2.0.2", "history": "^4.10.1", "html-webpack-plugin": "5.6.0", @@ -3303,7 +3749,7 @@ "postcss": "^8.4.47", "postcss-custom-media": "10.0.8", "postcss-loader": "7.3.4", - "postcss-rtlcss": "5.1.2", + "postcss-rtlcss": "^5.5.0", "prop-types": "^15.8.1", "pubsub-js": "^1.9.4", "react-dev-utils": "12.0.1", @@ -3313,20 +3759,21 @@ "react-refresh-typescript": "^2.0.9", "react-responsive": "^10.0.0", "react-transition-group": "^4.4.5", - "resolve-url-loader": "5.0.0", - "sass": "1.69.7", - "sass-loader": "13.3.3", - "sharp": "0.32.6", + "resolve-url-loader": "^5.0.0", + "sass-embedded": "^1.80.4", + "sass-loader": "^16.0.2", + "sharp": "^0.33.5", "source-map-loader": "4.0.2", - "style-loader": "3.3.4", + "style-loader": "^4.0.0", "ts-loader": "^9.5.1", - "typescript": "^5.5.3", + "typescript": "^5.6.3", + "typescript-eslint": "^8.11.0", "universal-cookie": "^4.0.4", - "url-loader": "4.1.1", - "webpack": "^5.89.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^5.1.0", "webpack-merge": "^5.10.0", "webpack-remove-empty-scripts": "1.0.4" }, @@ -3345,6 +3792,18 @@ "redux": "^4.2.1" } }, + "node_modules/@openedx/frontend-base/node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@openedx/paragon": { "version": "22.8.1", "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-22.8.1.tgz", @@ -3556,12 +4015,6 @@ "react": ">=16.8.0" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "peer": true - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -3699,15 +4152,24 @@ "peer": true }, "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "peer": true, + "dependencies": { + "@types/eslint": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -3862,12 +4324,6 @@ "integrity": "sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==", "peer": true }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "peer": true - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -3902,9 +4358,9 @@ "peer": true }, "node_modules/@types/picomatch": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.4.tgz", - "integrity": "sha512-0so8lU8O5zatZS/2Fi4zrwks+vZv7e0dygrgEZXljODXBig97l4cPQD+9LabXfGJOWwoRkTVz6Q4edZvD12UOA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==", "peer": true }, "node_modules/@types/prop-types": { @@ -3945,9 +4401,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "peer": true }, "node_modules/@types/semver": { @@ -4050,33 +4506,31 @@ "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4084,39 +4538,27 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4125,16 +4567,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", "peer": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4142,26 +4584,23 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -4169,12 +4608,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", "peer": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4182,22 +4621,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", "peer": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4209,6 +4648,21 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -4222,65 +4676,44 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", "peer": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.11.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "peer": true - }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -4870,26 +5303,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -5053,9 +5466,9 @@ } }, "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "peer": true, "engines": { "node": ">=4" @@ -5101,12 +5514,6 @@ "node": ">= 0.4" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "peer": true - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -5265,53 +5672,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "peer": true }, - "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", - "optional": true, - "peer": true - }, - "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", - "optional": true, - "peer": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "optional": true, - "peer": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "optional": true, - "peer": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", - "optional": true, - "peer": true, - "dependencies": { - "b4a": "^1.6.6", - "streamx": "^2.20.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5552,12 +5912,33 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "peer": true + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "peer": true }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "peer": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5753,12 +6134,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "peer": true - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -5984,6 +6359,12 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "peer": true }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "peer": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -6065,12 +6446,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "peer": true }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "peer": true - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -6295,49 +6670,38 @@ } }, "node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "peer": true, "dependencies": { "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-loader/node_modules/semver": { @@ -6412,13 +6776,13 @@ } }, "node_modules/cssnano": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.3.tgz", - "integrity": "sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "peer": true, "dependencies": { - "cssnano-preset-default": "^6.0.3", - "lilconfig": "^3.0.0" + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6665,22 +7029,7 @@ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "peer": true, "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "peer": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10" } }, "node_modules/dedent": { @@ -6703,15 +7052,6 @@ "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", "peer": true }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6727,16 +7067,32 @@ "node": ">=0.10.0" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "peer": true, "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defaults": { @@ -6994,15 +7350,15 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "peer": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dom-converter": { @@ -7183,15 +7539,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "peer": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -7470,264 +7817,182 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.13.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "peer": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - }, - "engines": { - "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "node_modules/eslint-plugin-formatjs": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.1.5.tgz", + "integrity": "sha512-MuRPHMgMTK5/eN0p3fZCBp0ZZMZSsCJXA49oa5I9RK+XMBrnxUOq41a3AcM9bOo4sWLQK0t52Q1oEV1MOz21iQ==", "peer": true, "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@formatjs/icu-messageformat-parser": "2.9.1", + "@formatjs/ts-transformer": "3.13.20", + "@types/eslint": "9", + "@types/picomatch": "3", + "@typescript-eslint/utils": "8.11.0", + "emoji-regex": "10", + "magic-string": "^0.30.0", + "picomatch": "2 || 3 || 4", + "tslib": "2", + "unicode-emoji-utils": "^1.2.0" }, "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "eslint": "9" } }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", - "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/ecma402-abstract": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.1.tgz", + "integrity": "sha512-O4ywpkdJybrjFc9zyL8qK5aklleIAi5O4nYhBVJaOFtCkNrnU+lKFeJOFC48zpsZQmR8Aok2V79hGpHnzbmFpg==", "peer": true, "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" + "@formatjs/fast-memoize": "2.2.2", + "@formatjs/intl-localematcher": "0.5.6", + "tslib": "2" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/fast-memoize": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.2.tgz", + "integrity": "sha512-mzxZcS0g1pOzwZTslJOBTmLzDXseMLLvnh25ymRilCm8QLMObsQ7x/rj9GNrH0iUhZMlFisVOD6J1n6WQqpKPQ==", "peer": true, "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "tslib": "2" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.1.tgz", + "integrity": "sha512-7AYk4tjnLi5wBkxst2w7qFj38JLMJoqzj7BhdEl7oTlsWMlqwgx4p9oMmmvpXWTSDGNwOKBRc1SfwMh5MOHeNg==", "peer": true, "dependencies": { - "ms": "^2.1.1" + "@formatjs/ecma402-abstract": "2.2.1", + "@formatjs/icu-skeleton-parser": "1.8.5", + "tslib": "2" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.5.tgz", + "integrity": "sha512-zRZ/e3B5qY2+JCLs7puTzWS1Jb+t/K+8Jur/gEZpA2EjWeLDE17nsx8thyo9P48Mno7UmafnPupV2NCJXX17Dg==", "peer": true, "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "@formatjs/ecma402-abstract": "2.2.1", + "tslib": "2" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.6.tgz", + "integrity": "sha512-roz1+Ba5e23AHX6KUAWmLEyTRZegM5YDuxuvkHCyK3RJddf/UXB2f+s7pOMm9ktfPGla0g+mQXOn5vsuYirnaA==", "peer": true, "dependencies": { - "ms": "^2.1.1" + "tslib": "2" } }, - "node_modules/eslint-plugin-formatjs": { - "version": "4.13.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.13.3.tgz", - "integrity": "sha512-4j3IVwaLEXblnvH2/ZIOZwc9zaaZf2+zyn/b8oLJRt6kMCTu2rIs4UsIxy5nBRYZzsBSh7k34JJ5/ngGtJ3kYw==", + "node_modules/eslint-plugin-formatjs/node_modules/@formatjs/ts-transformer": { + "version": "3.13.20", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.20.tgz", + "integrity": "sha512-63zGIsaLpxfu0w3jclfrgh8EBxbwO43IbCNIAWj31ZowFtgqIOBo7j/DspQCEhvpwDM2ErYfZv8DjV3cabphVQ==", "peer": true, "dependencies": { - "@formatjs/icu-messageformat-parser": "2.7.8", - "@formatjs/ts-transformer": "3.13.14", - "@types/eslint": "7 || 8", - "@types/picomatch": "^2.3.0", - "@typescript-eslint/utils": "^6.18.1", - "emoji-regex": "^10.2.1", - "magic-string": "^0.30.0", - "picomatch": "^2.3.1", - "tslib": "2.6.2", - "typescript": "5", - "unicode-emoji-utils": "^1.2.0" + "@formatjs/icu-messageformat-parser": "2.9.1", + "@types/json-stable-stringify": "1", + "@types/node": "14 || 16 || 17 || 18 || 20", + "chalk": "4", + "json-stable-stringify": "1", + "tslib": "2", + "typescript": "5" }, "peerDependencies": { - "eslint": "7 || 8" + "ts-jest": ">=27" + }, + "peerDependenciesMeta": { + "ts-jest": { + "optional": true + } } }, - "node_modules/eslint-plugin-formatjs/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "peer": true - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "node_modules/eslint-plugin-jest": { + "version": "28.8.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz", + "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", "peer": true, "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "engines": { - "node": ">=4" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" }, - "engines": { - "node": "*" + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, "node_modules/eslint-plugin-jsx-a11y": { @@ -7760,34 +8025,12 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "peer": true }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react": { "version": "7.37.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", @@ -7821,49 +8064,15 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", + "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", "peer": true, "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { @@ -7884,16 +8093,16 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7911,20 +8120,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "peer": true - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/find-up": { @@ -7943,58 +8148,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "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==", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "p-locate": "^5.0.0" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/p-locate": { @@ -8012,30 +8178,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "peer": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "peer": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -8152,15 +8318,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -8298,12 +8455,6 @@ "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", "peer": true }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "peer": true - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -8414,15 +8565,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "peer": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-loader": { @@ -8585,33 +8736,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "peer": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -8698,16 +8832,6 @@ "webpack": "^5.11.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -8722,18 +8846,6 @@ "node": ">=12" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -8825,12 +8937,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "peer": true - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8992,12 +9098,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "peer": true - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9037,28 +9137,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "peer": true }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -9643,6 +9721,15 @@ "node": ">=10.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "peer": true, + "engines": { + "node": ">=10.18" + } + }, "node_modules/hyphenate-style-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", @@ -10183,6 +10270,39 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "peer": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -10216,6 +10336,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -10273,15 +10405,6 @@ "node": ">=6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -11849,9 +11972,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -12041,18 +12164,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", @@ -12099,35 +12210,27 @@ "peer": true }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "peer": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -12180,12 +12283,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "peer": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -12217,42 +12314,12 @@ "tslib": "^2.0.3" } }, - "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "peer": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "peer": true }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "peer": true - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12427,20 +12494,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -12642,16 +12695,20 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", "peer": true, "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -13485,12 +13542,12 @@ } }, "node_modules/postcss-rtlcss": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-5.1.2.tgz", - "integrity": "sha512-cmcgRoO1wL7IJyVHw0RneWI/5Oe75NLC2NLlQLsNI7hcui+yRcW4RrILfQa4FqKQRLTU4r5eF0YPi1qZpMzQpA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-5.5.0.tgz", + "integrity": "sha512-NkUw3Pq6JNLk/4yE4BszZNpvmLvcX5phTNA0X2thOOPmVVR7sgQXWY+0UjvucsLFL9mQ9IY+YckLyy07yLVijQ==", "peer": true, "dependencies": { - "rtlcss": "4.1.1" + "rtlcss": "4.3.0" }, "engines": { "node": ">=18.0.0" @@ -13549,60 +13606,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "peer": true }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "peer": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "peer": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13734,16 +13737,6 @@ "integrity": "sha512-hJYpaDvPH4w8ZX/0Fdf9ma1AwRgU353GfbaVfPjfJQf1KxZ2iHaHl3fAUw1qlJIR5dr4F3RzjGaWohYUEyoh7A==", "peer": true }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "peer": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -13828,12 +13821,6 @@ ], "peer": true }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "peer": true - }, "node_modules/rambda": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.3.0.tgz", @@ -13882,30 +13869,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "peer": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -14005,16 +13968,6 @@ "node": ">=14" } }, - "node_modules/react-dev-utils/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/react-dev-utils/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -14110,18 +14063,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/react-dev-utils/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -14682,28 +14623,6 @@ "node": ">=6.0.0" } }, - "node_modules/recursive-readdir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", @@ -14774,15 +14693,15 @@ "peer": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "peer": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -15066,9 +14985,9 @@ } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "peer": true, "dependencies": { "escalade": "^3.1.1", @@ -15083,6 +15002,18 @@ "node": ">=12.0.0" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -15142,76 +15073,437 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "peer": true + }, + "node_modules/sass-embedded": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.80.4.tgz", + "integrity": "sha512-lPzKX5g79ZxohlPxh0pXTPFseWj9RfgYI0cPm14CH5ok77Ujuheq/DCp7RStvNDWS8RCQ8Ii6gJC/5WTkGyrhA==", + "peer": true, + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.80.4", + "sass-embedded-android-arm64": "1.80.4", + "sass-embedded-android-ia32": "1.80.4", + "sass-embedded-android-riscv64": "1.80.4", + "sass-embedded-android-x64": "1.80.4", + "sass-embedded-darwin-arm64": "1.80.4", + "sass-embedded-darwin-x64": "1.80.4", + "sass-embedded-linux-arm": "1.80.4", + "sass-embedded-linux-arm64": "1.80.4", + "sass-embedded-linux-ia32": "1.80.4", + "sass-embedded-linux-musl-arm": "1.80.4", + "sass-embedded-linux-musl-arm64": "1.80.4", + "sass-embedded-linux-musl-ia32": "1.80.4", + "sass-embedded-linux-musl-riscv64": "1.80.4", + "sass-embedded-linux-musl-x64": "1.80.4", + "sass-embedded-linux-riscv64": "1.80.4", + "sass-embedded-linux-x64": "1.80.4", + "sass-embedded-win32-arm64": "1.80.4", + "sass-embedded-win32-ia32": "1.80.4", + "sass-embedded-win32-x64": "1.80.4" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.4.tgz", + "integrity": "sha512-iAZ7AiKTLGxQGTkZ37c2/7YC4lkbP1o3eP/K74YaF8O+qhKTLyLOwV7OcmzIywac7dqLcNuGqhFCmFqTYpewZw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.4.tgz", + "integrity": "sha512-htAuBmRvvN2d4smrqxZ6WBw4+OOURaoHzq5oZKqS/E35zYl5FHmrJzp4S5e26a0tEBcjca014tfb/uu9cQgnqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.4.tgz", + "integrity": "sha512-IIee89Jco8/ad2s/oRJTFqpLhBMzg0UXteJyZ5waZPZmkeSR/t9l67Ef1lLQVh9t9/fJ1ViTTiGYm/g/zu6UGw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.4.tgz", + "integrity": "sha512-iJM2kqmWrOeE1aUyTp3uMAG86hyAqbpbOEV7tv828fUsMRDM4uHsHtmyp2n8P2Y0Y2FnLzJpvIm3SwDXGDzT1Q==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.4.tgz", + "integrity": "sha512-vd8VrLvUoHeTcsDoIJesXLbQYZH26a8lAzXy6u4+vEuAwikF4WiXBDFrpqiv38QeD3faLeoPtksRsFbAdQqJAA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.4.tgz", + "integrity": "sha512-SJz7EM1i4NXa7CT/njIWMNYJ6CvbHljDIzUAZEe3V3u1KWl/eNO3pbWAnnDN62tBppwgWx/UdDUbAKowsT6Z8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.4.tgz", + "integrity": "sha512-J/QlBVO66DLtgALgCmM8rZ5zG0dBCIYW1eXIAnnDwC7vGkbAXMtO60M0O/2WNrAfmFfJz1hvKDLjlsxB2XGBLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.4.tgz", + "integrity": "sha512-vuaWhc4ebnaY1AgIWNvFv1snxmkWfvlCU7vnQf4qkn3R2Yyd2J+sjkO8o0NgMX8n5XRUSkAaYUJFCH+Nim6KgQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.4.tgz", + "integrity": "sha512-hI6zQyrR6qJbvyEHfj8UGXNB8VyUa72jel46406AuxUnViA0RyZDSqXUF8vwVw/Hjv1LkA5ihK9dBmWNbLz1zQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.4.tgz", + "integrity": "sha512-wcPExI8UbYrrJvGvo4v2Q+RktbCp44i3qZQ18hglPcVZOC1IzT9NPqZn0XmrqD4hmNbgsYR+picODkvqGw7iDA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.4.tgz", + "integrity": "sha512-HWo0G/9tuhj/uSEwte9KiDK2Xezrfh7nhdEH69ZIfOAqP5byTXL7o08TYagbvMAoljR43Vfna6MelV7NUX4WCw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.4.tgz", + "integrity": "sha512-y8slzQ8Jjkl+53mUDkp3zxcDrTXVVxzpa+6nKh5Ue8l1YU2KdVZG1v2PoDXxE6o99B5I2TVBG8i02IsdYoL8jQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.4.tgz", + "integrity": "sha512-A2WSwnomho491iCeHh3c0YRympfAoJOKr+IyxalTcRH/pjENOWZWZUt00WE2q0tTpEd2V+goWvgS5pmUGewgmg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.4.tgz", + "integrity": "sha512-tYQsAHZLr2mnlJQBJ8Z/n/ySIFJ9JWpsUsoLe9fYgGDaBUfItdzUnj15CChRWld8vFe/I84hb7fbCtYXrI60Jg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.4.tgz", + "integrity": "sha512-NZnr+SYbWlmXx0IaSQ8oF0jYkOULp9qKWMmmZQ1mxuGQ3z7tJqFhpH3M+hYkrFNeOq+GaH+nhHGOD4ZNBxeRkg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.4.tgz", + "integrity": "sha512-h/BmU7QONa7ScvQztFp4Th4aSo3X+Olu3I+RYsaH9s7P683WT3f2w5zr+wwP1V4roM5eyKDCRJBuefT3Fkkkgw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.4.tgz", + "integrity": "sha512-aZbZFs/X9bEmzDiBEiV4IAsKEA0zrCM+s/u2OzvrX4GRvZFJ+/XRTTvf+RTm7mgvTFgfPwCkNGVECQZ1eHh+6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.4.tgz", + "integrity": "sha512-8JiatFi2VVFqCdJzKNDteaPC4KPmh8/giaVh7TyMcDhKjnvRLeu3v5V1egTMiwwpnQHuwzU3uqBlm/llVNR2Pw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.4.tgz", + "integrity": "sha512-SodmTD6mjxEgoq44jWMibmBQvWkCfENK/70zp4qsztcBSOggg3nYUzwG0YpraClAMXpB1xOvzrArWu9/9fguAg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "peer": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true + "node_modules/sass-embedded-win32-x64": { + "version": "1.80.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.4.tgz", + "integrity": "sha512-7+oRRwCCcnOmw152qDiC7x7SphYBo1eLB4KdyThO+7+rYRO8AftXO+kqBPTVSkM8kGp4wxCMF9auPpYBZbjsow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/sass": { - "version": "1.69.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", - "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "peer": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", "peer": true, "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", + "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -15222,6 +15514,9 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, @@ -15534,26 +15829,42 @@ "peer": true }, "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "hasInstallScript": true, "peer": true, "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" + "detect-libc": "^2.0.3", + "semver": "^7.6.3" }, "engines": { - "node": ">=14.15.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" } }, "node_modules/sharp/node_modules/semver": { @@ -15622,51 +15933,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "peer": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -15939,20 +16205,6 @@ "node": ">= 4.0.0" } }, - "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", - "peer": true, - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -16166,19 +16418,19 @@ } }, "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "peer": true, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.27.0" } }, "node_modules/stylehacks": { @@ -16410,31 +16662,6 @@ "node": ">=6" } }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", - "peer": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "peer": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/terser": { "version": "5.34.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.0.tgz", @@ -16573,43 +16800,24 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", - "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", - "peer": true, - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "peer": true }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "peer": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -16743,6 +16951,22 @@ "node": ">=12" } }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "peer": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -16787,39 +17011,6 @@ "node": ">=10" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "peer": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "peer": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", @@ -16835,18 +17026,6 @@ "node": ">=0.6.x" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16967,9 +17146,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "peer": true, "bin": { "tsc": "bin/tsc", @@ -16979,6 +17158,29 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz", + "integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==", + "peer": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", + "@typescript-eslint/utils": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -17311,6 +17513,12 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", "peer": true }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "peer": true + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -17547,77 +17755,100 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "peer": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", + "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", + "peer": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "peer": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", + "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "peer": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.19.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", + "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -17628,6 +17859,18 @@ } } }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -17637,20 +17880,37 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "peer": true, "dependencies": { - "glob": "^7.1.3" + "is-inside-container": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "peer": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-merge": { diff --git a/test-project/package.json b/test-project/package.json index 2d0cb039..02662276 100644 --- a/test-project/package.json +++ b/test-project/package.json @@ -14,7 +14,7 @@ }, "scripts": { "build": "openedx build", - "lint": "openedx lint . --no-eslintrc -c .eslintrc.js", + "lint": "openedx lint .", "dev": "openedx dev", "dev:with-remotes": "SITE_CONFIG_PATH=site.config.dev.with-remotes.tsx openedx dev", "dev:module": "PORT=8081 openedx dev:module", diff --git a/test-project/tsconfig.json b/test-project/tsconfig.json index 4162dfe6..56dc6012 100644 --- a/test-project/tsconfig.json +++ b/test-project/tsconfig.json @@ -5,7 +5,7 @@ "outDir": "dist" }, "include": [ - ".eslintrc.js", + "eslint.config.js", "jest.config.js", "site.config.*.tsx", "src/**/*", diff --git a/tools/eslint.config.js b/tools/eslint.config.js new file mode 100644 index 00000000..713f88c8 --- /dev/null +++ b/tools/eslint.config.js @@ -0,0 +1,15 @@ +// @ts-check + +const tseslint = require('typescript-eslint'); +const eslintConfig = require('./eslint/base.eslint.config.js'); + +module.exports = tseslint.config( + { + extends: eslintConfig, + }, + { + rules: { + '@typescript-eslint/no-require-imports': 'off' + } + }, +); diff --git a/tools/eslint/.eslintrc.js b/tools/eslint/.eslintrc.js deleted file mode 100644 index ef3b6d2d..00000000 --- a/tools/eslint/.eslintrc.js +++ /dev/null @@ -1,91 +0,0 @@ -module.exports = { - env: { - es6: true, - browser: true, - jest: true, - es2020: true, - }, - extends: [ - // The airbnb config includes configuration for import, react, and jsx-a11y. - // That means it's the only thing we need here. We still need to - // have those eslint-config plugins installed, though - it defines them - // as peer dependencies. - 'airbnb', - 'airbnb/hooks', - 'airbnb-typescript', - ], - globals: { - newrelic: false, - PARAGON_THEME: false, - }, - ignorePatterns: [ - 'module.config.js', - ], - parser: '@typescript-eslint/parser', - parserOptions: { - requireConfigFile: true, - }, - plugins: ['@typescript-eslint', 'formatjs'], - // If you add rule overrides here, add code to test.js that proves you formatted it right. - rules: { - 'class-methods-use-this': 'off', - curly: ['error', 'all'], - 'max-len': [ - 'error', - 120, - 2, - { - ignoreUrls: true, - ignoreComments: false, - ignoreRegExpLiterals: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }, - ], - 'arrow-parens': 'off', - 'jsx-a11y/label-has-associated-control': ['error', { - labelComponents: [], - labelAttributes: [], - controlComponents: [], - assert: 'htmlFor', - depth: 25, - }], - 'react/jsx-props-no-spreading': 'off', - 'react/react-in-jsx-scope': 'off', - 'react/jsx-one-expression-per-line': 'off', - 'react/destructuring-assignment': 'off', - 'no-plusplus': 'off', - '@typescript-eslint/comma-dangle': 'off', - strict: 'off', - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: [ - '**/*.config.*', - '**/.eslintrc.*', - '**/*.test.*', - '**/setupTest.js', - ], - }, - ], - 'import/no-unresolved': [ - 'error', - { - ignore: [ - 'site.config', - ], - }, - ], - // https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/340#issuecomment-338424908 - 'jsx-a11y/anchor-is-valid': ['error', { - components: ['Link'], - specialLink: ['to'], - }], - 'formatjs/enforce-description': ['error', 'literal'], - 'import/no-import-module-export': 'off', - 'react/function-component-definition': 'off', - 'react/jsx-filename-extension': [1, { extensions: ['.tsx', '.jsx'] }], - 'react/require-default-props': 'off', - 'no-param-reassign': 'off', - }, -}; diff --git a/tools/tsconfig.json b/tools/tsconfig.json index d321a156..028e4a16 100644 --- a/tools/tsconfig.json +++ b/tools/tsconfig.json @@ -11,12 +11,14 @@ "babel/**/*", "cli/**/*", "config-helpers/**/*", - "eslint/.eslintrc.js", "jest/jest.config.js", "typescript/tsconfig.json", "webpack/**/*", "types.ts", "index.ts", "defaultConfigPaths.ts", + "eslint/base.eslint.config.js", + "eslint.config.js", + "jest.config.js", ], } diff --git a/tsconfig.json b/tsconfig.json index 5ba9bd2f..3e490e9b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,8 @@ "index.ts", "jest.config.js", "babel.config.js", - ".eslintrc.js", + "eslint.config.js", + "frontend-base.d.ts", ], "exclude": [ "test-project/**/*", From d49aa36cfe9fac6658da5ab9843c9866be5eae22 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 15:57:05 -0400 Subject: [PATCH 09/75] fix(style): using single quotes everywhere --- frontend-base.d.ts | 2 +- test-project/site.config.dev.tsx | 4 ++-- test-project/site.config.dev.with-remotes.tsx | 4 ++-- test-project/src/authenticated-page/AuthenticatedPage.tsx | 2 +- test-project/src/authenticated-page/index.ts | 2 +- test-project/src/example-page/index.ts | 2 +- test-project/src/iframe-plugin/index.ts | 2 +- test-project/src/plugin-page/index.ts | 2 +- tools/cli/commands/pack.ts | 4 ++-- tools/cli/commands/release.ts | 8 ++++---- tools/cli/utils/prettyPrintTitle.ts | 4 ++-- tools/cli/utils/printUsage.ts | 2 +- tools/defaultConfigPaths.ts | 2 +- tools/webpack/common-config/all/getIgnoreWarnings.ts | 2 +- tools/webpack/common-config/all/getImageMinimizer.ts | 6 +++--- tools/webpack/common-config/dev/getDevServer.ts | 2 +- .../paragon-webpack-plugin/ParagonWebpackPlugin.ts | 4 ++-- .../plugins/paragon-webpack-plugin/utils/assetUtils.ts | 2 +- .../plugins/paragon-webpack-plugin/utils/htmlUtils.ts | 2 +- 19 files changed, 29 insertions(+), 29 deletions(-) diff --git a/frontend-base.d.ts b/frontend-base.d.ts index 4278d0e1..c068892d 100644 --- a/frontend-base.d.ts +++ b/frontend-base.d.ts @@ -1,4 +1,4 @@ -import { ProjectSiteConfig } from "./index"; +import { ProjectSiteConfig } from './index'; declare module 'site.config' { export default ProjectSiteConfig; diff --git a/test-project/site.config.dev.tsx b/test-project/site.config.dev.tsx index d7c724b3..1e624fe2 100644 --- a/test-project/site.config.dev.tsx +++ b/test-project/site.config.dev.tsx @@ -89,7 +89,7 @@ const config: ProjectSiteConfig = { FAVICON_URL: 'https://edx-cdn.org/v3/default/favicon.ico', pluginSlots: { - 'slot_with_insert_operation': { + slot_with_insert_operation: { keepDefault: true, plugins: [ { @@ -151,7 +151,7 @@ const config: ProjectSiteConfig = { }, { op: PluginOperations.HIDE, - widgetId: "inserted_iframe_plugin", + widgetId: 'inserted_iframe_plugin', }, ], }, diff --git a/test-project/site.config.dev.with-remotes.tsx b/test-project/site.config.dev.with-remotes.tsx index acacd11b..bda97de1 100644 --- a/test-project/site.config.dev.with-remotes.tsx +++ b/test-project/site.config.dev.with-remotes.tsx @@ -90,7 +90,7 @@ const config: ProjectSiteConfig = { APP_ID: 'shell', pluginSlots: { - 'slot_with_insert_operation': { + slot_with_insert_operation: { keepDefault: true, plugins: [ { @@ -152,7 +152,7 @@ const config: ProjectSiteConfig = { }, { op: PluginOperations.HIDE, - widgetId: "inserted_iframe_plugin", + widgetId: 'inserted_iframe_plugin', }, ], }, diff --git a/test-project/src/authenticated-page/AuthenticatedPage.tsx b/test-project/src/authenticated-page/AuthenticatedPage.tsx index cfb45aea..001a2fca 100644 --- a/test-project/src/authenticated-page/AuthenticatedPage.tsx +++ b/test-project/src/authenticated-page/AuthenticatedPage.tsx @@ -9,7 +9,7 @@ export default function AuthenticatedPage() { return (

{config.SITE_NAME} authenticated page.

-

{authenticatedUser === null ? "You are not authenticated." : `Hi there, ${authenticatedUser.username}.`}

+

{authenticatedUser === null ? 'You are not authenticated.' : `Hi there, ${authenticatedUser.username}.`}

Visit public page.

); diff --git a/test-project/src/authenticated-page/index.ts b/test-project/src/authenticated-page/index.ts index 8c4c369d..246d17ed 100644 --- a/test-project/src/authenticated-page/index.ts +++ b/test-project/src/authenticated-page/index.ts @@ -1,4 +1,4 @@ -import { ApplicationModuleConfig } from "@openedx/frontend-base"; +import { ApplicationModuleConfig } from '@openedx/frontend-base'; const config: ApplicationModuleConfig = { route: { diff --git a/test-project/src/example-page/index.ts b/test-project/src/example-page/index.ts index 14488425..b951286d 100644 --- a/test-project/src/example-page/index.ts +++ b/test-project/src/example-page/index.ts @@ -1,4 +1,4 @@ -import { ApplicationModuleConfig } from "@openedx/frontend-base"; +import { ApplicationModuleConfig } from '@openedx/frontend-base'; const config: ApplicationModuleConfig = { route: { diff --git a/test-project/src/iframe-plugin/index.ts b/test-project/src/iframe-plugin/index.ts index 23628e08..938a0e15 100644 --- a/test-project/src/iframe-plugin/index.ts +++ b/test-project/src/iframe-plugin/index.ts @@ -1,4 +1,4 @@ -import { ApplicationModuleConfig } from "@openedx/frontend-base"; +import { ApplicationModuleConfig } from '@openedx/frontend-base'; const config: ApplicationModuleConfig = { route: { diff --git a/test-project/src/plugin-page/index.ts b/test-project/src/plugin-page/index.ts index 75cebcff..65e9e75a 100644 --- a/test-project/src/plugin-page/index.ts +++ b/test-project/src/plugin-page/index.ts @@ -1,4 +1,4 @@ -import { ApplicationModuleConfig } from "@openedx/frontend-base"; +import { ApplicationModuleConfig } from '@openedx/frontend-base'; const config: ApplicationModuleConfig = { route: { diff --git a/tools/cli/commands/pack.ts b/tools/cli/commands/pack.ts index 306ea50b..28aad258 100644 --- a/tools/cli/commands/pack.ts +++ b/tools/cli/commands/pack.ts @@ -1,5 +1,5 @@ -import { execSync } from "child_process"; -import path from "path"; +import { execSync } from 'child_process'; +import path from 'path'; export default function pack() { const destination = process.argv[2]; diff --git a/tools/cli/commands/release.ts b/tools/cli/commands/release.ts index 22424e3c..4208096a 100644 --- a/tools/cli/commands/release.ts +++ b/tools/cli/commands/release.ts @@ -1,7 +1,7 @@ -import chalk from "chalk"; -import { execSync } from "child_process"; -import { existsSync, rmSync } from "fs"; -import path from "path"; +import chalk from 'chalk'; +import { execSync } from 'child_process'; +import { existsSync, rmSync } from 'fs'; +import path from 'path'; export default function release() { diff --git a/tools/cli/utils/prettyPrintTitle.ts b/tools/cli/utils/prettyPrintTitle.ts index 044eaae0..75e5973f 100644 --- a/tools/cli/utils/prettyPrintTitle.ts +++ b/tools/cli/utils/prettyPrintTitle.ts @@ -1,5 +1,5 @@ -import chalk from "chalk"; -import gradient from "gradient-string"; +import chalk from 'chalk'; +import gradient from 'gradient-string'; export default function prettyPrintTitle(title: string) { const openedxGradient = gradient(['#B82669', '#22358C']) diff --git a/tools/cli/utils/printUsage.ts b/tools/cli/utils/printUsage.ts index f61101ec..9b3fd118 100644 --- a/tools/cli/utils/printUsage.ts +++ b/tools/cli/utils/printUsage.ts @@ -1,4 +1,4 @@ -import chalk from "chalk"; +import chalk from 'chalk'; export default function printUsage() { console.log('CLI Usage:\n'); diff --git a/tools/defaultConfigPaths.ts b/tools/defaultConfigPaths.ts index 161498aa..1c1161c5 100644 --- a/tools/defaultConfigPaths.ts +++ b/tools/defaultConfigPaths.ts @@ -1,5 +1,5 @@ import path from 'path'; -import { ConfigTypes } from "./types"; +import { ConfigTypes } from './types'; // These config paths are tested in the order they're defined, so the last ones are the last fallback. export const defaultConfigPaths = { diff --git a/tools/webpack/common-config/all/getIgnoreWarnings.ts b/tools/webpack/common-config/all/getIgnoreWarnings.ts index e6cf50d8..c1a75b9c 100644 --- a/tools/webpack/common-config/all/getIgnoreWarnings.ts +++ b/tools/webpack/common-config/all/getIgnoreWarnings.ts @@ -1,4 +1,4 @@ -import { WebpackError } from "webpack"; +import { WebpackError } from 'webpack'; export default function getIgnoreWarnings() { return [ diff --git a/tools/webpack/common-config/all/getImageMinimizer.ts b/tools/webpack/common-config/all/getImageMinimizer.ts index 272aac08..bf08940f 100644 --- a/tools/webpack/common-config/all/getImageMinimizer.ts +++ b/tools/webpack/common-config/all/getImageMinimizer.ts @@ -1,8 +1,8 @@ -import ImageMinimizerPlugin, { Compiler } from "image-minimizer-webpack-plugin"; -import { WebpackPluginInstance } from "webpack"; +import ImageMinimizerPlugin, { Compiler } from 'image-minimizer-webpack-plugin'; +import { WebpackPluginInstance } from 'webpack'; // This is pulled from the definition of optimization.minimizer in the webpack Configuration type. -type ImageMinimizerReturnType = (false | "" | 0 | "..." | ((this: Compiler, compiler: Compiler) => void) | WebpackPluginInstance | null | undefined)[] | undefined; +type ImageMinimizerReturnType = (false | '' | 0 | '...' | ((this: Compiler, compiler: Compiler) => void) | WebpackPluginInstance | null | undefined)[] | undefined; export default function getImageMinimizer(): ImageMinimizerReturnType { return [ diff --git a/tools/webpack/common-config/dev/getDevServer.ts b/tools/webpack/common-config/dev/getDevServer.ts index 969c7712..d1cb0dd1 100644 --- a/tools/webpack/common-config/dev/getDevServer.ts +++ b/tools/webpack/common-config/dev/getDevServer.ts @@ -1,7 +1,7 @@ import path from 'path'; import { Configuration } from 'webpack-dev-server'; -import getPublicPath from "../../utils/getPublicPath"; +import getPublicPath from '../../utils/getPublicPath'; export default function getDevServer(): Configuration { return { diff --git a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts index 6f1d638b..937ac990 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts @@ -1,6 +1,6 @@ -import { Compilation, Compiler, WebpackPluginInstance, sources } from "webpack"; +import { Compilation, Compiler, WebpackPluginInstance, sources } from 'webpack'; -import { ParagonThemeUrls } from "../../types"; +import { ParagonThemeUrls } from '../../types'; import { getParagonThemeCss, getParagonVersion, diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts index 58e418fa..83a15cf8 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts @@ -1,4 +1,4 @@ -import { Compilation } from "webpack"; +import { Compilation } from 'webpack'; /** * Finds the core CSS asset from the given array of Paragon assets. diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts index 89edb7be..fce59246 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts @@ -1,4 +1,4 @@ -import { Compilation, sources } from "webpack"; +import { Compilation, sources } from 'webpack'; import { getCssAssetsFromCompilation } from './assetUtils'; import { generateScriptContents, insertScriptContentsIntoDocument } from './scriptUtils'; From 8701a37ad4f21008761a2f2f923b00e741d95113 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 15:58:18 -0400 Subject: [PATCH 10/75] fix: adding a few missing files and changes from the ESLint 9 upgrade I had a checkout with a ton of linting changes and just overlooked these files. --- tools/cli/openedx.ts | 5 -- tools/cli/utils/printUsage.ts | 2 +- tools/defaultConfigPaths.ts | 4 +- tools/eslint/base.eslint.config.js | 126 +++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 tools/eslint/base.eslint.config.js diff --git a/tools/cli/openedx.ts b/tools/cli/openedx.ts index 042f2729..eabd0648 100755 --- a/tools/cli/openedx.ts +++ b/tools/cli/openedx.ts @@ -41,11 +41,6 @@ switch (commandName) { break; case CommandTypes.LINT: ensureConfigFilenameOption(ConfigTypes.LINT, ['-c', '--config']); - // If extensions haven't been specified, add them. Otherwise we don't get jsx/tsx files. - if (process.argv.indexOf('--ext') === -1) { - process.argv.push('--ext'); - process.argv.push('.js,.jsx,.ts,.tsx'); - } require('.bin/eslint'); break; case CommandTypes.TEST: diff --git a/tools/cli/utils/printUsage.ts b/tools/cli/utils/printUsage.ts index 9b3fd118..71b65c44 100644 --- a/tools/cli/utils/printUsage.ts +++ b/tools/cli/utils/printUsage.ts @@ -22,7 +22,7 @@ export default function printUsage() { console.log(`${chalk.bold('lint')} \n`); console.group(); - console.log(`Runs ESLint on the source code. Requires an ${chalk.bold('.eslintrc.js')} file.\n`); + console.log(`Runs ESLint on the source code. Requires an ${chalk.bold('eslint.config.js')} file.\n`); console.groupEnd(); console.log(`${chalk.bold('test')} \n`); diff --git a/tools/defaultConfigPaths.ts b/tools/defaultConfigPaths.ts index 1c1161c5..94b7d707 100644 --- a/tools/defaultConfigPaths.ts +++ b/tools/defaultConfigPaths.ts @@ -32,8 +32,8 @@ export const defaultConfigPaths = { path.resolve(__dirname, './webpack/webpack.dev.shell.config.js'), ], [ConfigTypes.LINT]: [ - path.resolve(process.cwd(), '.eslintrc.js'), - path.resolve(__dirname, './eslint/.eslintrc.js'), + path.resolve(process.cwd(), 'eslint.config.js'), + path.resolve(__dirname, './eslint/base.eslint.config.js'), ], [ConfigTypes.TEST]: [ path.resolve(process.cwd(), 'jest.config.js'), diff --git a/tools/eslint/base.eslint.config.js b/tools/eslint/base.eslint.config.js new file mode 100644 index 00000000..e7c63f5c --- /dev/null +++ b/tools/eslint/base.eslint.config.js @@ -0,0 +1,126 @@ +// @ts-check + +const { fixupPluginRules } = require('@eslint/compat'); +const eslint = require('@eslint/js'); +const formatjs = require('eslint-plugin-formatjs'); +// @ts-expect-error There are no type definitions for this. +const jest = require('eslint-plugin-jest'); +// @ts-expect-error There are no type definitions for this. +const jsxA11y = require('eslint-plugin-jsx-a11y'); +const react = require('eslint-plugin-react'); +// @ts-expect-error There are no type definitions for this. +const reactHooks = require('eslint-plugin-react-hooks'); +const globals = require('globals'); +const tseslint = require('typescript-eslint'); +const stylistic = require('@stylistic/eslint-plugin'); + +module.exports = tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.stylisticTypeChecked, + ...tseslint.configs.recommended, + stylistic.configs['recommended-flat'], + { + ignores: [ + 'coverage/*', + 'dist/*', + 'node_modules/*', + '**/__mocks__/*', + '**/__snapshots__/*', + ], + }, + { + languageOptions: { + parserOptions: { + projectService: true, + } + } + }, + { + languageOptions: { + ...(react.configs.flat !== undefined ? react.configs.flat.recommended.languageOptions : {}), + globals: { + ...globals.browser, + ...globals.node, + ...globals.jest, + PARAGON_THEME: 'readonly', + newrelic: 'readonly', + }, + }, + plugins: { + jest, + // Type assertion is workaround for incorrect TypeScript + // types in eslint-plugin-react + // + // TODO: Remove when types are fixed in eslint-plugin-react + // - https://github.com/jsx-eslint/eslint-plugin-react/issues/3838 + react: /** @type {import('eslint').ESLint.Plugin} */ (react), + 'react-hooks': fixupPluginRules(reactHooks), + formatjs, + 'jsx-a11y': jsxA11y, + }, + settings: { + react: { + version: 'detect', + } + } + }, + { + rules: { + // For some reasons the 'flat' key in react.configs is optional, so Typescript complains if + // we don't guard using it. But... it exists in the export, so something's odd with their types. + ...(react.configs.flat !== undefined ? react.configs.flat.recommended.rules : {}), + ...(react.configs.flat !== undefined ? react.configs.flat['jsx-runtime'].rules : {}), + ...reactHooks.configs.recommended.rules, + '@typescript-eslint/no-explicit-any': 'off', + 'react/no-array-index-key': 'error', + 'formatjs/enforce-description': ['error', 'literal'], + 'jsx-a11y/label-has-associated-control': ['error', { + labelComponents: [], + labelAttributes: [], + controlComponents: [], + assert: 'htmlFor', + depth: 25, + }], + // https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/340#issuecomment-338424908 + 'jsx-a11y/anchor-is-valid': ['error', { + components: ['Link'], + specialLink: ['to'], + }], + '@typescript-eslint/no-unused-vars': ['error', { + caughtErrors: 'none', + }], + '@typescript-eslint/no-empty-function': 'off', + '@stylistic/semi': ['error', 'always', { omitLastInOneLineBlock: true, omitLastInOneLineClassBody: true }], + '@stylistic/quotes': ['error', 'single', { + avoidEscape: true, + allowTemplateLiterals: true, + }], + '@stylistic/comma-dangle': 'off', + '@stylistic/quote-props': ['error', 'as-needed'], + '@stylistic/arrow-parens': 'off', + '@stylistic/jsx-one-expression-per-line': 'off', + '@stylistic/multiline-ternary': 'off', + '@stylistic/brace-style': ['error', '1tbs'], + '@stylistic/member-delimiter-style': ['error', { + multiline: { + delimiter: 'comma', + requireLast: true, + }, + singleline: { + delimiter: 'comma', + requireLast: false, + } + }], + }, + }, + { + files: [ + 'babel.config.js', + 'jest.config.js', + 'eslint.config.js' + ], + rules: { + '@typescript-eslint/no-require-imports': 'off' + } + } +); From b65d9c2721e0fe500b3b44bc7f72b51af89dd6b4 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:16:08 -0400 Subject: [PATCH 11/75] fix(style): removing and fixing eslint and typescript comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because of the new config, a ton of eslint ‘ignore’ comments and such are no longer necessary. --- runtime/analytics/SegmentAnalyticsService.js | 2 +- runtime/auth/AxiosJwtTokenService.js | 3 --- runtime/auth/LocalForageCache.js | 1 - .../interceptors/createCsrfTokenProviderInterceptor.js | 1 - .../interceptors/createJwtTokenProviderInterceptor.js | 1 - runtime/i18n/countries.js | 1 - runtime/i18n/languages.js | 1 - runtime/i18n/lib.test.js | 1 - runtime/i18n/lib.ts | 2 -- runtime/initialize.js | 2 -- runtime/logging/NewRelicLoggingService.js | 6 +++--- runtime/plugins/data/shapes.js | 2 -- runtime/react/hooks.js | 1 - runtime/scripts/GoogleAnalyticsLoader.js | 2 +- runtime/scripts/index.js | 1 - runtime/setupTest.js | 1 - shell/data/constants.ts | 1 - shell/data/hooks.ts | 1 - shell/footer/default-footer/DefaultFooter.test.tsx | 3 ++- shell/footer/studio-footer/StudioFooter.test.tsx | 2 -- shell/header/index.ts | 1 - shell/setupTest.js | 1 - .../HtmlWebpackNewRelicPlugin.ts | 2 +- .../paragon-webpack-plugin/ParagonWebpackPlugin.ts | 4 ++-- .../plugins/paragon-webpack-plugin/utils/htmlUtils.ts | 3 +-- .../utils/paragonStylesheetUtils.ts | 4 ++-- .../paragon-webpack-plugin/utils/stylesheetUtils.ts | 8 ++++---- tools/webpack/utils/getLocalAliases.ts | 5 ++--- 28 files changed, 19 insertions(+), 44 deletions(-) diff --git a/runtime/analytics/SegmentAnalyticsService.js b/runtime/analytics/SegmentAnalyticsService.js index 579a24e9..e6bb4fe7 100644 --- a/runtime/analytics/SegmentAnalyticsService.js +++ b/runtime/analytics/SegmentAnalyticsService.js @@ -98,7 +98,7 @@ class SegmentAnalyticsService { // Insert our script next to the first script element. const first = document.getElementsByTagName('script')[0]; first.parentNode.insertBefore(script, first); - analytics._loadOptions = options; // eslint-disable-line no-underscore-dangle + analytics._loadOptions = options; this.segmentInitialized = true; }; diff --git a/runtime/auth/AxiosJwtTokenService.js b/runtime/auth/AxiosJwtTokenService.js index 9b28ed2e..734e8574 100644 --- a/runtime/auth/AxiosJwtTokenService.js +++ b/runtime/auth/AxiosJwtTokenService.js @@ -61,7 +61,6 @@ export default class AxiosJwtTokenService { try { try { axiosResponse = await this.httpClient.post(`${this.tokenRefreshBaseUrl}${this.tokenRefreshPath}`); - // eslint-disable-next-line max-len if (axiosResponse.data && axiosResponse.data.response_epoch_seconds) { responseServerEpochSeconds = axiosResponse.data.response_epoch_seconds; } @@ -125,8 +124,6 @@ export default class AxiosJwtTokenService { } try { - // Eslint is incorrect - refresh() DOES return a promise. - // eslint-disable-next-line @typescript-eslint/return-await return await this.refresh(); } catch (e) { // TODO: Fix these. They're still using loggingService as a singleton. diff --git a/runtime/auth/LocalForageCache.js b/runtime/auth/LocalForageCache.js index 0b9416b2..c4acf11e 100644 --- a/runtime/auth/LocalForageCache.js +++ b/runtime/auth/LocalForageCache.js @@ -71,7 +71,6 @@ export default async function configureCache() { // // https://axios-cache-interceptor.js.org/#/pages/development-mode // https://axios-cache-interceptor.js.org/#/pages/global-configuration?id=debug - // eslint-disable-next-line no-console debug: console.log, }, ); diff --git a/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js b/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js index bdff94d9..68311f70 100644 --- a/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js +++ b/runtime/auth/interceptors/createCsrfTokenProviderInterceptor.js @@ -26,7 +26,6 @@ const createCsrfTokenProviderInterceptor = (options) => { } const CSRF_HEADER_NAME = 'X-CSRFToken'; - // eslint-disable-next-line no-param-reassign axiosRequestConfig.headers[CSRF_HEADER_NAME] = csrfToken; return axiosRequestConfig; }; diff --git a/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js b/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js index ae4279e5..b9f57953 100644 --- a/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js +++ b/runtime/auth/interceptors/createJwtTokenProviderInterceptor.js @@ -27,7 +27,6 @@ const createJwtTokenProviderInterceptor = (options) => { } // Add the proper headers to tell the server to look for the jwt cookie - // eslint-disable-next-line no-param-reassign axiosRequestConfig.headers['USE-JWT-COOKIE'] = true; return axiosRequestConfig; }; diff --git a/runtime/i18n/countries.js b/runtime/i18n/countries.js index 8acad645..271b3134 100644 --- a/runtime/i18n/countries.js +++ b/runtime/i18n/countries.js @@ -1,4 +1,3 @@ -/* eslint-disable import/extensions */ import COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries'; import arLocale from 'i18n-iso-countries/langs/ar.json'; diff --git a/runtime/i18n/languages.js b/runtime/i18n/languages.js index 6ddd3858..3dc46aff 100644 --- a/runtime/i18n/languages.js +++ b/runtime/i18n/languages.js @@ -1,4 +1,3 @@ -/* eslint-disable import/extensions */ import LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages'; // import arLocale from '@cospired/i18n-iso-languages/langs/ar.json'; diff --git a/runtime/i18n/lib.test.js b/runtime/i18n/lib.test.js index fe5ef545..1eb1cef5 100644 --- a/runtime/i18n/lib.test.js +++ b/runtime/i18n/lib.test.js @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import { EnvironmentTypes } from '../../types'; import { configure, diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index fdf8752a..3f8641db 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -281,9 +281,7 @@ interface ConfigureI18nOptions { */ export function configure(options: ConfigureI18nOptions) { PropTypes.checkPropTypes(optionsShape, options, 'property', 'i18n'); - // eslint-disable-next-line prefer-destructuring loggingService = options.loggingService; - // eslint-disable-next-line prefer-destructuring config = options.config; messages = Array.isArray(options.messages) ? merge({}, ...options.messages) : options.messages; diff --git a/runtime/initialize.js b/runtime/initialize.js index 96e6f6b9..3db63870 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -57,7 +57,6 @@ folder. It points at an `site.config.tsx` file in the root of an project's repos */ import siteConfig from 'site.config'; import { getPath } from './utils'; -// eslint-disable-next-line import/no-cycle import { configure as configureAnalytics, identifyAnonymousUser, @@ -198,7 +197,6 @@ async function runtimeConfig() { mergeConfig(data); } } catch (error) { - // eslint-disable-next-line no-console console.error('Error with config API', error.message); } } diff --git a/runtime/logging/NewRelicLoggingService.js b/runtime/logging/NewRelicLoggingService.js index d52c75fe..051dbd45 100644 --- a/runtime/logging/NewRelicLoggingService.js +++ b/runtime/logging/NewRelicLoggingService.js @@ -26,7 +26,7 @@ const pageActionNameIgnoredError = 'IGNORED_ERROR'; function sendPageAction(actionName, message, customAttributes) { if (getConfig().ENVIRONMENT === EnvironmentTypes.DEVELOPMENT) { - console.log(actionName, message, customAttributes); // eslint-disable-line + console.log(actionName, message, customAttributes); } if (window && typeof window.newrelic !== 'undefined') { // https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/addpageaction/ @@ -36,7 +36,7 @@ function sendPageAction(actionName, message, customAttributes) { function sendError(error, customAttributes) { if (getConfig().ENVIRONMENT === EnvironmentTypes.DEVELOPMENT) { - console.error(error, customAttributes); // eslint-disable-line + console.error(error, customAttributes); } if (window && typeof window.newrelic !== 'undefined') { // https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/noticeerror/ @@ -46,7 +46,7 @@ function sendError(error, customAttributes) { function setCustomAttribute(name, value) { if (getConfig().ENVIRONMENT === EnvironmentTypes.DEVELOPMENT) { - console.log(name, value); // eslint-disable-line + console.log(name, value); } if (window && typeof window.newrelic !== 'undefined') { // https://docs.newrelic.com/docs/browser/new-relic-browser/browser-apis/setcustomattribute/ diff --git a/runtime/plugins/data/shapes.js b/runtime/plugins/data/shapes.js index 367a4899..89e10dda 100644 --- a/runtime/plugins/data/shapes.js +++ b/runtime/plugins/data/shapes.js @@ -1,5 +1,3 @@ -/* eslint-disable react/forbid-prop-types */ -/* eslint-disable import/prefer-default-export */ import PropTypes from 'prop-types'; import { PluginTypes } from '../../../types'; diff --git a/runtime/react/hooks.js b/runtime/react/hooks.js index 74aca9e8..231cc06a 100644 --- a/runtime/react/hooks.js +++ b/runtime/react/hooks.js @@ -1,4 +1,3 @@ -/* eslint-disable import/prefer-default-export */ import { useContext, useEffect } from 'react'; import { sendTrackEvent } from '../analytics'; import AppContext from './AppContext'; diff --git a/runtime/scripts/GoogleAnalyticsLoader.js b/runtime/scripts/GoogleAnalyticsLoader.js index 290a7a1f..318c0ef7 100644 --- a/runtime/scripts/GoogleAnalyticsLoader.js +++ b/runtime/scripts/GoogleAnalyticsLoader.js @@ -42,7 +42,7 @@ class GoogleAnalyticsLoader { const first = document.getElementsByTagName('script')[0]; first.parentNode.insertBefore(scriptSrc, first); first.parentNode.insertBefore(scriptGtag, first); - googleAnalytics._loadOptions = options; // eslint-disable-line no-underscore-dangle + googleAnalytics._loadOptions = options; }; // Load GoogleAnalytics with your key. diff --git a/runtime/scripts/index.js b/runtime/scripts/index.js index 3c627f0c..4553fe94 100644 --- a/runtime/scripts/index.js +++ b/runtime/scripts/index.js @@ -1,2 +1 @@ -/* eslint-disable import/prefer-default-export */ export { default as GoogleAnalyticsLoader } from './GoogleAnalyticsLoader'; diff --git a/runtime/setupTest.js b/runtime/setupTest.js index 29428e21..79798f84 100644 --- a/runtime/setupTest.js +++ b/runtime/setupTest.js @@ -1,4 +1,3 @@ -/* eslint-disable import/no-extraneous-dependencies */ import '@testing-library/jest-dom'; import siteConfig from 'site.config'; import { mergeConfig } from './config'; diff --git a/shell/data/constants.ts b/shell/data/constants.ts index 2ed9cca2..cc8f86af 100644 --- a/shell/data/constants.ts +++ b/shell/data/constants.ts @@ -1,2 +1 @@ -// eslint-disable-next-line import/prefer-default-export export const SHELL_ID = 'shell'; diff --git a/shell/data/hooks.ts b/shell/data/hooks.ts index dd8f686e..5c086f35 100644 --- a/shell/data/hooks.ts +++ b/shell/data/hooks.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/prefer-default-export */ import { useEffect, useState } from 'react'; import { useMatches } from 'react-router'; import { AppModuleHandle } from '../../types'; diff --git a/shell/footer/default-footer/DefaultFooter.test.tsx b/shell/footer/default-footer/DefaultFooter.test.tsx index 1bda8f98..99656689 100644 --- a/shell/footer/default-footer/DefaultFooter.test.tsx +++ b/shell/footer/default-footer/DefaultFooter.test.tsx @@ -2,7 +2,8 @@ import { fireEvent, render, screen } from '@testing-library/react'; import { useMemo } from 'react'; import renderer from 'react-test-renderer'; -// @ts-ignore +// @ts-expect-error 'site.config' is set up via webpack alias, so we know it works, but TypeScript +// can't figure out what it means. import siteConfig from 'site.config'; import { AppContext, diff --git a/shell/footer/studio-footer/StudioFooter.test.tsx b/shell/footer/studio-footer/StudioFooter.test.tsx index aca1a64d..10eb6e72 100644 --- a/shell/footer/studio-footer/StudioFooter.test.tsx +++ b/shell/footer/studio-footer/StudioFooter.test.tsx @@ -1,6 +1,4 @@ import { fireEvent, render, screen } from '@testing-library/react'; -// @ts-ignore - import { AppProvider, initializeMockApp, diff --git a/shell/header/index.ts b/shell/header/index.ts index efc3a4d3..5653319d 100644 --- a/shell/header/index.ts +++ b/shell/header/index.ts @@ -1,2 +1 @@ -// eslint-disable-next-line import/prefer-default-export export { default as Header } from './Header'; diff --git a/shell/setupTest.js b/shell/setupTest.js index 6e7cfc02..4a894b73 100644 --- a/shell/setupTest.js +++ b/shell/setupTest.js @@ -1,4 +1,3 @@ -/* eslint-disable import/no-extraneous-dependencies */ import '@testing-library/jest-dom'; import siteConfig from 'site.config'; import { mergeConfig } from '../runtime'; diff --git a/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts index 311e08bf..22598c03 100644 --- a/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts +++ b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts @@ -87,7 +87,7 @@ export default class HtmlWebpackNewRelicPlugin { compiler.hooks.compilation.tap('HtmlWebpackNewRelicPlugin', (compilation) => { HtmlWebpackPlugin.getHooks(compilation).alterAssetTagGroups.tap( 'HtmlWebpackNewRelicPlugin', - // @ts-ignore + // @ts-expect-error TS doesn't like this declaration, but it seems to work fine. (data) => { const newRelicScriptTag = HtmlWebpackPlugin.createHtmlTagObject( 'script', diff --git a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts index 937ac990..6efa4cf6 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts @@ -103,14 +103,14 @@ export default class ParagonWebpackPlugin implements WebpackPluginInstance { // Inject theme variant CSS newSource = injectParagonThemeVariantStylesheets({ - // @ts-ignore newSource is possibly undefined here. + // @ts-expect-error newSource is possibly undefined here. source: newSource.source(), paragonThemeVariantCss, paragonThemeCss, brandThemeCss, }); - // @ts-ignore newSource is possibly undefined here. + // @ts-expect-error newSource is possibly undefined here. compilation.updateAsset('index.html', new sources.RawSource(newSource.source())); } diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts index fce59246..504b3398 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/htmlUtils.ts @@ -60,9 +60,8 @@ export function injectMetadataIntoDocument(compilation: Compilation, { const originalSource = file.source.source() as string; const newSource = insertScriptContentsIntoDocument({ originalSource, - // @ts-ignore This parameter doesn't exist in the function. + // @ts-expect-error This parameter doesn't exist in the function. coreCssAsset: paragonCoreCssAsset, - // @ts-ignore This parameter doesn't exist in the function. themeVariantCssAssets: paragonThemeVariantCssAssets, scriptContents, }); diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts index 755401d7..8c6323a0 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/paragonStylesheetUtils.ts @@ -27,7 +27,7 @@ export function injectParagonCoreStylesheets({ return insertStylesheetsIntoDocument({ source, urls: paragonCoreCss.urls, - // @ts-ignore These two parameters don't exist on insertStylesheetsIntoDocument + // @ts-expect-error These two parameters don't exist on insertStylesheetsIntoDocument paragonThemeCss, brandThemeCss, }); @@ -54,7 +54,7 @@ export function injectParagonThemeVariantStylesheets({ newSource = insertStylesheetsIntoDocument({ source: (typeof newSource === 'object' ? newSource.source() : newSource) as string, urls, - // @ts-ignore These two parameters don't exist on insertStylesheetsIntoDocument + // @ts-expect-error These two parameters don't exist on insertStylesheetsIntoDocument paragonThemeCss, brandThemeCss, }); diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts index 0008cd4f..af3cc398 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts @@ -58,9 +58,9 @@ export function insertStylesheetsIntoDocument({ // insert the brand overrides styles into the HTML document const stylesheetInsertionPoint = findStylesheetInsertionPoint({ - // @ts-ignore Typescript complains this document instance is missing properties. Is parse5.parse not returning a valid Document instance? + // @ts-expect-error Typescript complains this document instance is missing properties. Is parse5.parse not returning a valid Document instance? document, - // @ts-ignore We're passing a ReplaceSource here, when we expect a string in the function. + // @ts-expect-error We're passing a ReplaceSource here, when we expect a string in the function. source: newSource, }); @@ -83,7 +83,7 @@ export function insertStylesheetsIntoDocument({ } if (urls.default) { - // @ts-ignore getDescendantByTag requires two parameters. + // @ts-expect-error getDescendantByTag requires two parameters. const existingDefaultLink = getDescendantByTag(`link[href='${urls.default}']`); if (!existingDefaultLink) { // create link to inject into the HTML document @@ -93,7 +93,7 @@ export function insertStylesheetsIntoDocument({ } if (urls.brandOverride) { - // @ts-ignore getDescendantByTag requires two parameters. + // @ts-expect-error getDescendantByTag requires two parameters. const existingBrandLink = getDescendantByTag(`link[href='${urls.brandOverride}']`); if (!existingBrandLink) { // create link to inject into the HTML document diff --git a/tools/webpack/utils/getLocalAliases.ts b/tools/webpack/utils/getLocalAliases.ts index 39b4d3bf..90749fcb 100644 --- a/tools/webpack/utils/getLocalAliases.ts +++ b/tools/webpack/utils/getLocalAliases.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import fs from 'fs'; import path from 'path'; @@ -35,7 +34,7 @@ export default function getLocalAliases() { console.log('No local module configuration file found. This is fine.\n'); return aliases; } - // eslint-disable-next-line import/no-dynamic-require, global-require + const { localModules } = require(moduleConfigPath); let allPeerDependencies: string[] = []; @@ -45,7 +44,7 @@ export default function getLocalAliases() { } localModules.forEach(({ moduleName, dir, dist = '' }: { moduleName: string, dir: string, dist?: string }) => { console.info(`Using local version of ${moduleName} from ${dir}/${dist}.`); - // eslint-disable-next-line import/no-dynamic-require, global-require + const { peerDependencies = {}, name } = require(path.resolve(process.cwd(), dir, 'package.json')); allPeerDependencies = allPeerDependencies.concat(Object.keys(peerDependencies)); aliases[moduleName] = path.resolve(process.cwd(), dir, dist); From 32eb38e4541e8541ef05f10464c9a711b14e3e52 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:19:26 -0400 Subject: [PATCH 12/75] fix(style): organizing imports --- runtime/auth/AxiosJwtAuthService.js | 8 ++++---- runtime/auth/LocalForageCache.js | 13 ++++++------- runtime/i18n/countries.js | 4 ++-- runtime/initialize.js | 2 +- runtime/utils.test.js | 6 +++--- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/runtime/auth/AxiosJwtAuthService.js b/runtime/auth/AxiosJwtAuthService.js index a6311bf3..4d32e63b 100644 --- a/runtime/auth/AxiosJwtAuthService.js +++ b/runtime/auth/AxiosJwtAuthService.js @@ -1,13 +1,13 @@ import axios from 'axios'; import PropTypes from 'prop-types'; -import { logFrontendAuthError } from './utils'; import { camelCaseObject } from '../utils'; -import createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor'; +import AxiosCsrfTokenService from './AxiosCsrfTokenService'; +import AxiosJwtTokenService from './AxiosJwtTokenService'; import createCsrfTokenProviderInterceptor from './interceptors/createCsrfTokenProviderInterceptor'; +import createJwtTokenProviderInterceptor from './interceptors/createJwtTokenProviderInterceptor'; import createProcessAxiosRequestErrorInterceptor from './interceptors/createProcessAxiosRequestErrorInterceptor'; -import AxiosJwtTokenService from './AxiosJwtTokenService'; -import AxiosCsrfTokenService from './AxiosCsrfTokenService'; import configureCache from './LocalForageCache'; +import { logFrontendAuthError } from './utils'; const optionsPropTypes = { config: PropTypes.shape({ diff --git a/runtime/auth/LocalForageCache.js b/runtime/auth/LocalForageCache.js index c4acf11e..596033da 100644 --- a/runtime/auth/LocalForageCache.js +++ b/runtime/auth/LocalForageCache.js @@ -1,13 +1,12 @@ -/* eslint-disable no-underscore-dangle */ -import localforage from 'localforage'; -import memoryDriver from 'localforage-memoryStorageDriver'; +import axios from 'axios'; import { - setupCache, - defaultKeyGenerator, - defaultHeaderInterpreter, buildStorage, + defaultHeaderInterpreter, + defaultKeyGenerator, + setupCache, } from 'axios-cache-interceptor'; -import axios from 'axios'; +import localforage from 'localforage'; +import memoryDriver from 'localforage-memoryStorageDriver'; /** * Async function to configure localforage and setup the cache diff --git a/runtime/i18n/countries.js b/runtime/i18n/countries.js index 271b3134..21cf8306 100644 --- a/runtime/i18n/countries.js +++ b/runtime/i18n/countries.js @@ -1,11 +1,10 @@ import COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries'; import arLocale from 'i18n-iso-countries/langs/ar.json'; +import caLocale from 'i18n-iso-countries/langs/ca.json'; import enLocale from 'i18n-iso-countries/langs/en.json'; import esLocale from 'i18n-iso-countries/langs/es.json'; import frLocale from 'i18n-iso-countries/langs/fr.json'; -import zhLocale from 'i18n-iso-countries/langs/zh.json'; -import caLocale from 'i18n-iso-countries/langs/ca.json'; import heLocale from 'i18n-iso-countries/langs/he.json'; import idLocale from 'i18n-iso-countries/langs/id.json'; import koLocale from 'i18n-iso-countries/langs/ko.json'; @@ -13,6 +12,7 @@ import plLocale from 'i18n-iso-countries/langs/pl.json'; import ptLocale from 'i18n-iso-countries/langs/pt.json'; import ruLocale from 'i18n-iso-countries/langs/ru.json'; import ukLocale from 'i18n-iso-countries/langs/uk.json'; +import zhLocale from 'i18n-iso-countries/langs/zh.json'; import { getPrimaryLanguageSubtag } from './lib'; diff --git a/runtime/initialize.js b/runtime/initialize.js index 3db63870..86484113 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -56,7 +56,6 @@ This 'site.config' package is a special 'magic' alias in our webpack configurati folder. It points at an `site.config.tsx` file in the root of an project's repository. */ import siteConfig from 'site.config'; -import { getPath } from './utils'; import { configure as configureAnalytics, identifyAnonymousUser, @@ -94,6 +93,7 @@ import { NewRelicLoggingService, } from './logging'; import { GoogleAnalyticsLoader } from './scripts'; +import { getPath } from './utils'; /** * A browser history or memory history object created by the [history](https://github.com/ReactTraining/history) diff --git a/runtime/utils.test.js b/runtime/utils.test.js index 058ca2ad..f7a39808 100644 --- a/runtime/utils.test.js +++ b/runtime/utils.test.js @@ -1,12 +1,12 @@ import { waitFor } from '@testing-library/react'; import { - modifyObjectKeys, camelCaseObject, - snakeCaseObject, convertKeyNames, - parseURL, getPath, getQueryParameters, + modifyObjectKeys, + parseURL, + snakeCaseObject, } from '.'; describe('modifyObjectKeys', () => { From 7ff9bc3fc8458f9291ad1e50a45138eb686f7ef1 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:25:07 -0400 Subject: [PATCH 13/75] fix(style): missing semi-colons, commas, and whitespace fixes --- runtime/analytics/SegmentAnalyticsService.js | 4 ++-- runtime/auth/utils.js | 2 +- runtime/plugins/PluginSlot.tsx | 2 +- runtime/react/AppContext.tsx | 2 +- shell/header/authenticated-menu/AuthenticatedMenu.tsx | 2 +- shell/header/authenticated-menu/AuthenticatedMenuItem.tsx | 2 +- shell/header/nav-links/NavLinkDropdown.tsx | 2 +- shell/header/nav-links/NavLinkDropdownItem.tsx | 2 +- shell/header/nav-links/NavLinks.tsx | 2 +- test-project/site.config.build.tsx | 1 - test-project/site.config.dev.module.tsx | 2 +- test-project/site.config.dev.tsx | 1 - test-project/src/authenticated-page/index.ts | 2 +- test-project/src/example-page/ExamplePage.tsx | 4 ++-- test-project/src/example-page/index.ts | 2 +- test-project/src/iframe-plugin/index.ts | 2 +- test-project/src/plugin-page/index.ts | 2 +- tools/cli/commands/pack.ts | 4 ++-- tools/cli/commands/release.ts | 5 ++--- tools/cli/intl-imports.ts | 2 +- tools/cli/transifex-utils.ts | 2 +- tools/cli/utils/prettyPrintTitle.ts | 2 +- tools/config-helpers/getBaseConfig.ts | 2 +- tools/defaultConfigPaths.ts | 2 +- tools/webpack/common-config/all/getCodeRules.ts | 6 +++--- tools/webpack/common-config/all/getFileLoaderRules.ts | 2 +- tools/webpack/common-config/all/getImageMinimizer.ts | 2 +- tools/webpack/common-config/all/getStylesheetRule.ts | 7 +++---- tools/webpack/common-config/dev/getDevServer.ts | 2 +- .../HtmlWebpackNewRelicPlugin.ts | 2 +- .../paragon-webpack-plugin/utils/stylesheetUtils.ts | 2 +- tools/webpack/types.ts | 8 ++++---- tools/webpack/utils/getResolvedSiteConfigPath.ts | 2 +- tools/webpack/utils/getSharedDependencies.ts | 2 +- tools/webpack/utils/paragonUtils.ts | 2 +- tools/webpack/webpack.build.module.config.ts | 2 +- tools/webpack/webpack.dev.module.config.ts | 2 +- types.ts | 4 ++-- 38 files changed, 48 insertions(+), 52 deletions(-) diff --git a/runtime/analytics/SegmentAnalyticsService.js b/runtime/analytics/SegmentAnalyticsService.js index e6bb4fe7..76c686ac 100644 --- a/runtime/analytics/SegmentAnalyticsService.js +++ b/runtime/analytics/SegmentAnalyticsService.js @@ -70,11 +70,11 @@ class SegmentAnalyticsService { // for methods in Analytics.js so that you never have to wait // for it to load to actually record data. The `method` is // stored as the first argument, so we can replay the data. - analytics.factory = method => ((...args) => { + analytics.factory = method => (...args) => { args.unshift(method); analytics.push(args); return analytics; - }); + }; // For each of our methods, generate a queueing stub. analytics.methods.forEach((key) => { diff --git a/runtime/auth/utils.js b/runtime/auth/utils.js index 92c174e5..b9aca0f2 100644 --- a/runtime/auth/utils.js +++ b/runtime/auth/utils.js @@ -101,5 +101,5 @@ export { getUrlParts, logFrontendAuthError, processAxiosError, - processAxiosErrorAndThrow, + processAxiosErrorAndThrow }; diff --git a/runtime/plugins/PluginSlot.tsx b/runtime/plugins/PluginSlot.tsx index db1e589b..e1e0887a 100644 --- a/runtime/plugins/PluginSlot.tsx +++ b/runtime/plugins/PluginSlot.tsx @@ -23,7 +23,7 @@ interface PluginSlotProps { slotOptions?: { mergeProps?: boolean, }, - ref?: React.ForwardedRef + ref?: React.ForwardedRef, } export default function PluginSlot({ diff --git a/runtime/react/AppContext.tsx b/runtime/react/AppContext.tsx index 58179cd9..cc1c640f 100644 --- a/runtime/react/AppContext.tsx +++ b/runtime/react/AppContext.tsx @@ -20,7 +20,7 @@ import { getConfig } from '../config'; */ const AppContext = React.createContext<{ authenticatedUser: User | null, - config: SiteConfig + config: SiteConfig, }>({ authenticatedUser: null, config: getConfig(), diff --git a/shell/header/authenticated-menu/AuthenticatedMenu.tsx b/shell/header/authenticated-menu/AuthenticatedMenu.tsx index b6f712ed..d143bb68 100644 --- a/shell/header/authenticated-menu/AuthenticatedMenu.tsx +++ b/shell/header/authenticated-menu/AuthenticatedMenu.tsx @@ -10,7 +10,7 @@ import HeaderContext from '../HeaderContext'; import AuthenticatedMenuItem from './AuthenticatedMenuItem'; interface AuthenticatedMenuProps { - className?: string + className?: string, } export default function AuthenticatedMenu({ className }: AuthenticatedMenuProps) { diff --git a/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx b/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx index 03f71537..06ea1ecd 100644 --- a/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx +++ b/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx @@ -14,7 +14,7 @@ import { } from '../data/utils'; interface AuthenticatedMenuItemProps { - item: MenuItem + item: MenuItem, } export default function AuthenticatedMenuItem({ item }: AuthenticatedMenuItemProps) { diff --git a/shell/header/nav-links/NavLinkDropdown.tsx b/shell/header/nav-links/NavLinkDropdown.tsx index 18d1f812..9b9f00db 100644 --- a/shell/header/nav-links/NavLinkDropdown.tsx +++ b/shell/header/nav-links/NavLinkDropdown.tsx @@ -9,7 +9,7 @@ import { import NavLinkDropdownItem from './NavLinkDropdownItem'; interface NavLinkDropdownProps { - item: DropdownMenuItem + item: DropdownMenuItem, } export default function NavLinkDropdown({ item }: NavLinkDropdownProps) { diff --git a/shell/header/nav-links/NavLinkDropdownItem.tsx b/shell/header/nav-links/NavLinkDropdownItem.tsx index 9369629e..02a75baa 100644 --- a/shell/header/nav-links/NavLinkDropdownItem.tsx +++ b/shell/header/nav-links/NavLinkDropdownItem.tsx @@ -9,7 +9,7 @@ import { } from '../data/utils'; interface NavLinkDropdownItemProps { - item: ChildMenuItem + item: ChildMenuItem, } export default function NavLinkDropdownItem({ item }: NavLinkDropdownItemProps) { diff --git a/shell/header/nav-links/NavLinks.tsx b/shell/header/nav-links/NavLinks.tsx index 67c8ca8f..7314800e 100644 --- a/shell/header/nav-links/NavLinks.tsx +++ b/shell/header/nav-links/NavLinks.tsx @@ -6,7 +6,7 @@ import NavLinksItem from './NavLinksItem'; interface NavLinksProps { items: Array, - className?: string + className?: string, } export default function NavLinks({ items, className }: NavLinksProps) { diff --git a/test-project/site.config.build.tsx b/test-project/site.config.build.tsx index 86c9cff4..4c27ce0d 100644 --- a/test-project/site.config.build.tsx +++ b/test-project/site.config.build.tsx @@ -3,7 +3,6 @@ import { authenticatedPageConfig, examplePageConfig, iframePluginConfig, pluginP import { AppConfigTypes, EnvironmentTypes, ProjectSiteConfig } from '@openedx/frontend-base'; import './src/project.scss'; - const config: ProjectSiteConfig = { apps: { examplePage: { diff --git a/test-project/site.config.dev.module.tsx b/test-project/site.config.dev.module.tsx index d7761a91..fe4393d5 100644 --- a/test-project/site.config.dev.module.tsx +++ b/test-project/site.config.dev.module.tsx @@ -2,6 +2,6 @@ import { ProjectModuleConfig } from '@openedx/frontend-base'; const config: ProjectModuleConfig = { plugins: {}, -} +}; export default config; diff --git a/test-project/site.config.dev.tsx b/test-project/site.config.dev.tsx index 1e624fe2..65845a00 100644 --- a/test-project/site.config.dev.tsx +++ b/test-project/site.config.dev.tsx @@ -30,7 +30,6 @@ const modifyWidgetDefaultContentsLink = (widget) => { return widget; }; - const wrapWidget = ({ component }) => (
diff --git a/test-project/src/authenticated-page/index.ts b/test-project/src/authenticated-page/index.ts index 246d17ed..53a4ae2e 100644 --- a/test-project/src/authenticated-page/index.ts +++ b/test-project/src/authenticated-page/index.ts @@ -7,7 +7,7 @@ const config: ApplicationModuleConfig = { const { default: Component } = await import('./AuthenticatedPage'); return { Component, - } + }; }, }, header: { diff --git a/test-project/src/example-page/ExamplePage.tsx b/test-project/src/example-page/ExamplePage.tsx index 1d1f49bb..f8473b7d 100644 --- a/test-project/src/example-page/ExamplePage.tsx +++ b/test-project/src/example-page/ExamplePage.tsx @@ -34,7 +34,7 @@ export default function ExamplePage() { useEffect(() => { logInfo('The example page can log info, which means logging is configured correctly.'); - }, []) + }, []); return ( @@ -91,5 +91,5 @@ export default function ExamplePage() {

I'm aligned right, but left in RTL.

- ) + ); } diff --git a/test-project/src/example-page/index.ts b/test-project/src/example-page/index.ts index b951286d..dce21617 100644 --- a/test-project/src/example-page/index.ts +++ b/test-project/src/example-page/index.ts @@ -7,7 +7,7 @@ const config: ApplicationModuleConfig = { const { default: Component } = await import('./ExamplePage'); return { Component, - } + }; }, } }; diff --git a/test-project/src/iframe-plugin/index.ts b/test-project/src/iframe-plugin/index.ts index 938a0e15..e35d997d 100644 --- a/test-project/src/iframe-plugin/index.ts +++ b/test-project/src/iframe-plugin/index.ts @@ -7,7 +7,7 @@ const config: ApplicationModuleConfig = { const { default: Component } = await import('./IframePlugin'); return { Component, - } + }; }, } }; diff --git a/test-project/src/plugin-page/index.ts b/test-project/src/plugin-page/index.ts index 65e9e75a..7f771621 100644 --- a/test-project/src/plugin-page/index.ts +++ b/test-project/src/plugin-page/index.ts @@ -7,7 +7,7 @@ const config: ApplicationModuleConfig = { const { default: Component } = await import('./PluginPage'); return { Component, - } + }; }, } }; diff --git a/tools/cli/commands/pack.ts b/tools/cli/commands/pack.ts index 28aad258..3cdff587 100644 --- a/tools/cli/commands/pack.ts +++ b/tools/cli/commands/pack.ts @@ -3,7 +3,7 @@ import path from 'path'; export default function pack() { const destination = process.argv[2]; - execSync('npm run release', { stdio: 'inherit'}); + execSync('npm run release', { stdio: 'inherit' }); const { filename } = JSON.parse(execSync('npm pack --json').toString())[0]; - execSync(`npm --prefix ../${destination} install ${path.resolve(process.cwd(), filename)}`, { stdio: 'inherit'}) + execSync(`npm --prefix ../${destination} install ${path.resolve(process.cwd(), filename)}`, { stdio: 'inherit' }); } diff --git a/tools/cli/commands/release.ts b/tools/cli/commands/release.ts index 4208096a..e299f3ab 100644 --- a/tools/cli/commands/release.ts +++ b/tools/cli/commands/release.ts @@ -4,17 +4,16 @@ import { existsSync, rmSync } from 'fs'; import path from 'path'; export default function release() { - const tsconfigPath = path.resolve(process.cwd(), './tsconfig.build.json'); if (!existsSync(tsconfigPath)) { - console.error(chalk.red('openedx release: the library must include a tsconfig.build.json. Aborting.')) + console.error(chalk.red('openedx release: the library must include a tsconfig.build.json. Aborting.')); process.exit(1); } // Clean up our dist folder. rmSync(path.resolve(process.cwd(), 'dist'), { recursive: true, force: true }); - execSync(`tsc --project ${path.resolve(process.cwd(), './tsconfig.build.json')}`, { stdio: 'inherit'}); + execSync(`tsc --project ${path.resolve(process.cwd(), './tsconfig.build.json')}`, { stdio: 'inherit' }); // Copy all non JS/TS files from src into dist. This is so imports of our assets still work. execSync(`rsync -aR src/**/* --exclude='*.tsx' --exclude='*.ts' --exclude='*.js' --exclude='*.jsx' dist/`); diff --git a/tools/cli/intl-imports.ts b/tools/cli/intl-imports.ts index ff54edc5..4b9378d8 100755 --- a/tools/cli/intl-imports.ts +++ b/tools/cli/intl-imports.ts @@ -234,7 +234,7 @@ export function main({ directories: string | string[], log: (message: string) => void, writeFileSync: (filename: string, content: string) => void, - pwd: string + pwd: string, }) { const i18nDir = `${pwd}/src/i18n`; // The Micro-frontend i18n root directory diff --git a/tools/cli/transifex-utils.ts b/tools/cli/transifex-utils.ts index 96ce1f07..b1d40d78 100755 --- a/tools/cli/transifex-utils.ts +++ b/tools/cli/transifex-utils.ts @@ -49,7 +49,7 @@ if (process.argv[3] === '--comments') { // prepare to handle the translator note const hashFile = `${bashScriptsPath}/hashmap.json`; process.stdout.write(`${loggingPrefix}: reading hash file ${hashFile}\n`); - const messageInfo = JSON.parse(fs.readFileSync(hashFile, { encoding: 'utf8'})); + const messageInfo = JSON.parse(fs.readFileSync(hashFile, { encoding: 'utf8' })); const outputFile = `${bashScriptsPath}/hashed_data.txt`; process.stdout.write(`${loggingPrefix}: writing to output file ${outputFile}\n`); diff --git a/tools/cli/utils/prettyPrintTitle.ts b/tools/cli/utils/prettyPrintTitle.ts index 75e5973f..aee2c732 100644 --- a/tools/cli/utils/prettyPrintTitle.ts +++ b/tools/cli/utils/prettyPrintTitle.ts @@ -2,7 +2,7 @@ import chalk from 'chalk'; import gradient from 'gradient-string'; export default function prettyPrintTitle(title: string) { - const openedxGradient = gradient(['#B82669', '#22358C']) + const openedxGradient = gradient(['#B82669', '#22358C']); const borderedTitle = `█ ${title} █`; diff --git a/tools/config-helpers/getBaseConfig.ts b/tools/config-helpers/getBaseConfig.ts index 884ff3a9..727284e7 100644 --- a/tools/config-helpers/getBaseConfig.ts +++ b/tools/config-helpers/getBaseConfig.ts @@ -7,5 +7,5 @@ export default function getBaseConfig(configType: ConfigTypes) { throw new Error(`openedx: ${configType} is not a supported config type.`); } - return require(require.resolve(configPaths[configPaths.length - 1])) + return require(require.resolve(configPaths[configPaths.length - 1])); }; diff --git a/tools/defaultConfigPaths.ts b/tools/defaultConfigPaths.ts index 94b7d707..4022685b 100644 --- a/tools/defaultConfigPaths.ts +++ b/tools/defaultConfigPaths.ts @@ -39,4 +39,4 @@ export const defaultConfigPaths = { path.resolve(process.cwd(), 'jest.config.js'), path.resolve(__dirname, './jest/jest.config.js'), ], -} +}; diff --git a/tools/webpack/common-config/all/getCodeRules.ts b/tools/webpack/common-config/all/getCodeRules.ts index 5d12ef03..0abf8505 100644 --- a/tools/webpack/common-config/all/getCodeRules.ts +++ b/tools/webpack/common-config/all/getCodeRules.ts @@ -24,7 +24,7 @@ export default function getCodeRules(mode: 'dev' | 'production', resolvedSiteCon transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), - ] + ]; if (mode === 'dev') { before.push(ReactRefreshTypeScript()); } @@ -35,7 +35,7 @@ export default function getCodeRules(mode: 'dev' | 'production', resolvedSiteCon }, }, }, - ] + ]; if (mode === 'production') { rules.push({ @@ -44,7 +44,7 @@ export default function getCodeRules(mode: 'dev' | 'production', resolvedSiteCon require.resolve('source-map-loader'), ], enforce: 'pre', - }) + }); } return rules; diff --git a/tools/webpack/common-config/all/getFileLoaderRules.ts b/tools/webpack/common-config/all/getFileLoaderRules.ts index 803351b2..168d9b64 100644 --- a/tools/webpack/common-config/all/getFileLoaderRules.ts +++ b/tools/webpack/common-config/all/getFileLoaderRules.ts @@ -19,5 +19,5 @@ export default function getFileLoaderRules() { test: /\.(jpe?g|png|gif)(\?v=\d+\.\d+\.\d+)?$/, loader: require.resolve('file-loader'), }, - ] + ]; } diff --git a/tools/webpack/common-config/all/getImageMinimizer.ts b/tools/webpack/common-config/all/getImageMinimizer.ts index bf08940f..4c277204 100644 --- a/tools/webpack/common-config/all/getImageMinimizer.ts +++ b/tools/webpack/common-config/all/getImageMinimizer.ts @@ -22,5 +22,5 @@ export default function getImageMinimizer(): ImageMinimizerReturnType { }, }, }), - ] + ]; } diff --git a/tools/webpack/common-config/all/getStylesheetRule.ts b/tools/webpack/common-config/all/getStylesheetRule.ts index 219fa641..8a21aa25 100644 --- a/tools/webpack/common-config/all/getStylesheetRule.ts +++ b/tools/webpack/common-config/all/getStylesheetRule.ts @@ -21,7 +21,7 @@ export default function getStylesheetRule(mode: 'dev' | 'production'): RuleSetRu MiniCssExtractPlugin.loader, ...getStyleUseConfig(mode), ], - } + }; } else { // In the dev case, only our @openedx dependencies go through MiniCssExtractPlugin. // We are not extracting CSS from the javascript bundles in development because extracting @@ -44,9 +44,8 @@ export default function getStylesheetRule(mode: 'dev' | 'production'): RuleSetRu ], }, ] - } + }; } - } function getStyleUseConfig(mode: 'dev' | 'production') { @@ -87,7 +86,7 @@ function getStyleUseConfig(mode: 'dev' | 'production') { }, }, }, - ] + ]; } /** diff --git a/tools/webpack/common-config/dev/getDevServer.ts b/tools/webpack/common-config/dev/getDevServer.ts index d1cb0dd1..f7afe642 100644 --- a/tools/webpack/common-config/dev/getDevServer.ts +++ b/tools/webpack/common-config/dev/getDevServer.ts @@ -34,5 +34,5 @@ export default function getDevServer(): Configuration { // in the webpack development configuration. Note that only changes // to CSS are currently hot reloaded. JS changes will refresh the browser. webSocketServer: 'ws', - } + }; } diff --git a/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts index 22598c03..8018ccfa 100644 --- a/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts +++ b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts @@ -16,7 +16,7 @@ enum OptionTypes { type HtmlWebpackNewRelicPluginOptions = { [key in OptionTypes]: string | undefined; -} +}; export default class HtmlWebpackNewRelicPlugin { options: HtmlWebpackNewRelicPluginOptions; diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts index af3cc398..89147264 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/stylesheetUtils.ts @@ -12,7 +12,7 @@ import { getDescendantByTag } from './tagUtils'; * @throws {Error} If the head element is missing in the HTML document. * @return {number} The insertion point for the stylesheet in the HTML document. */ -export function findStylesheetInsertionPoint({ document, source }: { document: Document, source: string}) { +export function findStylesheetInsertionPoint({ document, source }: { document: Document, source: string }) { const headElement = getDescendantByTag(document, 'head'); if (!headElement) { throw new Error('Missing head element in index.html.'); diff --git a/tools/webpack/types.ts b/tools/webpack/types.ts index 1b102e3c..2ac1ea68 100644 --- a/tools/webpack/types.ts +++ b/tools/webpack/types.ts @@ -45,7 +45,7 @@ export interface ParagonThemeUrlsFile { paths: { default: string, minified: string, - } + }, }, defaults: { [variant: string]: string, @@ -68,7 +68,7 @@ export interface ParagonScriptContents { core: any, variants: any, defaults: any, - } + }, }, brand?: { version: string, @@ -76,6 +76,6 @@ export interface ParagonScriptContents { core: any, variants: any, defaults: any, - } - } + }, + }, } diff --git a/tools/webpack/utils/getResolvedSiteConfigPath.ts b/tools/webpack/utils/getResolvedSiteConfigPath.ts index ce3af5c3..4adf0df3 100644 --- a/tools/webpack/utils/getResolvedSiteConfigPath.ts +++ b/tools/webpack/utils/getResolvedSiteConfigPath.ts @@ -22,7 +22,7 @@ export default function getResolvedSiteConfigPath(defaultFilename: string) { if (siteConfigPath !== undefined) { console.error(`Invalid site config path (${siteConfigPath} specified as an environment variable. Aborting.`); } else { - console.error(`Default site config file (${defaultPath}) does not exist. Aborting.`) + console.error(`Default site config file (${defaultPath}) does not exist. Aborting.`); } process.exit(1); } diff --git a/tools/webpack/utils/getSharedDependencies.ts b/tools/webpack/utils/getSharedDependencies.ts index a2c02e2f..1f16833e 100644 --- a/tools/webpack/utils/getSharedDependencies.ts +++ b/tools/webpack/utils/getSharedDependencies.ts @@ -35,5 +35,5 @@ export default function getSharedDependencies({ isShell }: { isShell: boolean }) requiredVersion: '^4.2.1', eager: isShell }, - } + }; } diff --git a/tools/webpack/utils/paragonUtils.ts b/tools/webpack/utils/paragonUtils.ts index 08c714dc..95340a08 100644 --- a/tools/webpack/utils/paragonUtils.ts +++ b/tools/webpack/utils/paragonUtils.ts @@ -113,7 +113,7 @@ export function getParagonCacheGroups(paragonThemeCss: ParagonThemeCss | undefin name: paragonThemeCss.core.outputChunkName, chunks: (chunk: Chunk) => chunk.name === core.entryName, enforce: true, - } + }; } Object.values(paragonThemeCss.variants).forEach(({ entryName, outputChunkName }) => { diff --git a/tools/webpack/webpack.build.module.config.ts b/tools/webpack/webpack.build.module.config.ts index fe2ea546..ab2c2af9 100644 --- a/tools/webpack/webpack.build.module.config.ts +++ b/tools/webpack/webpack.build.module.config.ts @@ -63,7 +63,7 @@ const config: Configuration = { plugins: [ // Writes the extracted CSS from each entry to a file in the output directory. new MiniCssExtractPlugin({ - filename: '[name].[chunkhash].css', + filename: '[name].[chunkhash].css', }), new BundleAnalyzerPlugin({ analyzerMode: 'static', diff --git a/tools/webpack/webpack.dev.module.config.ts b/tools/webpack/webpack.dev.module.config.ts index e9615dcb..4c6d2e98 100644 --- a/tools/webpack/webpack.dev.module.config.ts +++ b/tools/webpack/webpack.dev.module.config.ts @@ -47,7 +47,7 @@ const config: Configuration = { rules: [ ...getCodeRules('dev', resolvedSiteConfigPath), getStylesheetRule('dev'), - ...getFileLoaderRules(), + ...getFileLoaderRules(), ], }, optimization: { diff --git a/types.ts b/types.ts index 9f689224..e7987dcc 100644 --- a/types.ts +++ b/types.ts @@ -293,12 +293,12 @@ export interface InsertPlugin { export interface WrapPlugin { op: PluginOperations.WRAP, widgetId: string, - wrapper: ElementType + wrapper: ElementType, } export interface HidePlugin { op: PluginOperations.HIDE, - widgetId: string + widgetId: string, } export type Plugin = HidePlugin | InsertPlugin | ModifyPlugin | WrapPlugin; From 61e36beb08503b8126ec3d090751acb23826b99d Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:27:53 -0400 Subject: [PATCH 14/75] fix(style): Use optional chaining operator --- runtime/analytics/SegmentAnalyticsService.js | 2 +- runtime/auth/AxiosJwtAuthService.js | 3 +-- runtime/auth/AxiosJwtTokenService.js | 2 +- runtime/i18n/lib.ts | 2 +- runtime/initialize.js | 2 +- shell/footer/data/hooks.ts | 2 +- tools/webpack/common-config/all/getIgnoreWarnings.ts | 10 ++++------ tools/webpack/utils/getModuleFederationConfig.ts | 2 +- 8 files changed, 11 insertions(+), 14 deletions(-) diff --git a/runtime/analytics/SegmentAnalyticsService.js b/runtime/analytics/SegmentAnalyticsService.js index 76c686ac..6cdb1938 100644 --- a/runtime/analytics/SegmentAnalyticsService.js +++ b/runtime/analytics/SegmentAnalyticsService.js @@ -201,7 +201,7 @@ class SegmentAnalyticsService { // This is added to handle the google analytics blocked case which is injected into // the DOM by segment.min.js. setTimeout(() => { - if (!global.ga || !global.ga.create || !global.google_tag_manager) { + if (!global.ga?.create || !global.google_tag_manager) { this.segmentInitialized = false; resolve(); } diff --git a/runtime/auth/AxiosJwtAuthService.js b/runtime/auth/AxiosJwtAuthService.js index 4d32e63b..3af8f32a 100644 --- a/runtime/auth/AxiosJwtAuthService.js +++ b/runtime/auth/AxiosJwtAuthService.js @@ -258,8 +258,7 @@ class AxiosJwtAuthService { await this.fetchAuthenticatedUser(); if (this.getAuthenticatedUser() === null) { - const isRedirectFromLoginPage = global.document.referrer - && global.document.referrer.startsWith(this.config.LOGIN_URL); + const isRedirectFromLoginPage = global.document.referrer?.startsWith(this.config.LOGIN_URL); if (isRedirectFromLoginPage) { const redirectLoopError = new Error('Redirect from login page. Rejecting to avoid infinite redirect loop.'); diff --git a/runtime/auth/AxiosJwtTokenService.js b/runtime/auth/AxiosJwtTokenService.js index 734e8574..69227275 100644 --- a/runtime/auth/AxiosJwtTokenService.js +++ b/runtime/auth/AxiosJwtTokenService.js @@ -61,7 +61,7 @@ export default class AxiosJwtTokenService { try { try { axiosResponse = await this.httpClient.post(`${this.tokenRefreshBaseUrl}${this.tokenRefreshPath}`); - if (axiosResponse.data && axiosResponse.data.response_epoch_seconds) { + if (axiosResponse.data?.response_epoch_seconds) { responseServerEpochSeconds = axiosResponse.data.response_epoch_seconds; } } catch (error) { diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index 3f8641db..f4c56196 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -293,8 +293,8 @@ export function configure(options: ConfigureI18nOptions) { }); supportedLocales.forEach((key) => { - if (messages === undefined || messages[key] === undefined) { console.warn(`Missing locale: ${key}`); // eslint-disable-line no-console + if (messages?.[key] === undefined) { } }); } diff --git a/runtime/initialize.js b/runtime/initialize.js index 86484113..b25b52fd 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -218,7 +218,7 @@ export function loadExternalScripts(externalScripts, data) { */ export async function analytics() { const authenticatedUser = getAuthenticatedUser(); - if (authenticatedUser && authenticatedUser.userId) { + if (authenticatedUser?.userId) { identifyAuthenticatedUser(authenticatedUser.userId); } else { await identifyAnonymousUser(); diff --git a/shell/footer/data/hooks.ts b/shell/footer/data/hooks.ts index a7b7ca3a..52015d85 100644 --- a/shell/footer/data/hooks.ts +++ b/shell/footer/data/hooks.ts @@ -9,7 +9,7 @@ export default function useActiveFooterId() { useEffect(() => { for (let i = matches.length - 1; i >= 0; i--) { const match = matches[i]; - if (match.handle !== undefined && match.handle.footerId !== undefined) { + if (match.handle?.footerId !== undefined) { setFooterId(match.handle.footerId); break; } diff --git a/tools/webpack/common-config/all/getIgnoreWarnings.ts b/tools/webpack/common-config/all/getIgnoreWarnings.ts index c1a75b9c..27d239f0 100644 --- a/tools/webpack/common-config/all/getIgnoreWarnings.ts +++ b/tools/webpack/common-config/all/getIgnoreWarnings.ts @@ -6,10 +6,8 @@ export default function getIgnoreWarnings() { // some third party packages may ship miss-configured sourcemaps, that interrupts the build // See: https://github.com/facebook/create-react-app/discussions/11278#discussioncomment-1780169 (warning: WebpackError) => !!( - warning.module - // @ts-ignore - && warning.module.resource.includes('node_modules') - && warning.details - && warning.details.includes('source-map-loader')), - ] + // @ts-expect-error 'resource' is something TypeScript can't find for whatever reason. + warning.module?.resource.includes('node_modules') + && warning.details?.includes('source-map-loader')), + ]; } diff --git a/tools/webpack/utils/getModuleFederationConfig.ts b/tools/webpack/utils/getModuleFederationConfig.ts index ef80c432..70493fc3 100644 --- a/tools/webpack/utils/getModuleFederationConfig.ts +++ b/tools/webpack/utils/getModuleFederationConfig.ts @@ -3,7 +3,7 @@ import path from 'path'; export default function getModuleFederationConfig() { const packageJson = require(path.resolve(process.cwd(), 'package.json')); - if (!packageJson.config || !packageJson.config.name || !packageJson.config.exposes) { + if (!packageJson.config?.name || !packageJson.config.exposes) { console.error('Could not find a build configuration in a build.dev.config.js file or in package.json. Is this repository an Open edX app that can be deployed via module federation? Aborting.'); process.exit(1); } From ae62b493da351e6c2a125c7a58bf4d522f5e4272 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:29:06 -0400 Subject: [PATCH 15/75] fix(style): One statement per line --- runtime/auth/interceptors/createRetryInterceptor.js | 4 +++- runtime/utils.test.js | 4 +++- test-project/site.config.dev.tsx | 4 +++- test-project/site.config.dev.with-remotes.tsx | 4 +++- .../webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/runtime/auth/interceptors/createRetryInterceptor.js b/runtime/auth/interceptors/createRetryInterceptor.js index 65360e18..55cfef4c 100644 --- a/runtime/auth/interceptors/createRetryInterceptor.js +++ b/runtime/auth/interceptors/createRetryInterceptor.js @@ -52,7 +52,9 @@ const createRetryInterceptor = (options = {}) => { try { const backoffDelay = getBackoffMilliseconds(nthRetry); // Delay (wrapped in a promise so we can await the setTimeout) - await new Promise(resolve => { setTimeout(resolve, backoffDelay); }); + await new Promise(resolve => { + setTimeout(resolve, backoffDelay); + }); // Make retry request retryResponse = await httpClient.request(config); } catch (e) { diff --git a/runtime/utils.test.js b/runtime/utils.test.js index f7a39808..aa897eb5 100644 --- a/runtime/utils.test.js +++ b/runtime/utils.test.js @@ -167,7 +167,9 @@ describe('ParseURL', () => { it('should return empty object in case of document being undefined', () => { global.document = undefined; - waitFor(() => { expect(parseURL(testURL)).toEqual({}); }); + waitFor(() => { + expect(parseURL(testURL)).toEqual({}); + }); }); }); diff --git a/test-project/site.config.dev.tsx b/test-project/site.config.dev.tsx index 65845a00..62cb2dde 100644 --- a/test-project/site.config.dev.tsx +++ b/test-project/site.config.dev.tsx @@ -20,7 +20,9 @@ const modifyWidgetDefaultContentsUsernamePII = (widget) => { 'data-another-custom-attr': '', className: 'font-weight-bold', style: { color: 'blue' }, - onClick: (e) => { console.log('Username clicked!', 'custom', e); }, + onClick: (e) => { + console.log('Username clicked!', 'custom', e); + }, }; return widget; }; diff --git a/test-project/site.config.dev.with-remotes.tsx b/test-project/site.config.dev.with-remotes.tsx index bda97de1..b36484d8 100644 --- a/test-project/site.config.dev.with-remotes.tsx +++ b/test-project/site.config.dev.with-remotes.tsx @@ -20,7 +20,9 @@ const modifyWidgetDefaultContentsUsernamePII = (widget) => { 'data-another-custom-attr': '', className: 'font-weight-bold', style: { color: 'blue' }, - onClick: (e) => { console.log('Username clicked!', 'custom', e); }, + onClick: (e) => { + console.log('Username clicked!', 'custom', e); + }, }; return widget; }; diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts index 02ad1f22..58bd9586 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/tagUtils.ts @@ -45,7 +45,9 @@ export function minifyScript(script: string) { return script .replace(/>[\r\n ]+<') .replace(/(<.*?>)|\s+/g, (m, $1) => { - if ($1) { return $1; } + if ($1) { + return $1; + } return ' '; }) .trim(); From 0798771891b575b70406150a2ed8804085022eaa Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:29:53 -0400 Subject: [PATCH 16/75] fix(style): use includes instead of indexOf Also getting rid of some unneeded eslint disable line comments --- runtime/i18n/lib.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index f4c56196..db815d6b 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -287,14 +287,14 @@ export function configure(options: ConfigureI18nOptions) { if (config.ENVIRONMENT === EnvironmentTypes.DEVELOPMENT && messages !== undefined) { Object.keys(messages).forEach((key) => { - if (supportedLocales.indexOf(key) < 0) { - console.warn(`Unexpected locale: ${key}`); // eslint-disable-line no-console + if (!supportedLocales.includes(key)) { + console.warn(`Unexpected locale: ${key}`); } }); supportedLocales.forEach((key) => { - console.warn(`Missing locale: ${key}`); // eslint-disable-line no-console if (messages?.[key] === undefined) { + console.warn(`Missing locale: ${key}`); } }); } From a469c4530a6352912178c9ee51378a0832ea0b46 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:30:50 -0400 Subject: [PATCH 17/75] =?UTF-8?q?fix(style):=20Using=20=E2=80=98for=20of?= =?UTF-8?q?=E2=80=99=20loops=20where=20appropriate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shell/data/hooks.ts | 3 +-- shell/router/patchRoutesOnNavigation.ts | 3 +-- tools/cli/utils/ensureConfigFilenameOption.ts | 3 +-- tools/cli/utils/getResolvedConfigPath.ts | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/shell/data/hooks.ts b/shell/data/hooks.ts index 5c086f35..772299c4 100644 --- a/shell/data/hooks.ts +++ b/shell/data/hooks.ts @@ -3,8 +3,7 @@ import { useMatches } from 'react-router'; import { AppModuleHandle } from '../../types'; function findAppIdInMatches(matches) { - for (let i = 0; i < matches.length; i++) { - const match = matches[i]; + for (const match of matches) { if (match.handle && typeof match.handle === 'object' && 'appId' in match.handle) { const appHandle = match.handle as AppModuleHandle; return appHandle.appId; diff --git a/shell/router/patchRoutesOnNavigation.ts b/shell/router/patchRoutesOnNavigation.ts index cb39b695..a2504285 100644 --- a/shell/router/patchRoutesOnNavigation.ts +++ b/shell/router/patchRoutesOnNavigation.ts @@ -15,8 +15,7 @@ export default async function patchRoutesOnNavigation({ path, patch }: PatchRout let missingModule: FederatedAppConfig | null = null; let missingAppId: string | null = null; const entries = Object.entries(federatedModules); - for (let i = 0; i < entries.length; i++) { - const [appId, federatedModule] = entries[i]; + for (const [appId, federatedModule] of entries) { if (path.startsWith(federatedModule.path)) { missingModule = federatedModule; missingAppId = appId; diff --git a/tools/cli/utils/ensureConfigFilenameOption.ts b/tools/cli/utils/ensureConfigFilenameOption.ts index 3cf66102..e1b575d8 100644 --- a/tools/cli/utils/ensureConfigFilenameOption.ts +++ b/tools/cli/utils/ensureConfigFilenameOption.ts @@ -5,8 +5,7 @@ import getResolvedConfigPath from './getResolvedConfigPath'; export function ensureConfigFilenameOption(configType: ConfigTypes, keys: string[]) { let configFileName = null; let fileNameIndex = null; - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; + for (const key of keys) { const index = process.argv.indexOf(key); if (index !== -1) { fileNameIndex = index + 1; diff --git a/tools/cli/utils/getResolvedConfigPath.ts b/tools/cli/utils/getResolvedConfigPath.ts index 0a86114a..2aea92bf 100644 --- a/tools/cli/utils/getResolvedConfigPath.ts +++ b/tools/cli/utils/getResolvedConfigPath.ts @@ -13,8 +13,7 @@ export default function getResolvedConfigPath(customConfigPath: string | null, c return null; } } else { - for (let i = 0; i < configPaths.length; i++) { - const configPath = configPaths[i]; + for (const configPath of configPaths) { if (fs.existsSync(configPath)) { return configPath; } From 36ae36ddc2a36c81a492006f27a87b39cabda4ce Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:32:45 -0400 Subject: [PATCH 18/75] fix(style): Using nullish coalescing operator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also using ‘exec’ on a Regex instead of match. --- shell/footer/default-footer/DefaultFooter.tsx | 2 +- tools/cli/intl-imports.ts | 2 +- tools/webpack/common-config/dev/getDevServer.ts | 2 +- tools/webpack/common-config/site/getHtmlWebpackPlugin.ts | 8 ++++---- .../paragon-webpack-plugin/ParagonWebpackPlugin.ts | 2 +- tools/webpack/utils/getPublicPath.ts | 2 +- tools/webpack/utils/paragonUtils.ts | 2 +- tools/webpack/webpack.dev.shell.config.ts | 8 ++++---- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/shell/footer/default-footer/DefaultFooter.tsx b/shell/footer/default-footer/DefaultFooter.tsx index e612afeb..d6950129 100644 --- a/shell/footer/default-footer/DefaultFooter.tsx +++ b/shell/footer/default-footer/DefaultFooter.tsx @@ -30,7 +30,7 @@ export default function DefaultFooter({ logo, onLanguageSelected, supportedLangu > {intl.formatMessage(messages['footer.logo.altText'])} diff --git a/tools/cli/intl-imports.ts b/tools/cli/intl-imports.ts index 4b9378d8..65186d17 100755 --- a/tools/cli/intl-imports.ts +++ b/tools/cli/intl-imports.ts @@ -269,6 +269,6 @@ if (require.main === module) { directories: process.argv.slice(2), log: text => process.stdout.write(text), writeFileSync: fs.writeFileSync, - pwd: process.env.PWD || '.', + pwd: process.env.PWD ?? '.', }); } diff --git a/tools/webpack/common-config/dev/getDevServer.ts b/tools/webpack/common-config/dev/getDevServer.ts index f7afe642..7558c017 100644 --- a/tools/webpack/common-config/dev/getDevServer.ts +++ b/tools/webpack/common-config/dev/getDevServer.ts @@ -20,7 +20,7 @@ export default function getDevServer(): Configuration { }, host: 'apps.local.openedx.io', hot: true, - port: process.env.PORT || 8080, + port: process.env.PORT ?? 8080, proxy: [ { context: ['/api/mfe_config/v1'], diff --git a/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts b/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts index dc397483..de0b007d 100644 --- a/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts +++ b/tools/webpack/common-config/site/getHtmlWebpackPlugin.ts @@ -7,9 +7,9 @@ export default function getHtmlWebpackPlugin() { inject: true, // Appends script tags linking to the webpack bundles at the end of the body template: path.resolve(process.cwd(), 'public/index.html'), chunks: ['app'], - FAVICON_URL: process.env.FAVICON_URL || null, - OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, - NODE_ENV: process.env.NODE_ENV || null, - SITE_NAME: process.env.SITE_NAME || '', + FAVICON_URL: process.env.FAVICON_URL ?? null, + OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID ?? null, + NODE_ENV: process.env.NODE_ENV ?? null, + SITE_NAME: process.env.SITE_NAME ?? '', }); } diff --git a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts index 6efa4cf6..7c349127 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts @@ -49,7 +49,7 @@ export default class ParagonWebpackPlugin implements WebpackPluginInstance { */ async resolveParagonThemeUrlsFromConfig() { try { - this.paragonThemeUrlsConfig = JSON.parse(process.env.PARAGON_THEME_URLS || '{}'); + this.paragonThemeUrlsConfig = JSON.parse(process.env.PARAGON_THEME_URLS ?? '{}'); } catch (error) { console.info('Paragon Plugin cannot load PARAGON_THEME_URLS env variable, skipping.'); } diff --git a/tools/webpack/utils/getPublicPath.ts b/tools/webpack/utils/getPublicPath.ts index 05862e9b..606fcd47 100644 --- a/tools/webpack/utils/getPublicPath.ts +++ b/tools/webpack/utils/getPublicPath.ts @@ -1,3 +1,3 @@ export default function getPublicPath(defaultPath: string = '/') { - return process.env.PUBLIC_PATH || defaultPath; + return process.env.PUBLIC_PATH ?? defaultPath; } diff --git a/tools/webpack/utils/paragonUtils.ts b/tools/webpack/utils/paragonUtils.ts index 95340a08..33e2327c 100644 --- a/tools/webpack/utils/paragonUtils.ts +++ b/tools/webpack/utils/paragonUtils.ts @@ -11,7 +11,7 @@ import { ParagonThemeCss, ParagonThemeUrlsFile } from '../types'; */ function getBrandPackageName(dir: string) { const appDependencies = JSON.parse(fs.readFileSync(path.resolve(dir, 'package.json'), 'utf-8')).dependencies; - return Object.keys(appDependencies).find((key) => key.match(/@(open)?edx\/brand/)) || ''; + return Object.keys(appDependencies).find((key) => /@(open)?edx\/brand/.exec(key)) ?? ''; } /** diff --git a/tools/webpack/webpack.dev.shell.config.ts b/tools/webpack/webpack.dev.shell.config.ts index 1fa68521..0d627aad 100644 --- a/tools/webpack/webpack.dev.shell.config.ts +++ b/tools/webpack/webpack.dev.shell.config.ts @@ -114,10 +114,10 @@ const config: Configuration = { inject: true, // Appends script tags linking to the webpack bundles at the end of the body template: path.resolve(process.cwd(), 'shell/public/index.html'), chunks: ['app'], - FAVICON_URL: process.env.FAVICON_URL || null, - OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID || null, - NODE_ENV: process.env.NODE_ENV || null, - SITE_NAME: process.env.SITE_NAME || '', + FAVICON_URL: process.env.FAVICON_URL ?? null, + OPTIMIZELY_PROJECT_ID: process.env.OPTIMIZELY_PROJECT_ID ?? null, + NODE_ENV: process.env.NODE_ENV ?? null, + SITE_NAME: process.env.SITE_NAME ?? '', }), new ReactRefreshWebpackPlugin(), new ForkTsCheckerWebpackPlugin(), From 29bda73653744212dc2a5acd6b5a9ef3f83391d1 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:33:19 -0400 Subject: [PATCH 19/75] =?UTF-8?q?fix(style):=20using=20=E2=80=98const?= =?UTF-8?q?=E2=80=99=20instead=20of=20=E2=80=98let=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/webpack/utils/getResolvedSiteConfigPath.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/webpack/utils/getResolvedSiteConfigPath.ts b/tools/webpack/utils/getResolvedSiteConfigPath.ts index 4adf0df3..b1dc1981 100644 --- a/tools/webpack/utils/getResolvedSiteConfigPath.ts +++ b/tools/webpack/utils/getResolvedSiteConfigPath.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; export default function getResolvedSiteConfigPath(defaultFilename: string) { - let siteConfigPath = process.env.SITE_CONFIG_PATH; + const siteConfigPath = process.env.SITE_CONFIG_PATH; if (siteConfigPath !== undefined) { // We assume siteConfigPath is a relative path. From 2cdece113ea29e1c38af00088d56b458490fa16a Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:34:11 -0400 Subject: [PATCH 20/75] fix(style): whitespace --- tools/cli/transifex-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cli/transifex-utils.ts b/tools/cli/transifex-utils.ts index b1d40d78..70de24e6 100755 --- a/tools/cli/transifex-utils.ts +++ b/tools/cli/transifex-utils.ts @@ -19,7 +19,7 @@ function gatherJson(dir: string) { const files = glob.sync(`${dir}/**/*.json`); files.forEach((filename) => { - const messages = JSON.parse(fs.readFileSync(filename, { encoding: 'utf8'})); + const messages = JSON.parse(fs.readFileSync(filename, { encoding: 'utf8' })); ret.push(...messages); }); return ret; From a5bcc3447bbaa3cb4ccfc50265f0370ff634c9e7 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:35:08 -0400 Subject: [PATCH 21/75] =?UTF-8?q?fix:=20adding=20=E2=80=98key=E2=80=99=20p?= =?UTF-8?q?rops=20to=20react=20elements=20in=20lists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shell/header/defaults.tsx | 4 ++-- shell/site.config.dev.shell.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/header/defaults.tsx b/shell/header/defaults.tsx index 70d7d1e4..0a419801 100644 --- a/shell/header/defaults.tsx +++ b/shell/header/defaults.tsx @@ -13,8 +13,8 @@ export const primaryLinks: Array = [ export const secondaryLinks: Array = []; export const anonymousLinks: Array = [ - , - + , + ]; export const authenticatedLinks: Array = [ diff --git a/shell/site.config.dev.shell.tsx b/shell/site.config.dev.shell.tsx index 00f982df..fce32f2f 100644 --- a/shell/site.config.dev.shell.tsx +++ b/shell/site.config.dev.shell.tsx @@ -79,7 +79,7 @@ const config: ProjectSiteConfig = { label: 'Item #1', url: '#', }, - , + , { label: 'Item #2', url: '#', From 5571c79f6c6ade02ff1a722635fade5acdf0e947 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:37:10 -0400 Subject: [PATCH 22/75] =?UTF-8?q?fix(style):=20Using=20=E2=80=9CRecord?= =?UTF-8?q?=E2=80=9D=20typescript=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- runtime/i18n/lib.ts | 4 +-- runtime/plugins/PluginSlot.tsx | 4 +-- shell/data/moduleUtils.ts | 2 +- tools/cli/transifex-utils.ts | 2 +- tools/cli/utils/formatter.ts | 2 +- tools/webpack/types.ts | 38 +++++++++----------------- tools/webpack/utils/getLocalAliases.ts | 2 +- tools/webpack/utils/paragonUtils.ts | 4 +-- types.ts | 26 ++++++------------ 9 files changed, 30 insertions(+), 54 deletions(-) diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index db815d6b..e796f2fb 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -68,7 +68,7 @@ const rtlLocales = [ let config: SiteConfig | null = null; let loggingService: LoggingService | null = null; -let messages: { [locale: string]: Record | Record | undefined }; +let messages: Record | Record | undefined>; /** * @memberof module:Internationalization @@ -263,7 +263,7 @@ export function mergeMessages(newMessages) { interface ConfigureI18nOptions { loggingService: LoggingService, - messages: Array<{ [locale: string]: { [key: string]: string } }> | { [locale: string]: { [key: string]: string } }, + messages: Record>[] | Record>, config: SiteConfig, } diff --git a/runtime/plugins/PluginSlot.tsx b/runtime/plugins/PluginSlot.tsx index e1e0887a..0b30fbe9 100644 --- a/runtime/plugins/PluginSlot.tsx +++ b/runtime/plugins/PluginSlot.tsx @@ -17,9 +17,7 @@ interface PluginSlotProps { /** ID of the PluginSlot configuration */ id: string, /** Props that are passed down to each Plugin in the Slot */ - pluginProps?: { - [prop: string]: any, - }, + pluginProps?: Record, slotOptions?: { mergeProps?: boolean, }, diff --git a/shell/data/moduleUtils.ts b/shell/data/moduleUtils.ts index 6087d9e1..8a06f0b1 100644 --- a/shell/data/moduleUtils.ts +++ b/shell/data/moduleUtils.ts @@ -8,7 +8,7 @@ import { } from '../../types'; function filterAppsByType(apps: AppsConfig, type: AppConfigTypes) { - const filteredApps: { [appId: string]: T } = {}; + const filteredApps: Record = {}; Object.entries(apps).forEach( ([appId, app]: [appId: string, app: AppConfig]) => { if (app.type === type) { diff --git a/tools/cli/transifex-utils.ts b/tools/cli/transifex-utils.ts index 70de24e6..68fce26a 100755 --- a/tools/cli/transifex-utils.ts +++ b/tools/cli/transifex-utils.ts @@ -66,7 +66,7 @@ if (process.argv[3] === '--comments') { // prepare to handle the translator note } }); } else { - const output: {[id: string]: string } = {}; + const output: Record = {}; messageObjects.forEach((message) => { output[message.id] = message.defaultMessage; diff --git a/tools/cli/utils/formatter.ts b/tools/cli/utils/formatter.ts index 0865d45a..2b447421 100644 --- a/tools/cli/utils/formatter.ts +++ b/tools/cli/utils/formatter.ts @@ -1,4 +1,4 @@ -exports.format = (messages: { [messageId: string]: { defaultMessage: string, description: string}}) => { +exports.format = (messages: Record) => { const results = Object.entries(messages).map(([id, message]) => ( { id, diff --git a/tools/webpack/types.ts b/tools/webpack/types.ts index 2ac1ea68..96bc6b19 100644 --- a/tools/webpack/types.ts +++ b/tools/webpack/types.ts @@ -15,28 +15,20 @@ export interface ParagonThemeVariantCssAsset { export interface ParagonThemeCss { core: ParagonThemeCssAsset | undefined, - variants: { [key: string] : ParagonThemeVariantCssAsset } - defaults: { - - } + variants: Record, + defaults: object, } // This isn't perfect, as it implies having neither url nor urls would be valid. Feel free to improve it so that one is required. export type ParagonThemeUrlsVariant = { url?: string, - urls?: { - [urlName: string]: string | undefined, - } + urls?: Record, } export interface ParagonThemeUrls { core: ParagonThemeUrlsVariant, - defaults: { - [variantName: string]: string, - }, - variants: { - [variantName: string]: ParagonThemeUrlsVariant - } + defaults: Record, + variants: Record, } export interface ParagonThemeUrlsFile { @@ -47,18 +39,14 @@ export interface ParagonThemeUrlsFile { minified: string, }, }, - defaults: { - [variant: string]: string, - }, - variants: { - [variant: string]: { - paths: { - default: string, - minified: string, - } - } - } - } + defaults: Record, + variants: Record, + }, } export interface ParagonScriptContents { diff --git a/tools/webpack/utils/getLocalAliases.ts b/tools/webpack/utils/getLocalAliases.ts index 90749fcb..57b3c9c3 100644 --- a/tools/webpack/utils/getLocalAliases.ts +++ b/tools/webpack/utils/getLocalAliases.ts @@ -26,7 +26,7 @@ Some working examples, as of the time of this writing: */ export default function getLocalAliases() { - const aliases: { [moduleName: string]: string} = {}; + const aliases: Record = {}; try { const moduleConfigPath = path.resolve(process.cwd(), 'module.config.js'); diff --git a/tools/webpack/utils/paragonUtils.ts b/tools/webpack/utils/paragonUtils.ts index 33e2327c..6c103fbe 100644 --- a/tools/webpack/utils/paragonUtils.ts +++ b/tools/webpack/utils/paragonUtils.ts @@ -104,7 +104,7 @@ export function getParagonCacheGroups(paragonThemeCss: ParagonThemeCss | undefin if (!paragonThemeCss) { return {}; } - const cacheGroups: { [index: string]: { type: string, name: string, chunks: (chunk: Chunk) => boolean, enforce: boolean } } = {}; + const cacheGroups: Record boolean, enforce: boolean }> = {}; if (paragonThemeCss.core !== undefined) { const { core } = paragonThemeCss; @@ -141,7 +141,7 @@ export function getParagonEntryPoints(paragonThemeCss: ParagonThemeCss | undefin return {}; } - const entryPoints: { [entryName: string]: string } = {}; + const entryPoints: Record = {}; if (paragonThemeCss.core !== undefined) { entryPoints[paragonThemeCss.core.entryName] = path.resolve(process.cwd(), paragonThemeCss.core.filePath); } diff --git a/types.ts b/types.ts index e7987dcc..aadce0ec 100644 --- a/types.ts +++ b/types.ts @@ -62,12 +62,10 @@ export type ProjectSiteConfig = RequiredSiteConfig & Partial export interface OptionalSiteConfig { - pluginSlots: { - [slotName: string]: { - keepDefault: boolean, - plugins: Array, - }, - }, + pluginSlots: Record, header?: HeaderConfig, @@ -105,14 +103,10 @@ export interface OptionalSiteConfig { PRIVACY_POLICY_URL: string | null, ACCESSIBILITY_URL: string | null, - custom: { - [key: string]: any, - } + custom: Record, } -export interface AppsConfig { - [appId: string]: AppConfig, -} +export type AppsConfig = Record; export interface RequiredSiteConfig { apps: AppsConfig, @@ -147,9 +141,7 @@ export interface ProjectModuleConfig { modules?: Array, name?: string, plugins?: any, - custom?: { - [key: string]: any, - } + custom?: Record, } export interface User { @@ -262,9 +254,7 @@ export interface InsertDirectPluginWidget { type: PluginTypes.DIRECT, priority: number, RenderWidget: ElementType, - content?: { - [propName: string]: any, - } + content?: Record, } export interface InsertIframePluginWidget { From 96f695cbf22286bdd9a3f807207cfb69658371b6 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:55:07 -0400 Subject: [PATCH 23/75] fix(style): Using [] instead of Array to identify array types --- runtime/plugins/PluginSlot.tsx | 2 +- shell/footer/default-footer/DefaultFooter.tsx | 2 +- .../default-footer/LanguageSelector.tsx | 6 ++--- shell/header/defaults.tsx | 8 +++---- shell/header/nav-links/NavLinks.tsx | 2 +- shell/router/createInternalRoutes.ts | 2 +- tools/cli/intl-imports.test.ts | 2 +- tools/cli/intl-imports.ts | 4 ++-- tools/cli/transifex-utils.ts | 2 +- .../HtmlWebpackNewRelicPlugin.ts | 2 +- .../utils/assetUtils.ts | 2 +- types.ts | 22 +++++++++---------- 12 files changed, 28 insertions(+), 28 deletions(-) diff --git a/runtime/plugins/PluginSlot.tsx b/runtime/plugins/PluginSlot.tsx index 0b30fbe9..477087b7 100644 --- a/runtime/plugins/PluginSlot.tsx +++ b/runtime/plugins/PluginSlot.tsx @@ -65,7 +65,7 @@ export default function PluginSlot({ ? loadingFallback : defaultLoadingFallback; - const finalChildren: Array = []; + const finalChildren: ReactNode[] = []; if (finalPlugins.length > 0) { finalPlugins.forEach((pluginConfig) => { // If hidden, don't push to finalChildren diff --git a/shell/footer/default-footer/DefaultFooter.tsx b/shell/footer/default-footer/DefaultFooter.tsx index d6950129..b771486f 100644 --- a/shell/footer/default-footer/DefaultFooter.tsx +++ b/shell/footer/default-footer/DefaultFooter.tsx @@ -9,7 +9,7 @@ import LanguageSelector from './LanguageSelector'; interface DefaultFooterProps { logo?: string, onLanguageSelected?: (languageCode: string) => void, - supportedLanguages?: Array<{ label: string, value: string }> + supportedLanguages?: { label: string, value: string }[], } export default function DefaultFooter({ logo, onLanguageSelected, supportedLanguages = [] }: DefaultFooterProps) { diff --git a/shell/footer/default-footer/LanguageSelector.tsx b/shell/footer/default-footer/LanguageSelector.tsx index 4af64fa7..6fa732b5 100644 --- a/shell/footer/default-footer/LanguageSelector.tsx +++ b/shell/footer/default-footer/LanguageSelector.tsx @@ -5,10 +5,10 @@ import { interface LanguageSelectorProps { onSubmit: (languageCode: string) => void, - options: Array<{ + options: { label: string, - value: string - }>, + value: string, + }[], } export default function LanguageSelector({ diff --git a/shell/header/defaults.tsx b/shell/header/defaults.tsx index 0a419801..cae592bc 100644 --- a/shell/header/defaults.tsx +++ b/shell/header/defaults.tsx @@ -3,21 +3,21 @@ import messages from '../Shell.messages'; import LoginButton from './anonymous-menu/LoginButton'; import RegisterButton from './anonymous-menu/RegisterButton'; -export const primaryLinks: Array = [ +export const primaryLinks: MenuItem[] = [ { appId: 'learner-dashboard', label: 'Courses', }, ]; -export const secondaryLinks: Array = []; +export const secondaryLinks: MenuItem[] = []; -export const anonymousLinks: Array = [ +export const anonymousLinks: MenuItem[] = [ , ]; -export const authenticatedLinks: Array = [ +export const authenticatedLinks: ChildMenuItem[] = [ { appId: 'learner-dashboard', label: messages['header.user.menu.dashboard'] diff --git a/shell/header/nav-links/NavLinks.tsx b/shell/header/nav-links/NavLinks.tsx index 7314800e..20b878a5 100644 --- a/shell/header/nav-links/NavLinks.tsx +++ b/shell/header/nav-links/NavLinks.tsx @@ -5,7 +5,7 @@ import { import NavLinksItem from './NavLinksItem'; interface NavLinksProps { - items: Array, + items: MenuItem[], className?: string, } diff --git a/shell/router/createInternalRoutes.ts b/shell/router/createInternalRoutes.ts index 0fc9faa5..7769016b 100644 --- a/shell/router/createInternalRoutes.ts +++ b/shell/router/createInternalRoutes.ts @@ -7,7 +7,7 @@ import patchAppIdIntoRouteHandle from './patchAppIdIntoRouteHandle'; export default function createInternalRoutes() { const internalModules = getInternalModules(); - const routes: Array = []; + const routes: RouteObject[] = []; Object.entries(internalModules).forEach( ([appId, internalModule]: [appId: string, internalModule: InternalAppConfig]) => { diff --git a/tools/cli/intl-imports.test.ts b/tools/cli/intl-imports.test.ts index c80a72f5..7fcf5db7 100644 --- a/tools/cli/intl-imports.test.ts +++ b/tools/cli/intl-imports.test.ts @@ -12,7 +12,7 @@ const logHistory: { log: string[], latest: string | null } = { }; // History for `fs.writeFileSync` mock calls. -const writeFileHistory: { log: Array<{ filename: string, content: string }>, latest: { filename: string, content: string } | null} = { +const writeFileHistory: { log: { filename: string, content: string }[], latest: { filename: string, content: string } | null } = { log: [], latest: null, }; diff --git a/tools/cli/intl-imports.ts b/tools/cli/intl-imports.ts index 65186d17..5100c9b3 100755 --- a/tools/cli/intl-imports.ts +++ b/tools/cli/intl-imports.ts @@ -189,7 +189,7 @@ function generateMainMessagesFile({ writeFileSync, i18nDir, }: { - processedDirectories: Array<{ directory: string, isWritten: boolean }>, + processedDirectories: { directory: string, isWritten: boolean }[], log: (message: string) => void, writeFileSync: (filename: string, content: string) => void, i18nDir: string, @@ -248,7 +248,7 @@ export function main({ log(`${loggingPrefix}: Error: src/i18n directory was not found.\n`); } else { // If we're here, we know that directories is an array, so cast it as one. - const processedDirectories = (directories).map((directory: string) => generateSubdirectoryMessageFile({ + const processedDirectories = (directories as string[]).map((directory: string) => generateSubdirectoryMessageFile({ directory, log, writeFileSync, diff --git a/tools/cli/transifex-utils.ts b/tools/cli/transifex-utils.ts index 68fce26a..13f9124c 100755 --- a/tools/cli/transifex-utils.ts +++ b/tools/cli/transifex-utils.ts @@ -15,7 +15,7 @@ import path from 'path'; * */ function gatherJson(dir: string) { - const ret: Array<{ id: string, description: string, defaultMessage: string }> = []; + const ret: { id: string, description: string, defaultMessage: string }[] = []; const files = glob.sync(`${dir}/**/*.json`); files.forEach((filename) => { diff --git a/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts index 8018ccfa..aa50c96d 100644 --- a/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts +++ b/tools/webpack/plugins/html-webpack-new-relic-plugin/HtmlWebpackNewRelicPlugin.ts @@ -75,7 +75,7 @@ export default class HtmlWebpackNewRelicPlugin { ;NREUM.info={beacon:"bam-cell.nr-data.net",errorBeacon:"bam-cell.nr-data.net",licenseKey:"${this.options.licenseKey}",applicationID:"${this.options.applicationID}",sa:1} `; - const optionKeys = >Object.keys(this.options) + const optionKeys = Object.keys(this.options) as OptionTypes[]; optionKeys.forEach((key: OptionTypes) => { if (!this.options[key]) { throw new Error(`${key} argument is required`); diff --git a/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts b/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts index 83a15cf8..6c63c8db 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/utils/assetUtils.ts @@ -20,7 +20,7 @@ export function findCoreCssAsset(paragonAssets: any) { * @param {Object} [options.paragonThemeCss] - The Paragon theme CSS object. * @return {Object} - The theme variant CSS assets. */ -export function findThemeVariantCssAssets(paragonAssets: Array, { +export function findThemeVariantCssAssets(paragonAssets: any[], { isBrandOverride = false, brandThemeCss, paragonThemeCss, diff --git a/types.ts b/types.ts index aadce0ec..8cee353c 100644 --- a/types.ts +++ b/types.ts @@ -138,7 +138,7 @@ export interface RequiredSiteConfig { export type SiteConfig = RequiredSiteConfig & OptionalSiteConfig; export interface ProjectModuleConfig { - modules?: Array, + modules?: string[], name?: string, plugins?: any, custom?: Record, @@ -148,7 +148,7 @@ export interface User { administrator: boolean, email: string, name: string, - roles: Array, + roles: string[], userId: number, username: string, avatar: string, @@ -171,19 +171,19 @@ export enum EnvironmentTypes { export interface HeaderConfig { logoUrl?: string, logoDestinationUrl?: string | null, - primaryLinks?: Array, - secondaryLinks?: Array, - anonymousLinks?: Array, - authenticatedLinks?: Array, + primaryLinks?: MenuItem[], + secondaryLinks?: MenuItem[], + anonymousLinks?: MenuItem[], + authenticatedLinks?: ChildMenuItem[], } export interface ResolvedHeaderConfig { logoUrl: string, logoDestinationUrl: string | null, - primaryLinks: Array, - secondaryLinks: Array, - anonymousLinks: Array, - authenticatedLinks: Array, + primaryLinks: MenuItem[], + secondaryLinks: MenuItem[], + anonymousLinks: MenuItem[], + authenticatedLinks: ChildMenuItem[], } export type MenuItemName = string | MessageDescriptor | ReactElement; @@ -198,7 +198,7 @@ export interface AppMenuItem extends BaseLinkMenuItem { export interface DropdownMenuItem { label: MessageDescriptor | string, - items: Array, + items: ChildMenuItem[], } export interface UrlMenuItem extends BaseLinkMenuItem { From b97aa367d3c1db88094a5d2dcbeb529af17afd56 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:55:27 -0400 Subject: [PATCH 24/75] fix(style): using html entities for apostrophe and quotes --- test-project/src/example-page/ExamplePage.tsx | 2 +- test-project/src/iframe-plugin/IframePlugin.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test-project/src/example-page/ExamplePage.tsx b/test-project/src/example-page/ExamplePage.tsx index f8473b7d..44878b6d 100644 --- a/test-project/src/example-page/ExamplePage.tsx +++ b/test-project/src/example-page/ExamplePage.tsx @@ -50,7 +50,7 @@ export default function ExamplePage() {

Is context.authenticatedUser equal to getAuthenticatedUser()? {printTestResult(authenticatedUser === getAuthenticatedUser())}

SCSS parsing tests

-

"The Apples" should be red (color: red; via .red-text CSS class in SCSS stylesheet)

+

"The Apples" should be red (color: red; via .red-text CSS class in SCSS stylesheet)

TSX parsing tests

apple.svg displayed in Image.tsx diff --git a/test-project/src/iframe-plugin/IframePlugin.tsx b/test-project/src/iframe-plugin/IframePlugin.tsx index bb135d34..9d6e4b8a 100644 --- a/test-project/src/iframe-plugin/IframePlugin.tsx +++ b/test-project/src/iframe-plugin/IframePlugin.tsx @@ -6,7 +6,7 @@ export default function PluginIframe() {

Inserted iFrame Plugin

- This is a component that lives in the test-project but is loaded into the page via an iframe. This emulates a real-world scenario. It is NOT testing for cross-origin security issues though, since it's on the same host name. + This is a component that lives in the test-project but is loaded into the page via an iframe. This emulates a real-world scenario. It is NOT testing for cross-origin security issues though, since it's on the same host name.

From d5759636c6005e9888afce367b5854a1cef02a67 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:55:49 -0400 Subject: [PATCH 25/75] fix(style): removing variable declaration in switch statement --- tools/cli/openedx.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/cli/openedx.ts b/tools/cli/openedx.ts index eabd0648..5a0fc63a 100755 --- a/tools/cli/openedx.ts +++ b/tools/cli/openedx.ts @@ -72,13 +72,12 @@ switch (commandName) { require('webpack-dev-server/bin/webpack-dev-server'); break; case CommandTypes.FORMAT_JS: - const commonArgs = [ + process.argv = process.argv.concat([ '--format', 'node_modules/@openedx/frontend-base/dist/tools/cli/utils/formatter.js', '--ignore', 'src/**/*.json', '--out-file', './temp/formatjs/Default.messages.json', '--', 'src/**/*.js*', - ]; - process.argv = process.argv.concat(commonArgs); + ]); require('@formatjs/cli/bin/formatjs'); break; case CommandTypes.SERVE: From 2632e67f7408a844a3be599ea22c6cfb37283592 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 16:56:04 -0400 Subject: [PATCH 26/75] fix(style): final typescript related style fixes --- test-project/src/example-page/Image.tsx | 12 ++++++------ .../paragon-webpack-plugin/ParagonWebpackPlugin.ts | 2 +- tools/webpack/types.ts | 2 +- tools/webpack/utils/getPublicPath.ts | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test-project/src/example-page/Image.tsx b/test-project/src/example-page/Image.tsx index 4119ea83..721ee528 100644 --- a/test-project/src/example-page/Image.tsx +++ b/test-project/src/example-page/Image.tsx @@ -1,12 +1,12 @@ import { CSSProperties } from 'react'; -type ImageProps = { - src: string; - alt?: string; - style?: CSSProperties; -}; +interface ImageProps { + src: string, + alt?: string, + style?: CSSProperties, +} -const Image = ({ alt, ...rest }:ImageProps) => {alt}; +const Image = ({ alt, ...rest }: ImageProps) => {alt}; const defaultProps = { alt: undefined, diff --git a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts index 7c349127..248f99dc 100644 --- a/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts +++ b/tools/webpack/plugins/paragon-webpack-plugin/ParagonWebpackPlugin.ts @@ -24,7 +24,7 @@ const brandThemeCss = getParagonThemeCss(process.cwd(), { isBrandOverride: true */ export default class ParagonWebpackPlugin implements WebpackPluginInstance { pluginName: string; - paragonThemeUrlsConfig: ParagonThemeUrls | {}; + paragonThemeUrlsConfig: ParagonThemeUrls | object; processAssetsHandlers: ((compilation: any) => void)[]; paragonMetadata: any; diff --git a/tools/webpack/types.ts b/tools/webpack/types.ts index 96bc6b19..81795fea 100644 --- a/tools/webpack/types.ts +++ b/tools/webpack/types.ts @@ -20,7 +20,7 @@ export interface ParagonThemeCss { } // This isn't perfect, as it implies having neither url nor urls would be valid. Feel free to improve it so that one is required. -export type ParagonThemeUrlsVariant = { +export interface ParagonThemeUrlsVariant { url?: string, urls?: Record, } diff --git a/tools/webpack/utils/getPublicPath.ts b/tools/webpack/utils/getPublicPath.ts index 606fcd47..d086de74 100644 --- a/tools/webpack/utils/getPublicPath.ts +++ b/tools/webpack/utils/getPublicPath.ts @@ -1,3 +1,3 @@ -export default function getPublicPath(defaultPath: string = '/') { +export default function getPublicPath(defaultPath = '/') { return process.env.PUBLIC_PATH ?? defaultPath; } From 323b1b7a77c92deb75cd892c96a226bbc4c18258 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 17:23:57 -0400 Subject: [PATCH 27/75] feat: new createLintConfig helper for ESLint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing createConfig helper is not appropriate for the new version of ESLint for two reasons - one, it uses webpack-merge, while we need to use tseslint.config to merge config. Second, the argument of a single “configFragment” object is not what tseslint needs - it needs an array of ConfigWithExtends objects. For these reasons, I just split the lint config helper out into a separate function. --- docs/how_tos/migrate-frontend-app.md | 34 ++++++------------ test-project/eslint.config.js | 15 ++------ test-project/package-lock.json | 46 +++++++++++++++++++++++- tools/config-helpers/createLintConfig.ts | 14 ++++++++ tools/eslint/base.eslint.config.js | 3 -- tools/eslint/modules.d.ts | 5 +++ tools/index.ts | 1 + tools/tsconfig.json | 2 +- 8 files changed, 79 insertions(+), 41 deletions(-) create mode 100644 tools/config-helpers/createLintConfig.ts create mode 100644 tools/eslint/modules.d.ts diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index bdfb150c..d46d3599 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -295,35 +295,23 @@ mergeConfig(siteConfig); ``` -## 11. Edit `.eslintrc.js` +## 11. Replace `.eslintrc.js` with `eslint.config.js` -Replace the import from 'frontend-build' with 'frontend-base'. +ESLint has been upgraded to v9, which has a new 'flat' file format. Replace the repository's `.eslintrc.js` file with a new `eslint.config.js` file with the following contents: -```diff -- const { createConfig } = require('@openedx/frontend-build'); -+ const { createConfig } = require('@openedx/frontend-base/config'); ``` +// @ts-check -Use 'lint' instead of 'eslint' as the config type for createConfig() +const { createLintConfig } = require('@openedx/frontend-base/config'); -``` -module.exports = createConfig('lint', { - // ... custom config -}) -``` - -You will also need to set the `project` in `parserOptions`. An uncustomized `.eslintrc.js` file looks like: - -``` -const path = require('path'); - -const { createConfig } = require('@openedx/frontend-base/config'); - -module.exports = createConfig('lint', { - parserOptions: { - project: path.resolve(__dirname, './tsconfig.json'), +module.exports = createLintConfig( + { + files: [ + 'src/**/*', + 'site.config.*', + ], }, -}); +); ``` ## 12. Search for any other usages of `frontend-build` diff --git a/test-project/eslint.config.js b/test-project/eslint.config.js index f394885b..22a612bf 100644 --- a/test-project/eslint.config.js +++ b/test-project/eslint.config.js @@ -1,19 +1,8 @@ // @ts-check -const tseslint = require('typescript-eslint'); -const eslintConfig = require('../tools/eslint/base.eslint.config.js'); +const { createLintConfig } = require('@openedx/frontend-base/config'); -module.exports = tseslint.config( - { - extends: eslintConfig, - }, - { - languageOptions: { - parserOptions: { - projectService: true, - } - } - }, +module.exports = createLintConfig( { files: [ 'src/**/*', diff --git a/test-project/package-lock.json b/test-project/package-lock.json index 0f7bf116..63f16944 100644 --- a/test-project/package-lock.json +++ b/test-project/package-lock.json @@ -3686,7 +3686,7 @@ "node_modules/@openedx/frontend-base": { "version": "1.0.0", "resolved": "file:../openedx-frontend-base-1.0.0.tgz", - "integrity": "sha512-zMwMaM1yKGKwlEdgN6N+yfnzJREaW8CdYMrLaqtKp6F3Sk5bDOemm1gLQ07knMnIyxwx4h2DOb5/XPV3YqWOng==", + "integrity": "sha512-2IaRIhfLohx9/vbCgSxWldOW0bZVMa1MOw+VokyVqR3LReUhRVqFZg7pVyto6fxDdTEg8wSOOyBvC4Xnd2zL8g==", "peer": true, "dependencies": { "@babel/core": "^7.24.9", @@ -3704,6 +3704,7 @@ "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@stylistic/eslint-plugin": "^2.9.0", "@types/eslint__js": "^8.42.3", "@types/gradient-string": "^1.1.6", "autoprefixer": "^10.4.20", @@ -4039,6 +4040,49 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.9.0.tgz", + "integrity": "sha512-OrDyFAYjBT61122MIY1a3SfEgy3YCMgt2vL4eoPmvTwDBwyQhAXurxNQznlRD/jESNfYWfID8Ej+31LljvF7Xg==", + "peer": true, + "dependencies": { + "@typescript-eslint/utils": "^8.8.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", diff --git a/tools/config-helpers/createLintConfig.ts b/tools/config-helpers/createLintConfig.ts new file mode 100644 index 00000000..5cce3a39 --- /dev/null +++ b/tools/config-helpers/createLintConfig.ts @@ -0,0 +1,14 @@ +import tseslint, { ConfigWithExtends } from 'typescript-eslint'; +import { ConfigTypes } from '../types'; +import getBaseConfig from './getBaseConfig'; + +export default function createLintConfig(...configs: ConfigWithExtends[]) { + const baseConfig = getBaseConfig(ConfigTypes.LINT); + + return tseslint.config( + { + extends: baseConfig, + }, + ...configs, + ); +}; diff --git a/tools/eslint/base.eslint.config.js b/tools/eslint/base.eslint.config.js index e7c63f5c..bc3482a8 100644 --- a/tools/eslint/base.eslint.config.js +++ b/tools/eslint/base.eslint.config.js @@ -3,12 +3,9 @@ const { fixupPluginRules } = require('@eslint/compat'); const eslint = require('@eslint/js'); const formatjs = require('eslint-plugin-formatjs'); -// @ts-expect-error There are no type definitions for this. const jest = require('eslint-plugin-jest'); -// @ts-expect-error There are no type definitions for this. const jsxA11y = require('eslint-plugin-jsx-a11y'); const react = require('eslint-plugin-react'); -// @ts-expect-error There are no type definitions for this. const reactHooks = require('eslint-plugin-react-hooks'); const globals = require('globals'); const tseslint = require('typescript-eslint'); diff --git a/tools/eslint/modules.d.ts b/tools/eslint/modules.d.ts new file mode 100644 index 00000000..538d3de2 --- /dev/null +++ b/tools/eslint/modules.d.ts @@ -0,0 +1,5 @@ +// This file needs to exist to declare modules for dependencies that don't publish their types. + +declare module 'eslint-plugin-jest'; +declare module 'eslint-plugin-jsx-a11y'; +declare module 'eslint-plugin-react-hooks'; diff --git a/tools/index.ts b/tools/index.ts index 268f1ca5..70ea00d7 100644 --- a/tools/index.ts +++ b/tools/index.ts @@ -1,2 +1,3 @@ export { default as createConfig } from './config-helpers/createConfig'; +export { default as createLintConfig } from './config-helpers/createLintConfig'; export { default as getBaseConfig } from './config-helpers/getBaseConfig'; diff --git a/tools/tsconfig.json b/tools/tsconfig.json index 028e4a16..40a05763 100644 --- a/tools/tsconfig.json +++ b/tools/tsconfig.json @@ -17,7 +17,7 @@ "types.ts", "index.ts", "defaultConfigPaths.ts", - "eslint/base.eslint.config.js", + "eslint/**/*", "eslint.config.js", "jest.config.js", ], From 0a6f7fff51abfb288ae5c70e226039a5d4aaf1ff Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 25 Oct 2024 17:28:32 -0400 Subject: [PATCH 28/75] docs: adding information about how to add eslint ignores to the new config file --- docs/how_tos/migrate-frontend-app.md | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index d46d3599..32eadb77 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -314,6 +314,40 @@ module.exports = createLintConfig( ); ``` +## 12. Replace `.eslintignore`, if it exists, with entries in `eslint.config.js` + +The base eslint config provided by frontend-base ignores a number of common folders by default: + +``` + { + ignores: [ + 'coverage/*', + 'dist/*', + 'node_modules/*', + '**/__mocks__/*', + '**/__snapshots__/*', + ], + }, +``` + +You can configure additional ignores in your own `eslint.config.js` file using the above syntax, as a separate object from the existing 'files' object: + +```diff +module.exports = createLintConfig( + { + files: [ + 'src/**/*', + 'site.config.*', + ], + }, ++ { ++ ignores: [ ++ 'ignoredfolder/*' ++ ] ++ } +); +``` + ## 12. Search for any other usages of `frontend-build` Find any other imports/usages of `frontend-build` in your repository and replace them with `frontend-base` so they don't break. From 94152f3d0f21f8dc3535852a99e791486762d01b Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 15:15:48 -0400 Subject: [PATCH 29/75] fix: removing unneeded Intl polyfills PluralRules and RelativeTimeFormat are widely available in browsers today, so these are no longer necessary. --- package-lock.json | 39 --------------------------------------- package.json | 2 -- runtime/i18n/lib.ts | 33 --------------------------------- 3 files changed, 74 deletions(-) diff --git a/package-lock.json b/package-lock.json index c29a9440..ead7431d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,8 +18,6 @@ "@eslint/compat": "^1.2.1", "@eslint/js": "^9.13.0", "@formatjs/cli": "^6.0.3", - "@formatjs/intl-pluralrules": "^4.3.3", - "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", @@ -2258,15 +2256,6 @@ } } }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", - "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", - "dependencies": { - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, "node_modules/@formatjs/fast-memoize": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", @@ -2404,34 +2393,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", - "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@formatjs/intl-pluralrules": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.3.3.tgz", - "integrity": "sha512-NLZN8gf2qLpCuc0m565IbKLNUarEGOzk0mkdTkE4XTuNCofzoQTurW6lL3fmDlneAoYl2FiTdHa5q4o2vZF50g==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, - "node_modules/@formatjs/intl-relativetimeformat": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-10.0.1.tgz", - "integrity": "sha512-AABPQtPjFilXegQsnmVHrSlzjFNUffAEk5DgowY6b7WSwDI7g2W6QgW903/lbZ58emhphAbgHdtKeUBXqTiLpw==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, "node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", diff --git a/package.json b/package.json index 50df607a..c71f70b2 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,6 @@ "@eslint/compat": "^1.2.1", "@eslint/js": "^9.13.0", "@formatjs/cli": "^6.0.3", - "@formatjs/intl-pluralrules": "^4.3.3", - "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index e796f2fb..51f02569 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -3,39 +3,6 @@ import PropTypes from 'prop-types'; import { MessageFormatElement } from 'react-intl'; import Cookies from 'universal-cookie'; -import '@formatjs/intl-pluralrules/polyfill'; -import '@formatjs/intl-relativetimeformat/polyfill'; - -import '@formatjs/intl-pluralrules/locale-data/ar'; -import '@formatjs/intl-pluralrules/locale-data/ca'; -import '@formatjs/intl-pluralrules/locale-data/en'; -import '@formatjs/intl-pluralrules/locale-data/es'; -import '@formatjs/intl-pluralrules/locale-data/fr'; -import '@formatjs/intl-pluralrules/locale-data/he'; -import '@formatjs/intl-pluralrules/locale-data/id'; -import '@formatjs/intl-pluralrules/locale-data/ko'; -import '@formatjs/intl-pluralrules/locale-data/pl'; -import '@formatjs/intl-pluralrules/locale-data/pt'; -import '@formatjs/intl-pluralrules/locale-data/ru'; -import '@formatjs/intl-pluralrules/locale-data/th'; -import '@formatjs/intl-pluralrules/locale-data/uk'; -import '@formatjs/intl-pluralrules/locale-data/zh'; - -import '@formatjs/intl-relativetimeformat/locale-data/ar'; -import '@formatjs/intl-relativetimeformat/locale-data/ca'; -import '@formatjs/intl-relativetimeformat/locale-data/en'; -import '@formatjs/intl-relativetimeformat/locale-data/es'; -import '@formatjs/intl-relativetimeformat/locale-data/fr'; -import '@formatjs/intl-relativetimeformat/locale-data/he'; -import '@formatjs/intl-relativetimeformat/locale-data/id'; -import '@formatjs/intl-relativetimeformat/locale-data/ko'; -import '@formatjs/intl-relativetimeformat/locale-data/pl'; -import '@formatjs/intl-relativetimeformat/locale-data/pt'; -import '@formatjs/intl-relativetimeformat/locale-data/ru'; -import '@formatjs/intl-relativetimeformat/locale-data/th'; -import '@formatjs/intl-relativetimeformat/locale-data/uk'; -import '@formatjs/intl-relativetimeformat/locale-data/zh'; - import { EnvironmentTypes, SiteConfig } from '../../types'; import { LoggingService } from '../logging/types'; From 82e8017fb1610939b960082ea0d717e2e5da7183 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 15:24:25 -0400 Subject: [PATCH 30/75] fix: removing country and language list functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modules that need these functions should implement them themselves - frontend-app-account in particular. We don’t want to load these lists for the vast majority of the frontend that doesn’t need them. This also removes the third party dependencies that backed the lists. --- docs/how_tos/migrate-frontend-app.md | 7 +++ index.ts | 4 -- package-lock.json | 26 ---------- package.json | 2 - runtime/i18n/countries.js | 70 -------------------------- runtime/i18n/index.js | 10 ---- runtime/i18n/languages.js | 74 ---------------------------- runtime/index.ts | 4 -- 8 files changed, 7 insertions(+), 190 deletions(-) delete mode 100644 runtime/i18n/countries.js delete mode 100644 runtime/i18n/languages.js diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index 32eadb77..c070000a 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -560,3 +560,10 @@ https://react-redux.js.org/using-react-redux/accessing-store#multiple-stores ## 28. Add LEARNER_DASHBOARD_URL to config ## 29. Convert @import to @use in SCSS files. + +## 30. Changes to i81n + +`getLanguageList` has been removed. Modules that need a list of countries should install `@cospired/i18n-iso-languages` as a dependency. + +`getCountryList` has been removed. MFEs that need a list of countries should install `i18n-iso-countries` or `countries-list` as a dependency. + diff --git a/index.ts b/index.ts index 494669de..218cce85 100644 --- a/index.ts +++ b/index.ts @@ -54,12 +54,8 @@ export { getAuthenticatedUser, getBasename, getConfig, - getCountryList, - getCountryMessages, getHistory, getHttpClient, - getLanguageList, - getLanguageMessages, getLocale, getLoggingService, getLoginRedirectUrl, diff --git a/package-lock.json b/package-lock.json index ead7431d..7040a552 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,6 @@ "@babel/preset-env": "^7.24.8", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", - "@cospired/i18n-iso-languages": "^4.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", "@eslint/compat": "^1.2.1", "@eslint/js": "^9.13.0", @@ -51,7 +50,6 @@ "gradient-string": "^2.0.2", "history": "^4.10.1", "html-webpack-plugin": "5.6.0", - "i18n-iso-countries": "^4.3.1", "identity-obj-proxy": "3.0.0", "image-minimizer-webpack-plugin": "3.8.3", "jest": "^29.7.0", @@ -1958,14 +1956,6 @@ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==" }, - "node_modules/@cospired/i18n-iso-languages": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.2.0.tgz", - "integrity": "sha512-vy8cq1176MTxVwB1X9niQjcIYOH29F8Huxtx8hLmT5Uz3l1ztGDGri8KN/4zE7LV2mCT7JrcAoNV/I9yb+lNUw==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz", @@ -7443,11 +7433,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/diacritics": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", - "integrity": "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==" - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -9728,17 +9713,6 @@ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" }, - "node_modules/i18n-iso-countries": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-4.3.1.tgz", - "integrity": "sha512-yxeCvmT8yO1p/epv93c1OHnnYNNMOX6NUNpNfuvzSIcDyripS7OGeKXgzYGd5QI31UK+GBrMG0nPFNv0jrHggw==", - "dependencies": { - "diacritics": "^1.3.0" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", diff --git a/package.json b/package.json index c71f70b2..8a072222 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "@babel/preset-env": "^7.24.8", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", - "@cospired/i18n-iso-languages": "^4.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", "@eslint/compat": "^1.2.1", "@eslint/js": "^9.13.0", @@ -91,7 +90,6 @@ "gradient-string": "^2.0.2", "history": "^4.10.1", "html-webpack-plugin": "5.6.0", - "i18n-iso-countries": "^4.3.1", "identity-obj-proxy": "3.0.0", "image-minimizer-webpack-plugin": "3.8.3", "jest": "^29.7.0", diff --git a/runtime/i18n/countries.js b/runtime/i18n/countries.js deleted file mode 100644 index 21cf8306..00000000 --- a/runtime/i18n/countries.js +++ /dev/null @@ -1,70 +0,0 @@ -import COUNTRIES, { langs as countryLangs } from 'i18n-iso-countries'; - -import arLocale from 'i18n-iso-countries/langs/ar.json'; -import caLocale from 'i18n-iso-countries/langs/ca.json'; -import enLocale from 'i18n-iso-countries/langs/en.json'; -import esLocale from 'i18n-iso-countries/langs/es.json'; -import frLocale from 'i18n-iso-countries/langs/fr.json'; -import heLocale from 'i18n-iso-countries/langs/he.json'; -import idLocale from 'i18n-iso-countries/langs/id.json'; -import koLocale from 'i18n-iso-countries/langs/ko.json'; -import plLocale from 'i18n-iso-countries/langs/pl.json'; -import ptLocale from 'i18n-iso-countries/langs/pt.json'; -import ruLocale from 'i18n-iso-countries/langs/ru.json'; -import ukLocale from 'i18n-iso-countries/langs/uk.json'; -import zhLocale from 'i18n-iso-countries/langs/zh.json'; - -import { getPrimaryLanguageSubtag } from './lib'; - -/* - * COUNTRY LISTS - * - * Lists of country names localized in supported languages. - * - * TODO: When we start dynamically loading translations only for the current locale, change this. - */ - -COUNTRIES.registerLocale(arLocale); -COUNTRIES.registerLocale(enLocale); -COUNTRIES.registerLocale(esLocale); -COUNTRIES.registerLocale(frLocale); -COUNTRIES.registerLocale(zhLocale); -COUNTRIES.registerLocale(caLocale); -COUNTRIES.registerLocale(heLocale); -COUNTRIES.registerLocale(idLocale); -COUNTRIES.registerLocale(koLocale); -COUNTRIES.registerLocale(plLocale); -COUNTRIES.registerLocale(ptLocale); -COUNTRIES.registerLocale(ruLocale); -// COUNTRIES.registerLocale(thLocale); // Doesn't exist in lib. -COUNTRIES.registerLocale(ukLocale); - -/** - * Provides a lookup table of country IDs to country names for the current locale. - * - * @memberof module:I18n - */ -export function getCountryMessages(locale) { - const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale); - const languageCode = countryLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en'; - - return COUNTRIES.getNames(languageCode); -} - -/** - * Provides a list of countries represented as objects of the following shape: - * - * { - * key, // The ID of the country - * name // The localized name of the country - * } - * - * TODO: ARCH-878: The list should be sorted alphabetically in the current locale. - * This is useful for populating dropdowns. - * - * @memberof module:I18n - */ -export function getCountryList(locale) { - const countryMessages = getCountryMessages(locale); - return Object.entries(countryMessages).map(([code, name]) => ({ code, name })); -} diff --git a/runtime/i18n/index.js b/runtime/i18n/index.js index 6d439f6f..895d9b21 100644 --- a/runtime/i18n/index.js +++ b/runtime/i18n/index.js @@ -112,13 +112,3 @@ export { export { default as injectIntl, } from './injectIntlWithShim'; - -export { - getCountryList, - getCountryMessages, -} from './countries'; - -export { - getLanguageList, - getLanguageMessages, -} from './languages'; diff --git a/runtime/i18n/languages.js b/runtime/i18n/languages.js deleted file mode 100644 index 3dc46aff..00000000 --- a/runtime/i18n/languages.js +++ /dev/null @@ -1,74 +0,0 @@ -import LANGUAGES, { langs as languageLangs } from '@cospired/i18n-iso-languages'; - -// import arLocale from '@cospired/i18n-iso-languages/langs/ar.json'; -import enLocale from '@cospired/i18n-iso-languages/langs/en.json'; -import esLocale from '@cospired/i18n-iso-languages/langs/es.json'; -import frLocale from '@cospired/i18n-iso-languages/langs/fr.json'; -// import zhLocale from '@cospired/i18n-iso-languages/langs/zh.json'; -// import caLocale from '@cospired/i18n-iso-languages/langs/ca.json'; -// import heLocale from '@cospired/i18n-iso-languages/langs/he.json'; -// import idLocale from '@cospired/i18n-iso-languages/langs/id.json'; -// import koLocale from '@cospired/i18n-iso-languages/langs/ko.json'; -import plLocale from '@cospired/i18n-iso-languages/langs/pl.json'; -import ptLocale from '@cospired/i18n-iso-languages/langs/pt.json'; -// import ruLocale from '@cospired/i18n-iso-languages/langs/ru.json'; -// import thLocale from '@cospired/i18n-iso-languages/langs/th.json'; -// import ukLocale from '@cospired/i18n-iso-languages/langs/uk.json'; - -import { getPrimaryLanguageSubtag } from './lib'; - -/* - * LANGUAGE LISTS - * - * Lists of language names localized in supported languages. - * - * TODO: When we start dynamically loading translations only for the current locale, change this. - * TODO: Also note that a bunch of languages are missing here. They're present but commented out - * for reference. That's because they're not implemented in this library. If you read this and it's - * been a while, go check and see if that's changed! - */ - -// LANGUAGES.registerLocale(arLocale); -LANGUAGES.registerLocale(enLocale); -LANGUAGES.registerLocale(esLocale); -LANGUAGES.registerLocale(frLocale); -// LANGUAGES.registerLocale(zhLocale); -// LANGUAGES.registerLocale(caLocale); -// LANGUAGES.registerLocale(heLocale); -// LANGUAGES.registerLocale(idLocale); -// LANGUAGES.registerLocale(koLocale); -LANGUAGES.registerLocale(plLocale); -LANGUAGES.registerLocale(ptLocale); -// LANGUAGES.registerLocale(ruLocale); -// LANGUAGES.registerLocale(thLocale); -// LANGUAGES.registerLocale(ukLocale); - -/** - * Provides a lookup table of language IDs to language names for the current locale. - * - * @memberof I18n - */ -export const getLanguageMessages = (locale) => { - const primaryLanguageSubtag = getPrimaryLanguageSubtag(locale); - const languageCode = languageLangs().includes(primaryLanguageSubtag) ? primaryLanguageSubtag : 'en'; - - return LANGUAGES.getNames(languageCode); -}; - -/** - * Provides a list of languages represented as objects of the following shape: - * - * { - * key, // The ID of the language - * name // The localized name of the language - * } - * - * TODO: ARCH-878: The list should be sorted alphabetically in the current locale. - * This is useful for populating dropdowns. - * - * @memberof I18n - */ -export const getLanguageList = (locale) => { - const languageMessages = getLanguageMessages(locale); - return Object.entries(languageMessages).map(([code, name]) => ({ code, name })); -}; diff --git a/runtime/index.ts b/runtime/index.ts index a729d56c..2d1a64e9 100644 --- a/runtime/index.ts +++ b/runtime/index.ts @@ -64,10 +64,6 @@ export { configure as configureI18n, createIntl, defineMessages, - getCountryList, - getCountryMessages, - getLanguageList, - getLanguageMessages, getLocale, getMessages, getPrimaryLanguageSubtag, From 212f4ff306a57760f542f3d27daa6266820a0864 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 16:52:04 -0400 Subject: [PATCH 31/75] fix: replacing pubsub-js with simple eventing system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit removes our dependency on pubsub-js. - pubsub-js hasn’t been significantly updated in years - We don’t use most of what pubsub-js provides - pubsub-js has a console.warn statement that you can’t turn off which appears in numerous ‘runtime’ tests - It relies on global variables, and it’s confusing determining where it should be imported. The new replacement API: - `subscribe(topic: string, callback: (topic: string, data?: any) => void)` - `publish(topic: string, data?: any)` - `unsubscribe(topic: string, callback: (topic: string, data?: any) => void)` - `clearAllSubscriptions()` The unsubscribe function as a different API than pubsub-js's unsubscribe function, taking a topic and a callback rather than an unsubscribe token. Consumers who were using the `PubSub` global variable should instead import the above functions directly from `@openedx/frontend-base`. --- docs/how_tos/migrate-frontend-app.md | 13 +++ index.ts | 1 + package-lock.json | 6 -- package.json | 1 - runtime/auth/interface.js | 5 +- runtime/config.ts | 6 +- runtime/index.ts | 13 +-- .../initialize.async.function.config.test.js | 4 +- runtime/initialize.const.config.test.js | 4 +- runtime/initialize.function.config.test.js | 5 +- runtime/initialize.js | 19 +++-- runtime/initialize.test.js | 23 +++--- runtime/react/AuthenticatedPageRoute.test.jsx | 2 +- runtime/react/hooks.js | 8 +- runtime/react/hooks.test.jsx | 6 +- runtime/{pubSub.js => subscriptions.ts} | 46 +++++++++-- test-project/package-lock.json | 81 +------------------ 17 files changed, 105 insertions(+), 138 deletions(-) rename runtime/{pubSub.js => subscriptions.ts} (50%) diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index c070000a..8af91cac 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -567,3 +567,16 @@ https://react-redux.js.org/using-react-redux/accessing-store#multiple-stores `getCountryList` has been removed. MFEs that need a list of countries should install `i18n-iso-countries` or `countries-list` as a dependency. + +## Removal of pubsub-js + +frontend-platform used pubsub-js behind the scenes for event subscriptions/publishing. It used it in a very rudimentary way, and the library was noisy in test suites, complaining about being re-initialized. Because of these reasons, we've removed our dependency on pubsub-js and replaced it with a simple subscription system with a very similar API: + +- `subscribe(topic: string, callback: (topic: string, data?: any) => void)` +- `publish(topic: string, data?: any)` +- `unsubscribe(topic: string, callback: (topic: string, data?: any) => void)` +- `clearAllSubscriptions()` + +The unsubscribe function as a different API than pubsub-js's unsubscribe function, taking a topic and a callback rather than an unsubscribe token. + +Consumers who were using the `PubSub` global variable should instead import the above functions directly from `@openedx/frontend-base`. diff --git a/index.ts b/index.ts index 218cce85..6c5ed01d 100644 --- a/index.ts +++ b/index.ts @@ -39,6 +39,7 @@ export { SegmentAnalyticsService, auth, camelCaseObject, + clearAllSubscriptions, configureAnalytics, configureAuth, configureI18n, diff --git a/package-lock.json b/package-lock.json index 7040a552..668e73c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,6 @@ "postcss-loader": "7.3.4", "postcss-rtlcss": "^5.5.0", "prop-types": "^15.8.1", - "pubsub-js": "^1.9.4", "react-dev-utils": "12.0.1", "react-focus-on": "^3.9.4", "react-intl": "^6.6.6", @@ -13954,11 +13953,6 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "node_modules/pubsub-js": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.9.4.tgz", - "integrity": "sha512-hJYpaDvPH4w8ZX/0Fdf9ma1AwRgU353GfbaVfPjfJQf1KxZ2iHaHl3fAUw1qlJIR5dr4F3RzjGaWohYUEyoh7A==" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/package.json b/package.json index 8a072222..7ec0bb91 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,6 @@ "postcss-loader": "7.3.4", "postcss-rtlcss": "^5.5.0", "prop-types": "^15.8.1", - "pubsub-js": "^1.9.4", "react-dev-utils": "12.0.1", "react-focus-on": "^3.9.4", "react-intl": "^6.6.6", diff --git a/runtime/auth/interface.js b/runtime/auth/interface.js index ecf85231..42f24122 100644 --- a/runtime/auth/interface.js +++ b/runtime/auth/interface.js @@ -35,6 +35,7 @@ * @module Auth */ import PropTypes from 'prop-types'; +import { publish } from '../subscriptions'; /** * @constant @@ -206,7 +207,7 @@ export function getAuthenticatedUser() { */ export function setAuthenticatedUser(authUser) { service.setAuthenticatedUser(authUser); - global.PubSub.publish(AUTHENTICATED_USER_CHANGED); + publish(AUTHENTICATED_USER_CHANGED); } /** @@ -247,7 +248,7 @@ export async function ensureAuthenticatedUser(redirectUrl) { */ export async function hydrateAuthenticatedUser() { await service.hydrateAuthenticatedUser(); - global.PubSub.publish(AUTHENTICATED_USER_CHANGED); + publish(AUTHENTICATED_USER_CHANGED); } /** diff --git a/runtime/config.ts b/runtime/config.ts index f1ac6ebf..0540c369 100644 --- a/runtime/config.ts +++ b/runtime/config.ts @@ -101,11 +101,11 @@ */ import merge from 'lodash.merge'; -import 'pubsub-js'; import { AppConfigTypes, ApplicationModuleConfig, ConfigurableAppConfig, EnvironmentTypes, SiteConfig } from '../types'; import { CONFIG_CHANGED } from './constants'; +import { publish } from './subscriptions'; let config: SiteConfig = { ACCESS_TOKEN_COOKIE_NAME: 'edx-jwt-cookie-header-payload', @@ -199,7 +199,7 @@ export function getConfig() { */ export function setConfig(newConfig: SiteConfig) { config = newConfig; - global.PubSub.publish(CONFIG_CHANGED); + publish(CONFIG_CHANGED); } /** @@ -220,7 +220,7 @@ export function setConfig(newConfig: SiteConfig) { */ export function mergeConfig(newConfig: Partial) { config = merge(config, newConfig); - global.PubSub.publish(CONFIG_CHANGED); + publish(CONFIG_CHANGED); } export function patchAppModuleConfig(appId: string, appModuleConfig: ApplicationModuleConfig) { diff --git a/runtime/index.ts b/runtime/index.ts index 2d1a64e9..d2dc5590 100644 --- a/runtime/index.ts +++ b/runtime/index.ts @@ -98,12 +98,6 @@ export { PluginSlot } from './plugins'; -export { - publish, - subscribe, - unsubscribe -} from './pubSub'; - export { AppContext, AppProvider, @@ -118,6 +112,13 @@ export { useConfig } from './react'; +export { + clearAllSubscriptions, + publish, + subscribe, + unsubscribe +} from './subscriptions'; + export { initializeMockApp, mockMessages diff --git a/runtime/initialize.async.function.config.test.js b/runtime/initialize.async.function.config.test.js index 323bf1cc..92ea6232 100644 --- a/runtime/initialize.async.function.config.test.js +++ b/runtime/initialize.async.function.config.test.js @@ -1,4 +1,3 @@ -import 'pubsub-js'; import { initialize } from './initialize'; import { @@ -10,6 +9,7 @@ import { getConfig } from './config'; import { logError, } from './logging'; +import { clearAllSubscriptions } from './subscriptions'; jest.mock('./logging'); jest.mock('./auth'); @@ -32,7 +32,7 @@ describe('initialize with async function js file config', () => { ensureAuthenticatedUser.mockReset(); hydrateAuthenticatedUser.mockReset(); logError.mockReset(); - global.PubSub.clearAllSubscriptions(); + clearAllSubscriptions(); }); it('should initialize the app with async function javascript file configuration', async () => { diff --git a/runtime/initialize.const.config.test.js b/runtime/initialize.const.config.test.js index 3f30c90c..b26d9f1f 100644 --- a/runtime/initialize.const.config.test.js +++ b/runtime/initialize.const.config.test.js @@ -1,4 +1,3 @@ -import 'pubsub-js'; import { initialize } from './initialize'; import { @@ -10,6 +9,7 @@ import { getConfig } from './config'; import { logError, } from './logging'; +import { clearAllSubscriptions } from './subscriptions'; jest.mock('./logging'); jest.mock('./auth'); @@ -30,7 +30,7 @@ describe('initialize with constant js file config', () => { ensureAuthenticatedUser.mockReset(); hydrateAuthenticatedUser.mockReset(); logError.mockReset(); - global.PubSub.clearAllSubscriptions(); + clearAllSubscriptions(); }); it('should initialize the app with javascript file configuration', async () => { diff --git a/runtime/initialize.function.config.test.js b/runtime/initialize.function.config.test.js index 4683754e..d1a65587 100644 --- a/runtime/initialize.function.config.test.js +++ b/runtime/initialize.function.config.test.js @@ -1,5 +1,3 @@ -import 'pubsub-js'; - import { ensureAuthenticatedUser, fetchAuthenticatedUser, @@ -10,6 +8,7 @@ import { initialize } from './initialize'; import { logError, } from './logging'; +import { clearAllSubscriptions } from './subscriptions'; jest.mock('./logging'); jest.mock('./auth'); @@ -30,7 +29,7 @@ describe('initialize with function js file config', () => { ensureAuthenticatedUser.mockReset(); hydrateAuthenticatedUser.mockReset(); logError.mockReset(); - global.PubSub.clearAllSubscriptions(); + clearAllSubscriptions(); }); it('should initialize the app with javascript file configuration', async () => { diff --git a/runtime/initialize.js b/runtime/initialize.js index b25b52fd..053b542f 100644 --- a/runtime/initialize.js +++ b/runtime/initialize.js @@ -93,6 +93,7 @@ import { NewRelicLoggingService, } from './logging'; import { GoogleAnalyticsLoader } from './scripts'; +import { publish } from './subscriptions'; import { getPath } from './utils'; /** @@ -303,13 +304,13 @@ export async function initialize({ try { // Pub/Sub await handlers.pubSub(); - global.PubSub.publish(APP_PUBSUB_INITIALIZED); + publish(APP_PUBSUB_INITIALIZED); // Configuration await fileConfig(); await handlers.config(); await runtimeConfig(); - global.PubSub.publish(APP_CONFIG_INITIALIZED); + publish(APP_CONFIG_INITIALIZED); loadExternalScripts(externalScripts, { config: getConfig(), @@ -329,16 +330,14 @@ export async function initialize({ config: getConfig(), }); await handlers.logging(); - global.PubSub.publish(APP_LOGGING_INITIALIZED); + publish(APP_LOGGING_INITIALIZED); // Internationalization configureI18n({ messages, - config: getConfig(), - loggingService: getLoggingService(), }); await handlers.i18n(); - global.PubSub.publish(APP_I18N_INITIALIZED); + publish(APP_I18N_INITIALIZED); // Authentication configureAuth(authServiceImpl, { @@ -348,7 +347,7 @@ export async function initialize({ }); await handlers.auth(requireUser, hydrateUser); - global.PubSub.publish(APP_AUTH_INITIALIZED); + publish(APP_AUTH_INITIALIZED); // Analytics configureAnalytics(analyticsServiceImpl, { @@ -357,16 +356,16 @@ export async function initialize({ httpClient: getAuthenticatedHttpClient(), }); await handlers.analytics(); - global.PubSub.publish(APP_ANALYTICS_INITIALIZED); + publish(APP_ANALYTICS_INITIALIZED); // Application Ready await handlers.ready(); - global.PubSub.publish(APP_READY); + publish(APP_READY); } catch (error) { if (!error.isRedirecting) { // Initialization Error await handlers.initError(error); - global.PubSub.publish(APP_INIT_ERROR, error); + publish(APP_INIT_ERROR, error); } } } diff --git a/runtime/initialize.test.js b/runtime/initialize.test.js index bae7a535..83e20117 100644 --- a/runtime/initialize.test.js +++ b/runtime/initialize.test.js @@ -1,5 +1,5 @@ import { createBrowserHistory } from 'history'; -import 'pubsub-js'; + import { APP_ANALYTICS_INITIALIZED, APP_AUTH_INITIALIZED, @@ -31,6 +31,7 @@ import { logError, NewRelicLoggingService, } from './logging'; +import { clearAllSubscriptions, subscribe } from './subscriptions'; jest.mock('./logging'); jest.mock('./auth'); @@ -83,7 +84,7 @@ describe('initialize', () => { ensureAuthenticatedUser.mockReset(); hydrateAuthenticatedUser.mockReset(); logError.mockReset(); - global.PubSub.clearAllSubscriptions(); + clearAllSubscriptions(); }); it('should call default handlers in the absence of overrides', async () => { @@ -106,13 +107,13 @@ describe('initialize', () => { } } - global.PubSub.subscribe(APP_PUBSUB_INITIALIZED, checkDispatchedDone); - global.PubSub.subscribe(APP_CONFIG_INITIALIZED, checkDispatchedDone); - global.PubSub.subscribe(APP_LOGGING_INITIALIZED, checkDispatchedDone); - global.PubSub.subscribe(APP_AUTH_INITIALIZED, checkDispatchedDone); - global.PubSub.subscribe(APP_ANALYTICS_INITIALIZED, checkDispatchedDone); - global.PubSub.subscribe(APP_I18N_INITIALIZED, checkDispatchedDone); - global.PubSub.subscribe(APP_READY, checkDispatchedDone); + subscribe(APP_PUBSUB_INITIALIZED, checkDispatchedDone); + subscribe(APP_CONFIG_INITIALIZED, checkDispatchedDone); + subscribe(APP_LOGGING_INITIALIZED, checkDispatchedDone); + subscribe(APP_AUTH_INITIALIZED, checkDispatchedDone); + subscribe(APP_ANALYTICS_INITIALIZED, checkDispatchedDone); + subscribe(APP_I18N_INITIALIZED, checkDispatchedDone); + subscribe(APP_READY, checkDispatchedDone); const messages = { i_am: 'a message' }; await initialize({ messages }); @@ -222,7 +223,7 @@ describe('initialize', () => { expect(data).toEqual(new Error('uhoh!')); } - global.PubSub.subscribe(APP_INIT_ERROR, errorHandler); + subscribe(APP_INIT_ERROR, errorHandler); await initialize({ messages: null, @@ -258,7 +259,7 @@ describe('initialize', () => { expect(data).toEqual(new Error('uhoh!')); } - global.PubSub.subscribe(APP_INIT_ERROR, errorHandler); + subscribe(APP_INIT_ERROR, errorHandler); await initialize({ messages: null, diff --git a/runtime/react/AuthenticatedPageRoute.test.jsx b/runtime/react/AuthenticatedPageRoute.test.jsx index 32aa52e2..06bc937a 100644 --- a/runtime/react/AuthenticatedPageRoute.test.jsx +++ b/runtime/react/AuthenticatedPageRoute.test.jsx @@ -7,7 +7,7 @@ import { getConfig } from '../config'; import AppContext from './AppContext'; import AuthenticatedPageRoute from './AuthenticatedPageRoute'; -jest.mock('../pubSub'); +jest.mock('../subscriptions'); jest.mock('../analytics'); jest.mock('../auth'); diff --git a/runtime/react/hooks.js b/runtime/react/hooks.js index 231cc06a..b7696fc5 100644 --- a/runtime/react/hooks.js +++ b/runtime/react/hooks.js @@ -1,5 +1,7 @@ import { useContext, useEffect } from 'react'; + import { sendTrackEvent } from '../analytics'; +import { subscribe, unsubscribe } from '../subscriptions'; import AppContext from './AppContext'; /** @@ -14,10 +16,10 @@ import AppContext from './AppContext'; */ export const useAppEvent = (type, callback) => { useEffect(() => { - const subscriptionToken = global.PubSub.subscribe(type, callback); + subscribe(type, callback); - return function cleanup() { - global.PubSub.unsubscribe(subscriptionToken); + return () => { + unsubscribe(type, callback); }; }, [callback, type]); }; diff --git a/runtime/react/hooks.test.jsx b/runtime/react/hooks.test.jsx index a7f527b0..fede1d76 100644 --- a/runtime/react/hooks.test.jsx +++ b/runtime/react/hooks.test.jsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react-hooks'; import siteConfig from 'site.config'; import { EnvironmentTypes } from '../../types'; import { sendTrackEvent } from '../analytics'; @@ -82,7 +82,9 @@ describe('useAuthenticatedUser', () => { }); afterEach(() => { - setAuthenticatedUser(null); + act(() => { + setAuthenticatedUser(null); + }); }); it('returns a User when the user exists', () => { diff --git a/runtime/pubSub.js b/runtime/subscriptions.ts similarity index 50% rename from runtime/pubSub.js rename to runtime/subscriptions.ts index 00e5f35d..f55cd750 100644 --- a/runtime/pubSub.js +++ b/runtime/subscriptions.ts @@ -17,10 +17,44 @@ * @module PubSub */ -import PubSub from 'pubsub-js'; +// export const { +// subscribe, +// unsubscribe, +// publish, +// } = PubSub; -export const { - subscribe, - unsubscribe, - publish, -} = PubSub; +type CallbackFunction = (topic: string, data?: any) => void; + +let subscriptions: Record = {}; + +export function subscribe(topic: string, callback) { + if (subscriptions[topic] === undefined) { + subscriptions[topic] = []; + } + subscriptions[topic].push(callback); +} + +export function publish(topic: string, data?: any) { + if (subscriptions[topic] === undefined) { + subscriptions[topic] = []; + } + subscriptions[topic].forEach(callback => { + if (data) { + callback(topic, data); + } else { + callback(topic); + } + }); +} + +export function unsubscribe(topic: string, callback: CallbackFunction) { + if (subscriptions[topic] === undefined) { + subscriptions[topic] = []; + } + + subscriptions[topic] = subscriptions[topic].filter((value) => value !== callback); +} + +export function clearAllSubscriptions() { + subscriptions = {}; +} diff --git a/test-project/package-lock.json b/test-project/package-lock.json index 63f16944..59b8c570 100644 --- a/test-project/package-lock.json +++ b/test-project/package-lock.json @@ -1956,15 +1956,6 @@ "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==", "peer": true }, - "node_modules/@cospired/i18n-iso-languages": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.2.0.tgz", - "integrity": "sha512-vy8cq1176MTxVwB1X9niQjcIYOH29F8Huxtx8hLmT5Uz3l1ztGDGri8KN/4zE7LV2mCT7JrcAoNV/I9yb+lNUw==", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz", @@ -2281,16 +2272,6 @@ } } }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", - "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", - "peer": true, - "dependencies": { - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, "node_modules/@formatjs/fast-memoize": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", @@ -2442,37 +2423,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", - "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@formatjs/intl-pluralrules": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-4.3.3.tgz", - "integrity": "sha512-NLZN8gf2qLpCuc0m565IbKLNUarEGOzk0mkdTkE4XTuNCofzoQTurW6lL3fmDlneAoYl2FiTdHa5q4o2vZF50g==", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, - "node_modules/@formatjs/intl-relativetimeformat": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-10.0.1.tgz", - "integrity": "sha512-AABPQtPjFilXegQsnmVHrSlzjFNUffAEk5DgowY6b7WSwDI7g2W6QgW903/lbZ58emhphAbgHdtKeUBXqTiLpw==", - "peer": true, - "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, "node_modules/@formatjs/intl/node_modules/@formatjs/ecma402-abstract": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", @@ -3686,20 +3636,17 @@ "node_modules/@openedx/frontend-base": { "version": "1.0.0", "resolved": "file:../openedx-frontend-base-1.0.0.tgz", - "integrity": "sha512-2IaRIhfLohx9/vbCgSxWldOW0bZVMa1MOw+VokyVqR3LReUhRVqFZg7pVyto6fxDdTEg8wSOOyBvC4Xnd2zL8g==", + "integrity": "sha512-2DNI3cvYFXyVZk2HTkKp1+gPSbYlJdtelj40/yzh6bCvYkeO0IfKEqOqG1TuYTSnUehonuFvx5vnuTRD9YluCQ==", "peer": true, "dependencies": { "@babel/core": "^7.24.9", "@babel/preset-env": "^7.24.8", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", - "@cospired/i18n-iso-languages": "^4.2.0", "@edx/new-relic-source-map-webpack-plugin": "2.1.0", "@eslint/compat": "^1.2.1", "@eslint/js": "^9.13.0", "@formatjs/cli": "^6.0.3", - "@formatjs/intl-pluralrules": "^4.3.3", - "@formatjs/intl-relativetimeformat": "^10.0.1", "@formatjs/ts-transformer": "^3.13.14", "@module-federation/enhanced": "^0.6.12", "@module-federation/runtime": "^0.6.12", @@ -3733,7 +3680,6 @@ "gradient-string": "^2.0.2", "history": "^4.10.1", "html-webpack-plugin": "5.6.0", - "i18n-iso-countries": "^4.3.1", "identity-obj-proxy": "3.0.0", "image-minimizer-webpack-plugin": "3.8.3", "jest": "^29.7.0", @@ -3752,7 +3698,6 @@ "postcss-loader": "7.3.4", "postcss-rtlcss": "^5.5.0", "prop-types": "^15.8.1", - "pubsub-js": "^1.9.4", "react-dev-utils": "12.0.1", "react-focus-on": "^3.9.4", "react-intl": "^6.6.6", @@ -7354,12 +7299,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, - "node_modules/diacritics": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", - "integrity": "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==", - "peer": true - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -9780,18 +9719,6 @@ "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "peer": true }, - "node_modules/i18n-iso-countries": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-4.3.1.tgz", - "integrity": "sha512-yxeCvmT8yO1p/epv93c1OHnnYNNMOX6NUNpNfuvzSIcDyripS7OGeKXgzYGd5QI31UK+GBrMG0nPFNv0jrHggw==", - "peer": true, - "dependencies": { - "diacritics": "^1.3.0" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -13775,12 +13702,6 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "peer": true }, - "node_modules/pubsub-js": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/pubsub-js/-/pubsub-js-1.9.4.tgz", - "integrity": "sha512-hJYpaDvPH4w8ZX/0Fdf9ma1AwRgU353GfbaVfPjfJQf1KxZ2iHaHl3fAUw1qlJIR5dr4F3RzjGaWohYUEyoh7A==", - "peer": true - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", From d92cea24a78767a2c28bbec0fb802ed2a647b696 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 16:54:07 -0400 Subject: [PATCH 32/75] fix(style): organizing imports --- runtime/i18n/index.js | 24 +++++++++---------- .../initialize.async.function.config.test.js | 3 +-- runtime/initialize.const.config.test.js | 3 +-- runtime/setupTest.js | 1 + 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/runtime/i18n/index.js b/runtime/i18n/index.js index 895d9b21..ee3a71dd 100644 --- a/runtime/i18n/index.js +++ b/runtime/i18n/index.js @@ -84,31 +84,31 @@ */ export { - createIntl, FormattedDate, - FormattedTime, - FormattedRelativeTime, + FormattedMessage, FormattedNumber, FormattedPlural, - FormattedMessage, - defineMessages, + FormattedRelativeTime, + FormattedTime, IntlProvider, - useIntl, + createIntl, + defineMessages, + useIntl } from 'react-intl'; export { - intlShape, + LOCALE_CHANGED, + LOCALE_TOPIC, configure, - getPrimaryLanguageSubtag, getLocale, getMessages, - isRtl, + getPrimaryLanguageSubtag, handleRtl, + intlShape, + isRtl, mergeMessages, - LOCALE_CHANGED, - LOCALE_TOPIC, } from './lib'; export { - default as injectIntl, + default as injectIntl } from './injectIntlWithShim'; diff --git a/runtime/initialize.async.function.config.test.js b/runtime/initialize.async.function.config.test.js index 92ea6232..e8bb479d 100644 --- a/runtime/initialize.async.function.config.test.js +++ b/runtime/initialize.async.function.config.test.js @@ -1,11 +1,10 @@ -import { initialize } from './initialize'; - import { ensureAuthenticatedUser, fetchAuthenticatedUser, hydrateAuthenticatedUser, } from './auth'; import { getConfig } from './config'; +import { initialize } from './initialize'; import { logError, } from './logging'; diff --git a/runtime/initialize.const.config.test.js b/runtime/initialize.const.config.test.js index b26d9f1f..ec0d7fbe 100644 --- a/runtime/initialize.const.config.test.js +++ b/runtime/initialize.const.config.test.js @@ -1,11 +1,10 @@ -import { initialize } from './initialize'; - import { ensureAuthenticatedUser, fetchAuthenticatedUser, hydrateAuthenticatedUser, } from './auth'; import { getConfig } from './config'; +import { initialize } from './initialize'; import { logError, } from './logging'; diff --git a/runtime/setupTest.js b/runtime/setupTest.js index 79798f84..e403484f 100644 --- a/runtime/setupTest.js +++ b/runtime/setupTest.js @@ -1,4 +1,5 @@ import '@testing-library/jest-dom'; + import siteConfig from 'site.config'; import { mergeConfig } from './config'; From 1b0f5b014ff49897f21d09db7aac54e0dac5b3bf Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 17:02:28 -0400 Subject: [PATCH 33/75] feat: adding getLocalizedLanguageName and getSupportedLanguageList functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These functions together provide a list of all the supported languages - their codes and names localized into the native language - for use by a language dropdown menu to be added to the footer. A supported language is one which is present in the ‘messages’ object from the i18n folder. --- index.ts | 2 ++ runtime/i18n/index.js | 2 ++ runtime/i18n/lib.ts | 21 +++++++++++++++++++++ runtime/index.ts | 2 ++ 4 files changed, 27 insertions(+) diff --git a/index.ts b/index.ts index 6c5ed01d..d22bbd2c 100644 --- a/index.ts +++ b/index.ts @@ -58,6 +58,7 @@ export { getHistory, getHttpClient, getLocale, + getLocalizedLanguageName, getLoggingService, getLoginRedirectUrl, getLogoutRedirectUrl, @@ -65,6 +66,7 @@ export { getPath, getPrimaryLanguageSubtag, getQueryParameters, + getSupportedLanguageList, handleRtl, hydrateAuthenticatedUser, identifyAnonymousUser, diff --git a/runtime/i18n/index.js b/runtime/i18n/index.js index ee3a71dd..0a91a610 100644 --- a/runtime/i18n/index.js +++ b/runtime/i18n/index.js @@ -101,8 +101,10 @@ export { LOCALE_TOPIC, configure, getLocale, + getLocalizedLanguageName, getMessages, getPrimaryLanguageSubtag, + getSupportedLanguageList, handleRtl, intlShape, isRtl, diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index 51f02569..aca52be7 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -147,6 +147,27 @@ export function getLocale(locale?: string) { return findSupportedLocale(globalThis.navigator.language.toLowerCase()); } +export function getLocalizedLanguageName(locale) { + const localizedName = (new Intl.DisplayNames([locale], { type: 'language' })).of(locale); + + if (localizedName === undefined) { + throw new Error(`Unsupported locale: ${locale}`); + } + + return `${localizedName.charAt(0).toLocaleUpperCase(locale)}${localizedName.slice(1)}`; +} + +export function getSupportedLanguageList() { + const locales = Object.keys(messages); + locales.push('en'); // 'en' is not in the messages object because it's the default. + locales.sort(); + + return locales.map((locale) => ({ + code: locale, + name: getLocalizedLanguageName(locale), + })); +} + /** * Returns messages for the provided locale, or the user's preferred locale if no argument is * provided. diff --git a/runtime/index.ts b/runtime/index.ts index d2dc5590..f2eb0198 100644 --- a/runtime/index.ts +++ b/runtime/index.ts @@ -65,8 +65,10 @@ export { createIntl, defineMessages, getLocale, + getLocalizedLanguageName, getMessages, getPrimaryLanguageSubtag, + getSupportedLanguageList, handleRtl, injectIntl, intlShape, From 864b63a3b8ecb1a9c1cb83ad0eaeb780a5ad5397 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 17:05:12 -0400 Subject: [PATCH 34/75] feat: adding an updateLocale function to refresh the current locale This function, when called, ensures that the entire system knows that the locale may have changed. This triggers RTL handling, as well as forcing re-render of any React components that depend on the locale in AppContext. --- index.ts | 1 + runtime/i18n/index.js | 1 + runtime/i18n/lib.ts | 6 ++++++ runtime/index.ts | 1 + runtime/react/AppContext.tsx | 2 ++ shell/bootstrap.tsx | 3 +-- shell/footer/default-footer/DefaultFooter.test.tsx | 2 ++ 7 files changed, 14 insertions(+), 2 deletions(-) diff --git a/index.ts b/index.ts index d22bbd2c..6c7ca79c 100644 --- a/index.ts +++ b/index.ts @@ -97,6 +97,7 @@ export { snakeCaseObject, subscribe, unsubscribe, + updateLocale, useAppEvent, useAuthenticatedUser, useConfig, diff --git a/runtime/i18n/index.js b/runtime/i18n/index.js index 0a91a610..25de0368 100644 --- a/runtime/i18n/index.js +++ b/runtime/i18n/index.js @@ -109,6 +109,7 @@ export { intlShape, isRtl, mergeMessages, + updateLocale } from './lib'; export { diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index aca52be7..78f0f407 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -5,6 +5,7 @@ import Cookies from 'universal-cookie'; import { EnvironmentTypes, SiteConfig } from '../../types'; import { LoggingService } from '../logging/types'; +import { publish } from '../subscriptions'; const cookies = new Cookies(); const supportedLocales = [ @@ -168,6 +169,11 @@ export function getSupportedLanguageList() { })); } +export function updateLocale() { + handleRtl(); + publish(LOCALE_CHANGED); +} + /** * Returns messages for the provided locale, or the user's preferred locale if no argument is * provided. diff --git a/runtime/index.ts b/runtime/index.ts index f2eb0198..e6ba00ba 100644 --- a/runtime/index.ts +++ b/runtime/index.ts @@ -74,6 +74,7 @@ export { intlShape, isRtl, mergeMessages, + updateLocale, useIntl } from './i18n'; diff --git a/runtime/react/AppContext.tsx b/runtime/react/AppContext.tsx index cc1c640f..40cdbda5 100644 --- a/runtime/react/AppContext.tsx +++ b/runtime/react/AppContext.tsx @@ -21,9 +21,11 @@ import { getConfig } from '../config'; const AppContext = React.createContext<{ authenticatedUser: User | null, config: SiteConfig, + locale: string, }>({ authenticatedUser: null, config: getConfig(), + locale: 'en', }); export default AppContext; diff --git a/shell/bootstrap.tsx b/shell/bootstrap.tsx index 52d60a2d..bc15256a 100644 --- a/shell/bootstrap.tsx +++ b/shell/bootstrap.tsx @@ -11,10 +11,9 @@ import { import { SHELL_ID } from './data/constants'; import { getFederationRemotes } from './data/moduleUtils'; +import messages from './i18n'; import createRouter from './router/createRouter'; -const messages = []; - subscribe(APP_READY, () => { init({ name: SHELL_ID, diff --git a/shell/footer/default-footer/DefaultFooter.test.tsx b/shell/footer/default-footer/DefaultFooter.test.tsx index 99656689..84b0cc7b 100644 --- a/shell/footer/default-footer/DefaultFooter.test.tsx +++ b/shell/footer/default-footer/DefaultFooter.test.tsx @@ -20,6 +20,7 @@ const FooterWithContext = ({ locale = 'en' }: { locale: string }) => { LOGO_TRADEMARK_URL: siteConfig.LOGO_TRADEMARK_URL, LMS_BASE_URL: siteConfig.LMS_BASE_URL, }, + locale: 'en', }), []); return ( @@ -43,6 +44,7 @@ const FooterWithLanguageSelector = ({ LOGO_TRADEMARK_URL: siteConfig.LOGO_TRADEMARK_URL, LMS_BASE_URL: siteConfig.LMS_BASE_URL, }, + locale: 'en', }), []); return ( From 776e6efe4701791d81b813c3e7850b869f275221 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 17:06:17 -0400 Subject: [PATCH 35/75] docs: adding migration documentation about getSupportedLanguageList Also noting that apps like frontend-app-account need to implement their own country and language lists (for a list of ALL languages, not the supported ones) --- docs/how_tos/migrate-frontend-app.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index 8af91cac..b8df54b7 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -565,8 +565,13 @@ https://react-redux.js.org/using-react-redux/accessing-store#multiple-stores `getLanguageList` has been removed. Modules that need a list of countries should install `@cospired/i18n-iso-languages` as a dependency. +`getSupportedLanguageList` now returns an array of objects containing the `name` and `code` of all the languages that have translations bundled with the app, rather than a hard-coded list. + `getCountryList` has been removed. MFEs that need a list of countries should install `i18n-iso-countries` or `countries-list` as a dependency. +frontend-app-account should use the supported language list from frontend-base, rather than the hard-coded list in https://github.com/openedx/frontend-app-account/blob/master/src/account-settings/site-language/constants.js + +This would help it match the behavior of the footer's language dropdown. ## Removal of pubsub-js From e57b7655c90c933669b1fef25bb75050d8842356 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 17:09:51 -0400 Subject: [PATCH 36/75] fix: modernizing i18n configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit simplifies the arguments to configureI18n by removing config and loggingService - i18n can get those from their published exports, getConfig and getLoggingService. It also removes the list of supportedLocales, which is very edX-centric and doesn’t represent how the platform will be used. Instead, the system looks to see what locales are actually installed in the i18n folder to understand what is supported. The warnings that were produced by unexpected/missing locales have been removed as well. --- docs/how_tos/migrate-frontend-app.md | 4 + runtime/i18n/injectIntlWithShim.jsx | 3 +- runtime/i18n/lib.test.js | 130 --------------------------- runtime/i18n/lib.ts | 85 +----------------- runtime/initialize.test.js | 6 -- runtime/testing/initializeMockApp.js | 2 - shell/i18n/index.js | 2 - shell/i18n/index.ts | 25 ++++++ 8 files changed, 35 insertions(+), 222 deletions(-) delete mode 100644 shell/i18n/index.js create mode 100644 shell/i18n/index.ts diff --git a/docs/how_tos/migrate-frontend-app.md b/docs/how_tos/migrate-frontend-app.md index b8df54b7..700118b1 100644 --- a/docs/how_tos/migrate-frontend-app.md +++ b/docs/how_tos/migrate-frontend-app.md @@ -563,6 +563,10 @@ https://react-redux.js.org/using-react-redux/accessing-store#multiple-stores ## 30. Changes to i81n +configureI18n no longer takes `config` or `loggingService` as options + +The `getLoggingService` export from _i18n_ has also been removed. No one should be using that. + `getLanguageList` has been removed. Modules that need a list of countries should install `@cospired/i18n-iso-languages` as a dependency. `getSupportedLanguageList` now returns an array of objects containing the `name` and `code` of all the languages that have translations bundled with the app, rather than a hard-coded list. diff --git a/runtime/i18n/injectIntlWithShim.jsx b/runtime/i18n/injectIntlWithShim.jsx index 1141b494..b842d4db 100644 --- a/runtime/i18n/injectIntlWithShim.jsx +++ b/runtime/i18n/injectIntlWithShim.jsx @@ -2,7 +2,8 @@ import React from 'react'; import { injectIntl } from 'react-intl'; import { EnvironmentTypes } from '../../types'; import { getConfig } from '../config'; -import { getLoggingService, intlShape } from './lib'; +import { getLoggingService } from '../logging'; +import { intlShape } from './lib'; /** * This function wraps react-intl's injectIntl function in order to add error logging to the intl diff --git a/runtime/i18n/lib.test.js b/runtime/i18n/lib.test.js index 1eb1cef5..0a0175e6 100644 --- a/runtime/i18n/lib.test.js +++ b/runtime/i18n/lib.test.js @@ -1,4 +1,3 @@ -import { EnvironmentTypes } from '../../types'; import { configure, getCookies, @@ -13,90 +12,6 @@ import { jest.mock('universal-cookie'); describe('lib', () => { - describe('configure', () => { - let originalWarn = null; - - beforeEach(() => { - originalWarn = console.warn; - console.warn = jest.fn(); - }); - - afterEach(() => { - console.warn = originalWarn; - }); - - it('should not call console.warn in production', () => { - configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, - messages: { - 'es-419': {}, - de: {}, - 'en-us': {}, - }, - }); - - expect(console.warn).not.toHaveBeenCalled(); - }); - - it('should warn about unexpected locales', () => { - configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.DEVELOPMENT, // turn on warnings! - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, - messages: { - ar: {}, - 'es-419': {}, - fr: {}, - 'zh-cn': {}, - ca: {}, - he: {}, - id: {}, - 'ko-kr': {}, - pl: {}, - 'pt-br': {}, - ru: {}, - th: {}, - uk: {}, - uhoh: {}, // invalid locale - }, - }); - - expect(console.warn).toHaveBeenCalledWith('Unexpected locale: uhoh'); - }); - - it('should warn about missing locales', () => { - configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.DEVELOPMENT, // turn on warnings! - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, - messages: {}, - }); - - expect(console.warn).toHaveBeenCalledTimes(15); - expect(console.warn).toHaveBeenCalledWith('Missing locale: ar'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: es-419'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: fr'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: zh-cn'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: ca'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: he'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: id'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: ko-kr'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: pl'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: pt-br'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: ru'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: th'); - expect(console.warn).toHaveBeenCalledWith('Missing locale: uk'); - }); - }); - describe('getPrimaryLanguageSubtag', () => { it('should work for primary language subtags', () => { expect(getPrimaryLanguageSubtag('en')).toEqual('en'); @@ -114,11 +29,6 @@ describe('lib', () => { describe('getLocale', () => { beforeEach(() => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { 'es-419': {}, de: {}, @@ -159,11 +69,6 @@ describe('lib', () => { describe('getMessages', () => { beforeEach(() => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { 'es-419': { message: 'es-hah' }, de: { message: 'de-hah' }, @@ -216,11 +121,6 @@ describe('lib', () => { it('should do the right thing for non-RTL languages', () => { getCookies().get = jest.fn(() => 'es-419'); configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { 'es-419': { message: 'es-hah' }, }, @@ -233,11 +133,6 @@ describe('lib', () => { it('should do the right thing for RTL languages', () => { getCookies().get = jest.fn(() => 'ar'); configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { ar: { message: 'ar-hah' }, }, @@ -252,11 +147,6 @@ describe('lib', () => { describe('mergeMessages', () => { it('should merge objects', () => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { ar: { message: 'ar-hah' }, }, @@ -272,11 +162,6 @@ describe('mergeMessages', () => { it('should merge objects from an array', () => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { ar: { message: 'ar-hah' }, }, @@ -292,11 +177,6 @@ describe('mergeMessages', () => { it('should merge nested objects from an array', () => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { en: { init: 'initial' }, es: { init: 'inicial' }, @@ -330,11 +210,6 @@ describe('mergeMessages', () => { it('should return an empty object if no messages', () => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: {}, }); expect(mergeMessages(undefined)).toEqual({}); @@ -345,11 +220,6 @@ describe('mergeMessages', () => { it('should return the original object if no messages', () => { configure({ - loggingService: { logError: jest.fn() }, - config: { - ENVIRONMENT: EnvironmentTypes.PRODUCTION, - LANGUAGE_PREFERENCE_COOKIE_NAME: 'yum', - }, messages: { en: { hello: 'world ' } }, }); expect(mergeMessages(undefined)).toEqual({ en: { hello: 'world ' } }); diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index 78f0f407..3203454a 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -3,29 +3,10 @@ import PropTypes from 'prop-types'; import { MessageFormatElement } from 'react-intl'; import Cookies from 'universal-cookie'; -import { EnvironmentTypes, SiteConfig } from '../../types'; -import { LoggingService } from '../logging/types'; +import { getConfig } from '../config'; import { publish } from '../subscriptions'; const cookies = new Cookies(); -const supportedLocales = [ - 'ar', // Arabic - // NOTE: 'en' is not included in this list intentionally, since it's the fallback. - 'es-419', // Spanish, Latin American - 'fa', // Farsi - 'fa-ir', // Farsi, Iran - 'fr', // French - 'zh-cn', // Chinese, Simplified - 'ca', // Catalan - 'he', // Hebrew - 'id', // Indonesian - 'ko-kr', // Korean (Korea) - 'pl', // Polish - 'pt-br', // Portuguese (Brazil) - 'ru', // Russian - 'th', // Thai - 'uk', // Ukrainian -]; const rtlLocales = [ 'ar', // Arabic 'he', // Hebrew @@ -34,8 +15,6 @@ const rtlLocales = [ 'ur', // Urdu (not currently supported) ]; -let config: SiteConfig | null = null; -let loggingService: LoggingService | null = null; let messages: Record | Record | undefined>; /** @@ -50,13 +29,6 @@ let messages: Record | Record loggingService; - /** * @memberof module:Internationalization */ @@ -127,7 +99,7 @@ export function findSupportedLocale(locale) { * @memberof module:Internationalization */ export function getLocale(locale?: string) { - if (messages === null || config === null) { + if (messages === null) { throw new Error('getLocale called before configuring i18n. Call configure with messages first.'); } @@ -136,8 +108,8 @@ export function getLocale(locale?: string) { return findSupportedLocale(locale); } // 2. User setting in cookie - const cookieLangPref = cookies - .get(config.LANGUAGE_PREFERENCE_COOKIE_NAME); + + const cookieLangPref = cookies.get(getConfig().LANGUAGE_PREFERENCE_COOKIE_NAME); if (cookieLangPref) { return findSupportedLocale(cookieLangPref.toLowerCase()); } @@ -213,34 +185,6 @@ export function handleRtl() { } } -const messagesShape = { - ar: PropTypes.objectOf(PropTypes.string), // Arabic - en: PropTypes.objectOf(PropTypes.string), - 'es-419': PropTypes.objectOf(PropTypes.string), // Spanish, Latin American - fr: PropTypes.objectOf(PropTypes.string), // French - 'zh-cn': PropTypes.objectOf(PropTypes.string), // Chinese, Simplified - ca: PropTypes.objectOf(PropTypes.string), // Catalan - he: PropTypes.objectOf(PropTypes.string), // Hebrew - id: PropTypes.objectOf(PropTypes.string), // Indonesian - 'ko-kr': PropTypes.objectOf(PropTypes.string), // Korean (Korea) - pl: PropTypes.objectOf(PropTypes.string), // Polish - 'pt-br': PropTypes.objectOf(PropTypes.string), // Portuguese (Brazil) - ru: PropTypes.objectOf(PropTypes.string), // Russian - th: PropTypes.objectOf(PropTypes.string), // Thai - uk: PropTypes.objectOf(PropTypes.string), // Ukrainian -}; - -const optionsShape = { - config: PropTypes.object.isRequired, - loggingService: PropTypes.shape({ - logError: PropTypes.func.isRequired, - }).isRequired, - messages: PropTypes.oneOfType([ - PropTypes.shape(messagesShape), - PropTypes.arrayOf(PropTypes.shape(messagesShape)), - ]).isRequired, -}; - /** * * @@ -256,9 +200,7 @@ export function mergeMessages(newMessages) { } interface ConfigureI18nOptions { - loggingService: LoggingService, messages: Record>[] | Record>, - config: SiteConfig, } /** @@ -268,30 +210,11 @@ interface ConfigureI18nOptions { * above), or if an expected locale is not provided. * * @param {Object} options - * @param {LoggingService} options.loggingService - * @param {Object} options.config * @param {Object} options.messages * @memberof module:Internationalization */ export function configure(options: ConfigureI18nOptions) { - PropTypes.checkPropTypes(optionsShape, options, 'property', 'i18n'); - loggingService = options.loggingService; - config = options.config; messages = Array.isArray(options.messages) ? merge({}, ...options.messages) : options.messages; - if (config.ENVIRONMENT === EnvironmentTypes.DEVELOPMENT && messages !== undefined) { - Object.keys(messages).forEach((key) => { - if (!supportedLocales.includes(key)) { - console.warn(`Unexpected locale: ${key}`); - } - }); - - supportedLocales.forEach((key) => { - if (messages?.[key] === undefined) { - console.warn(`Missing locale: ${key}`); - } - }); - } - handleRtl(); } diff --git a/runtime/initialize.test.js b/runtime/initialize.test.js index 83e20117..c6f8d66d 100644 --- a/runtime/initialize.test.js +++ b/runtime/initialize.test.js @@ -131,8 +131,6 @@ describe('initialize', () => { }); expect(configureI18n).toHaveBeenCalledWith({ messages, - config, - loggingService: getLoggingService(), }); expect(fetchAuthenticatedUser).toHaveBeenCalled(); expect(ensureAuthenticatedUser).not.toHaveBeenCalled(); @@ -312,8 +310,6 @@ describe('initialize', () => { }); expect(configureI18n).toHaveBeenCalledWith({ messages, - config, - loggingService: getLoggingService(), }); expect(fetchAuthenticatedUser).toHaveBeenCalled(); @@ -365,8 +361,6 @@ describe('initialize', () => { }); expect(configureI18n).toHaveBeenCalledWith({ messages, - config, - loggingService: getLoggingService(), }); expect(fetchAuthenticatedUser).toHaveBeenCalled(); expect(ensureAuthenticatedUser).not.toHaveBeenCalled(); diff --git a/runtime/testing/initializeMockApp.js b/runtime/testing/initializeMockApp.js index 30e70b5c..c4eeb13c 100644 --- a/runtime/testing/initializeMockApp.js +++ b/runtime/testing/initializeMockApp.js @@ -70,8 +70,6 @@ export default function initializeMockApp({ // The i18n service configure function has no return value, since there isn't a service class. configureI18n({ - config: getConfig(), - loggingService, messages, }); diff --git a/shell/i18n/index.js b/shell/i18n/index.js deleted file mode 100644 index a47eb5b0..00000000 --- a/shell/i18n/index.js +++ /dev/null @@ -1,2 +0,0 @@ -// Placeholder be overridden by `make pull_translations` -export default []; diff --git a/shell/i18n/index.ts b/shell/i18n/index.ts new file mode 100644 index 00000000..883a77a4 --- /dev/null +++ b/shell/i18n/index.ts @@ -0,0 +1,25 @@ +// Placeholder be overridden by `make pull_translations` +export default { + ar: {}, + 'zh-hk': {}, + 'zh-cn': {}, + uk: {}, + 'tr-tr': {}, + th: {}, + te: {}, + ru: {}, + 'pt-pt': {}, + 'pt-br': {}, + 'it-it': {}, + id: {}, + hi: {}, + he: {}, + 'fr-ca': {}, + fa: {}, + 'es-es': {}, + 'es-419': {}, + el: {}, + 'de-de': {}, + da: {}, + bo: {}, +}; From 60f99cc1593b4ded214415e047d8ce4f870e7946 Mon Sep 17 00:00:00 2001 From: David Joy Date: Thu, 31 Oct 2024 17:10:37 -0400 Subject: [PATCH 37/75] feat: expanding list of RTL languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There’s no way to programmatically get a list of RTL languages, but I was able to find one online (referenced in the code) and have updated our list to be much more accurate. --- runtime/i18n/lib.ts | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/runtime/i18n/lib.ts b/runtime/i18n/lib.ts index 3203454a..667fbf4e 100644 --- a/runtime/i18n/lib.ts +++ b/runtime/i18n/lib.ts @@ -7,12 +7,45 @@ import { getConfig } from '../config'; import { publish } from '../subscriptions'; const cookies = new Cookies(); + +// This list is based on https://help.smartling.com/hc/en-us/articles/1260802028830-Right-to-left-RTL-Languages +// There are very few resources available online outlining the locale codes for RTL languages; +// If this list is inaccurate, we should change it. const rtlLocales = [ - 'ar', // Arabic - 'he', // Hebrew - 'fa', // Farsi (not currently supported) - 'fa-ir', // Farsi Iran - 'ur', // Urdu (not currently supported) + 'ar', // Arabic (International) + 'ar-ae', // Arabic (United Arab Emirates) + 'ar-bh', // Arabic (Bahrain) + 'ar-dj', // Arabic (Djibouti) + 'ar-dz', // Arabic (Algeria) + 'ar-eg', // Arabic (Egypt) + 'ar-iq', // Arabic (Iraq) + 'ar-jo', // Arabic (Jordan) + 'ar-kw', // Arabic (Kuwait) + 'ar-lb', // Arabic (Lebanon) + 'ar-ly', // Arabic (Libya) + 'ar-ma', // Arabic (Morocco) + 'ar-om', // Arabic (Oman) + 'ar-qa', // Arabic (Qatar) + 'ar-sa', // Arabic (Saudi Arabia) + 'ar-sd', // Arabic (Sudan) + 'ar-sy', // Arabic (Syria) + 'ar-tn', // Arabic (Tunisia) + 'ar-ye', // Arabic (Yemen) + 'fa', // Persian + 'fa-af', // Dari/Persian (Afghanistan) + 'fa-ir', // Persian (Iran) + 'he', // Hebrew (he) + 'he-il', // Hebrew + 'iw', // Hebrew (iw) + 'kd', // Kurdish (Sorani) RTL + 'pk-pk', // Panjabi-Shahmuki (Pakistan) + 'ps', // Pushto; Pashto + 'ug', // Uighur; Uyghur + 'ur', // Urdu + 'ur-in', // Urdu (India) + 'ur-pk', // Urdu (Pakistan) + 'yi', // Yiddish + 'yi-us', // Yiddish (United States) ]; let messages: Record | Record | undefined>; From 729f9c9df64abd5445fca754c9646377183e2c32 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 11:08:46 -0400 Subject: [PATCH 38/75] feat: adding a new footer to replace frontend-component-footer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds a new, configurable footer. - Logo and Language Menu placement are configurable. - Logo and its link are configurable or can be replaced completely. - Language menu is fully functional by default, talks to edx-platform to set the locale, and displays the correct set of languages based on the translations bundled with the app from Atlas. - Links in the middle are completely configurable to 0 or more columns with or without headers. Disappear if not used. - Button on the horizontal rule and what it reveals are completely configurable and disappear if not used. - Copyright statement is configurable, trademark statement is not. - “Powered By" logo is not configurable. - Will contain plugin slots at various levels so if you want something completely different somewhere, you just override that part. The shell exports the components it uses by default so they can be included in your custom code. --- shell/Shell.messages.ts | 7 +- shell/Shell.tsx | 4 +- shell/footer/ActiveFooter.tsx | 30 ------- shell/footer/index.ts | 3 - shell/footer/new-footer/CenterLinks.tsx | 11 +++ shell/footer/new-footer/CopyrightNotice.tsx | 37 +++++++++ shell/footer/new-footer/Footer.tsx | 39 +++++++++ shell/footer/new-footer/FooterContext.tsx | 14 ++++ shell/footer/new-footer/LanguageMenu.tsx | 35 ++++++++ shell/footer/new-footer/LanguageMenuItem.tsx | 22 +++++ shell/footer/new-footer/LeftLinks.tsx | 17 ++++ shell/footer/new-footer/LegalNotices.tsx | 18 +++++ shell/footer/new-footer/LinkGrid.tsx | 22 +++++ shell/footer/new-footer/LinkGridItem.tsx | 49 ++++++++++++ shell/footer/new-footer/LinkRowItem.tsx | 50 ++++++++++++ shell/footer/new-footer/Logo.tsx | 21 +++++ shell/footer/new-footer/PoweredBy.tsx | 16 ++++ shell/footer/new-footer/RevealLinks.tsx | 46 +++++++++++ shell/footer/new-footer/RightLinks.tsx | 17 ++++ shell/footer/new-footer/data/api.ts | 43 ++++++++++ shell/footer/new-footer/data/hooks.ts | 17 ++++ shell/footer/new-footer/data/utils.ts | 60 ++++++++++++++ shell/footer/new-footer/defaults.tsx | 18 +++++ shell/site.config.dev.shell.tsx | 84 ++++++++++++++++++++ types.ts | 33 +++++++- 25 files changed, 676 insertions(+), 37 deletions(-) delete mode 100644 shell/footer/ActiveFooter.tsx delete mode 100644 shell/footer/index.ts create mode 100644 shell/footer/new-footer/CenterLinks.tsx create mode 100644 shell/footer/new-footer/CopyrightNotice.tsx create mode 100644 shell/footer/new-footer/Footer.tsx create mode 100644 shell/footer/new-footer/FooterContext.tsx create mode 100644 shell/footer/new-footer/LanguageMenu.tsx create mode 100644 shell/footer/new-footer/LanguageMenuItem.tsx create mode 100644 shell/footer/new-footer/LeftLinks.tsx create mode 100644 shell/footer/new-footer/LegalNotices.tsx create mode 100644 shell/footer/new-footer/LinkGrid.tsx create mode 100644 shell/footer/new-footer/LinkGridItem.tsx create mode 100644 shell/footer/new-footer/LinkRowItem.tsx create mode 100644 shell/footer/new-footer/Logo.tsx create mode 100644 shell/footer/new-footer/PoweredBy.tsx create mode 100644 shell/footer/new-footer/RevealLinks.tsx create mode 100644 shell/footer/new-footer/RightLinks.tsx create mode 100644 shell/footer/new-footer/data/api.ts create mode 100644 shell/footer/new-footer/data/hooks.ts create mode 100644 shell/footer/new-footer/data/utils.ts create mode 100644 shell/footer/new-footer/defaults.tsx diff --git a/shell/Shell.messages.ts b/shell/Shell.messages.ts index d0f37283..74284893 100644 --- a/shell/Shell.messages.ts +++ b/shell/Shell.messages.ts @@ -44,7 +44,12 @@ const messages = defineMessages({ footerPoweredBy: { id: 'footer.powered.by', defaultMessage: 'Powered by Open edX', - description: 'Alt text for the \'Powered by Open edX\' logo displayed in the footer', + description: 'Alt text for the \'Powered by Open edX\' logo displayed in the footer.', + }, + footerTrademarkNotice: { + id: 'footer.trademark.notice', + defaultMessage: 'edX and Open edX are registered trademarks of edX LLC.', + description: 'A legal notice that "edX LLC" owns the trademarks on "edX" and "Open edX". Please do not translate these three proper names.' } }); diff --git a/shell/Shell.tsx b/shell/Shell.tsx index 9801154f..486a03c8 100644 --- a/shell/Shell.tsx +++ b/shell/Shell.tsx @@ -4,7 +4,7 @@ import { AppProvider, PluginSlot } from '../runtime'; -import ActiveFooter from './footer'; +import Footer from './footer/new-footer/Footer'; import Header from './header/Header'; export default function Shell() { @@ -23,7 +23,7 @@ export default function Shell() {
- +
diff --git a/shell/footer/ActiveFooter.tsx b/shell/footer/ActiveFooter.tsx deleted file mode 100644 index 637156e7..00000000 --- a/shell/footer/ActiveFooter.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { - lazy, Suspense -} from 'react'; -import { FooterTypes } from '../../types'; -import useActiveFooterId from './data/hooks'; - -const LazyDefaultFooter = lazy(() => import('./default-footer')); -const LazyStudioFooter = lazy(() => import('./studio-footer')); - -export default function ActiveFooter() { - const activeFooterId = useActiveFooterId(); - - let lazyFooter: React.ReactNode = null; - - if (activeFooterId === FooterTypes.DEFAULT) { - lazyFooter = ; - } - if (activeFooterId === FooterTypes.STUDIO) { - lazyFooter = ; - } - - // TODO: Allow for extensible footers provided by modules. - - // TODO: Improve suspense fallback. - return ( - Loading footer...}> - {lazyFooter} - - ); -} diff --git a/shell/footer/index.ts b/shell/footer/index.ts deleted file mode 100644 index 80bd9eed..00000000 --- a/shell/footer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ActiveFooter from './ActiveFooter'; - -export default ActiveFooter; diff --git a/shell/footer/new-footer/CenterLinks.tsx b/shell/footer/new-footer/CenterLinks.tsx new file mode 100644 index 00000000..aea097da --- /dev/null +++ b/shell/footer/new-footer/CenterLinks.tsx @@ -0,0 +1,11 @@ +import { useContext } from 'react'; +import FooterContext from './FooterContext'; +import LinkGrid from './LinkGrid'; + +export default function CenterLinks() { + const { centerLinks } = useContext(FooterContext); + + return ( + + ); +} diff --git a/shell/footer/new-footer/CopyrightNotice.tsx b/shell/footer/new-footer/CopyrightNotice.tsx new file mode 100644 index 00000000..ca089f4a --- /dev/null +++ b/shell/footer/new-footer/CopyrightNotice.tsx @@ -0,0 +1,37 @@ +import { Hyperlink } from '@openedx/paragon'; +import { useConfig } from '../../../runtime'; + +interface CopyrightNoticeProps { + title?: string, + /** + * The URL that the copyright notice should link to when a user clicks on the title. A destination of `null` means the title should not be a link. + * + * @default SiteConfig.MARKETING_SITE_BASE_URL + */ + destination?: string | null, +} + +export default function CopyrightNotice({ title, destination }: CopyrightNoticeProps) { + const config = useConfig(); + + // Allow overrides via props and fallback to defaults. + const finalTitle = title ?? config.SITE_NAME; + // If destination has explicitly been set to 'null', that means no link. + const finalDestination = destination !== undefined ? destination : config.MARKETING_SITE_BASE_URL; + return ( + + © {new Date().getFullYear()}  + {finalDestination !== null ? ( + + {finalTitle} + + ) : ( + {finalTitle} + )} + . + + ); +} diff --git a/shell/footer/new-footer/Footer.tsx b/shell/footer/new-footer/Footer.tsx new file mode 100644 index 00000000..f50fd0b4 --- /dev/null +++ b/shell/footer/new-footer/Footer.tsx @@ -0,0 +1,39 @@ +import CenterLinks from './CenterLinks'; +import useResolvedFooterConfig from './data/hooks'; +import FooterContext from './FooterContext'; +import LeftLinks from './LeftLinks'; +import LegalNotices from './LegalNotices'; +import PoweredBy from './PoweredBy'; +import RevealLinks from './RevealLinks'; +import RightLinks from './RightLinks'; + +export default function Footer() { + const resolvedFooterConfig = useResolvedFooterConfig(); + + return ( + +
+ +
+
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ ); +} diff --git a/shell/footer/new-footer/FooterContext.tsx b/shell/footer/new-footer/FooterContext.tsx new file mode 100644 index 00000000..d097b440 --- /dev/null +++ b/shell/footer/new-footer/FooterContext.tsx @@ -0,0 +1,14 @@ +import { createContext } from 'react'; +import { ResolvedFooterConfig } from '../../../types'; + +const FooterContext = createContext({ + logoUrl: '', + logoDestinationUrl: '', + leftLinks: [], + centerLinks: [], + rightLinks: [], + revealMenu: undefined, + copyrightNotice: undefined, +}); + +export default FooterContext; diff --git a/shell/footer/new-footer/LanguageMenu.tsx b/shell/footer/new-footer/LanguageMenu.tsx new file mode 100644 index 00000000..5caae53b --- /dev/null +++ b/shell/footer/new-footer/LanguageMenu.tsx @@ -0,0 +1,35 @@ +import { Dropdown } from '@openedx/paragon'; +import { useContext } from 'react'; + +import { + AppContext, + getLocalizedLanguageName, + getSupportedLanguageList +} from '../../../runtime'; + +import LanguageMenuItem from './LanguageMenuItem'; + +export default function LanguageMenu() { + const { locale } = useContext(AppContext); + + const languages = getSupportedLanguageList(); + const currentLanguageName = getLocalizedLanguageName(locale); + + // Hide the menu if there's only one language. + if (languages.length === 1) { + return null; + } + + return ( + + + {currentLanguageName} + + + {languages.map((language) => ( + + ))} + + + ); +} diff --git a/shell/footer/new-footer/LanguageMenuItem.tsx b/shell/footer/new-footer/LanguageMenuItem.tsx new file mode 100644 index 00000000..f7f6d7e4 --- /dev/null +++ b/shell/footer/new-footer/LanguageMenuItem.tsx @@ -0,0 +1,22 @@ +import { Dropdown } from '@openedx/paragon'; +import { useCallback } from 'react'; +import { updateSiteLanguage } from './data/api'; + +interface LanguageMenuItemProps { + language: { + code: string, + name: string, + }, +} + +export default function LanguageMenuItem({ language }: LanguageMenuItemProps) { + const handleClick = useCallback(() => { + updateSiteLanguage(language.code); + }, [language.code]); + + return ( + + {language.name} + + ); +} diff --git a/shell/footer/new-footer/LeftLinks.tsx b/shell/footer/new-footer/LeftLinks.tsx new file mode 100644 index 00000000..2d03f99e --- /dev/null +++ b/shell/footer/new-footer/LeftLinks.tsx @@ -0,0 +1,17 @@ +import { useContext } from 'react'; +import FooterContext from './FooterContext'; +import LinkRowItem from './LinkRowItem'; + +export default function LeftLinks() { + const { leftLinks } = useContext(FooterContext); + + return ( +
+ {leftLinks.map((item, index) => ( + // TODO: Do something better than using the array index here. + // eslint-disable-next-line react/no-array-index-key + + ))} +
+ ); +} diff --git a/shell/footer/new-footer/LegalNotices.tsx b/shell/footer/new-footer/LegalNotices.tsx new file mode 100644 index 00000000..41ae29dc --- /dev/null +++ b/shell/footer/new-footer/LegalNotices.tsx @@ -0,0 +1,18 @@ +import { useContext } from 'react'; +import { useIntl } from 'react-intl'; + +import messages from '../../Shell.messages'; +import FooterContext from './FooterContext'; + +export default function LegalNotices() { + const intl = useIntl(); + const { copyrightNotice } = useContext(FooterContext); + + return ( +
+ {copyrightNotice}  + {/* This footer trademark notice is a legal requirement and cannot be removed or modified. */} + {intl.formatMessage(messages.footerTrademarkNotice)} +
+ ); +} diff --git a/shell/footer/new-footer/LinkGrid.tsx b/shell/footer/new-footer/LinkGrid.tsx new file mode 100644 index 00000000..08956ce2 --- /dev/null +++ b/shell/footer/new-footer/LinkGrid.tsx @@ -0,0 +1,22 @@ +// TODO: Do something better than using the array index here. +/* eslint-disable react/no-array-index-key */ +import { LabeledMenu } from '../../../types'; +import LinkGridItem from './LinkGridItem'; + +interface LinkGridProps { + items: LabeledMenu[], +} +export default function LinkGrid({ items }: LinkGridProps) { + return ( +
+ {items.map((menu, subItemsIndex) => ( +
+
{menu.label}
+ {menu.links.map((item, index) => ( + + ))} +
+ ))} +
+ ); +} diff --git a/shell/footer/new-footer/LinkGridItem.tsx b/shell/footer/new-footer/LinkGridItem.tsx new file mode 100644 index 00000000..361cd72f --- /dev/null +++ b/shell/footer/new-footer/LinkGridItem.tsx @@ -0,0 +1,49 @@ +import { Hyperlink } from '@openedx/paragon'; +import { useIntl } from 'react-intl'; +import { getAppUrl } from '../../../runtime/routing'; +import { + ChildMenuItem +} from '../../../types'; +import { + getItemLabel, isAppMenuItem, + isReactNodeMenuItem, isUrlMenuItem +} from '../../header/data/utils'; + +interface NavLinksItemProps { + item: ChildMenuItem, +} + +export default function LinkGridItem({ item }: NavLinksItemProps) { + const intl = useIntl(); + + if (isReactNodeMenuItem(item)) { + return item; + } + if (isAppMenuItem(item)) { + const url = getAppUrl(item.appId); + // If the app in question is not loaded, then the url may be null. If this is the case, + // we just don't bother to try to show the link. This helps us keep configuration logic + // simpler. + if (url !== null) { + const label = getItemLabel(item, intl); + return ( + + {label} + + ); + } + return null; + } + if (isUrlMenuItem(item)) { + const label = getItemLabel(item, intl); + return ( + + {label} + + ); + } + + // If the item is something we haven't accounted for above, we don't know + // how to display it here. Just return null. + return null; +} diff --git a/shell/footer/new-footer/LinkRowItem.tsx b/shell/footer/new-footer/LinkRowItem.tsx new file mode 100644 index 00000000..f39598de --- /dev/null +++ b/shell/footer/new-footer/LinkRowItem.tsx @@ -0,0 +1,50 @@ +import { Hyperlink } from '@openedx/paragon'; +import { useIntl } from 'react-intl'; +import { getAppUrl } from '../../../runtime/routing'; +import { + ChildMenuItem +} from '../../../types'; +import { + getItemLabel, + isAppMenuItem, + isReactNodeMenuItem, + isUrlMenuItem +} from '../../header/data/utils'; + +interface LinkRowItemProps { + item: ChildMenuItem, +} + +export default function LinkRowItem({ item }: LinkRowItemProps) { + const intl = useIntl(); + + if (isReactNodeMenuItem(item)) { + return item; + } + if (isAppMenuItem(item)) { + const url = getAppUrl(item.appId); + // If the app in question is not loaded, then the url may be null. If this is the case, + // we just don't bother to try to show the link. This helps us keep configuration logic + // simpler. + if (url !== null) { + const label = getItemLabel(item, intl); + return ( + + {label} + + ); + } + return null; + } + if (isUrlMenuItem(item)) { + const label = getItemLabel(item, intl); + return ( + + {label} + + ); + } + // If the item is something we haven't accounted for above, we don't know + // how to display it here. Just return null. + return null; +} diff --git a/shell/footer/new-footer/Logo.tsx b/shell/footer/new-footer/Logo.tsx new file mode 100644 index 00000000..0d239bf0 --- /dev/null +++ b/shell/footer/new-footer/Logo.tsx @@ -0,0 +1,21 @@ +import { Hyperlink, Image } from '@openedx/paragon'; +import { useContext } from 'react'; +import FooterContext from './FooterContext'; + +export default function Logo() { + const { logoDestinationUrl, logoUrl } = useContext(FooterContext); + + const image = ( + + ); + + if (logoDestinationUrl === null) { + return image; + } + + return ( + + {image} + + ); +} diff --git a/shell/footer/new-footer/PoweredBy.tsx b/shell/footer/new-footer/PoweredBy.tsx new file mode 100644 index 00000000..56e64d9e --- /dev/null +++ b/shell/footer/new-footer/PoweredBy.tsx @@ -0,0 +1,16 @@ +import { Hyperlink, Image } from '@openedx/paragon'; +import { useIntl } from 'react-intl'; +import messages from '../../Shell.messages'; + +export default function PoweredBy() { + const intl = useIntl(); + return ( + + {intl.formatMessage(messages.footerPoweredBy)} + + ); +} diff --git a/shell/footer/new-footer/RevealLinks.tsx b/shell/footer/new-footer/RevealLinks.tsx new file mode 100644 index 00000000..3d01ce46 --- /dev/null +++ b/shell/footer/new-footer/RevealLinks.tsx @@ -0,0 +1,46 @@ +import { Button, Collapsible } from '@openedx/paragon'; +import { ExpandLess, ExpandMore } from '@openedx/paragon/icons'; +import { useContext } from 'react'; +import FooterContext from './FooterContext'; +import LinkRowItem from './LinkRowItem'; + +export default function RevealLinks() { + const { revealMenu } = useContext(FooterContext); + + if (revealMenu === undefined) { + return ( +
+ ); + } + + const { label, links } = revealMenu; + + return ( + +
+
+ + + +
+
+ +
+ {links.map((item, index) => ( + // TODO: Do something better than using the array index here. + // eslint-disable-next-line react/no-array-index-key + + ))} +
+
+ + ); +} diff --git a/shell/footer/new-footer/RightLinks.tsx b/shell/footer/new-footer/RightLinks.tsx new file mode 100644 index 00000000..dc64fec9 --- /dev/null +++ b/shell/footer/new-footer/RightLinks.tsx @@ -0,0 +1,17 @@ +import { useContext } from 'react'; +import FooterContext from './FooterContext'; +import LinkRowItem from './LinkRowItem'; + +export default function RightLinks() { + const { rightLinks } = useContext(FooterContext); + + return ( +
+ {rightLinks.map((item, index) => ( + // TODO: Do something better than using the array index here. + // eslint-disable-next-line react/no-array-index-key + + ))} +
+ ); +} diff --git a/shell/footer/new-footer/data/api.ts b/shell/footer/new-footer/data/api.ts new file mode 100644 index 00000000..bc701283 --- /dev/null +++ b/shell/footer/new-footer/data/api.ts @@ -0,0 +1,43 @@ +import { getAuthenticatedHttpClient, getAuthenticatedUser, getConfig, updateLocale } from '../../../../runtime'; + +export async function updateSiteLanguage(locale: string) { + const user = getAuthenticatedUser(); + + if (user !== null) { + const { username } = getAuthenticatedUser(); + await patchUserPreferences(username, locale); + } + await postSetlang(locale); + + updateLocale(); +} + +async function patchUserPreferences(username: string, locale: string) { + await getAuthenticatedHttpClient().patch( + `${getConfig().LMS_BASE_URL}/api/user/v1/preferences/${username}`, + { + 'pref-lang': locale + }, + { + headers: { + 'Content-Type': 'application/merge-patch+json' + }, + } + ); +} + +async function postSetlang(locale: string) { + const formData = new FormData(); + formData.append('language', locale); + + await getAuthenticatedHttpClient().post( + `${getConfig().LMS_BASE_URL}/i18n/setlang/`, + formData, + { + headers: { + Accept: 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + }, + } + ); +} diff --git a/shell/footer/new-footer/data/hooks.ts b/shell/footer/new-footer/data/hooks.ts new file mode 100644 index 00000000..d624670e --- /dev/null +++ b/shell/footer/new-footer/data/hooks.ts @@ -0,0 +1,17 @@ +import { useEffect, useState } from 'react'; +import { ResolvedFooterConfig } from '../../../../types'; +import { useActiveAppId } from '../../../data/hooks'; +import { resolveFooterConfig } from './utils'; + +export default function useResolvedFooterConfig() { + const appId = useActiveAppId(); + + const [config, setConfig] = useState(resolveFooterConfig(appId)); + + useEffect(() => { + const footerConfig = resolveFooterConfig(appId); + setConfig(footerConfig); + }, [appId]); + + return config; +} diff --git a/shell/footer/new-footer/data/utils.ts b/shell/footer/new-footer/data/utils.ts new file mode 100644 index 00000000..418e8f29 --- /dev/null +++ b/shell/footer/new-footer/data/utils.ts @@ -0,0 +1,60 @@ +import { getConfig } from '../../../../runtime'; +import { getAppUrl } from '../../../../runtime/routing'; +import { + ConfigurableAppConfig, FooterConfig, ResolvedFooterConfig +} from '../../../../types'; +import isConfigurableApp from '../../../data/isConfigurableApp'; +import { centerLinks, copyrightNotice, leftLinks, revealMenu, rightLinks } from '../defaults'; + +function overrideFooterConfig(base: ResolvedFooterConfig, override: FooterConfig) { + if (override.logoUrl !== undefined) { + base.logoUrl = override.logoUrl; + } + if (override.logoDestinationUrl !== undefined) { + base.logoDestinationUrl = override.logoDestinationUrl; + } + if (override.leftLinks !== undefined) { + base.leftLinks = override.leftLinks; + } + if (override.centerLinks !== undefined) { + base.centerLinks = override.centerLinks; + } + if (override.rightLinks !== undefined) { + base.rightLinks = override.rightLinks; + } + if (override.revealMenu !== undefined) { + base.revealMenu = override.revealMenu; + } + if (override.copyrightNotice !== undefined) { + base.copyrightNotice = override.copyrightNotice; + } +} + +export function resolveFooterConfig(appId: string | null): ResolvedFooterConfig { + const siteConfig = getConfig(); + + const config: ResolvedFooterConfig = { + logoUrl: siteConfig.LOGO_URL, + logoDestinationUrl: getAppUrl('learner-dashboard'), + leftLinks, + centerLinks, + rightLinks, + revealMenu, + copyrightNotice, + }; + + if (siteConfig.footer !== undefined) { + const { footer } = siteConfig; + + overrideFooterConfig(config, footer); + } + + if (isConfigurableApp(appId)) { + const { config: appModuleConfig } = siteConfig.apps[appId] as ConfigurableAppConfig; + if (appModuleConfig.footer !== undefined) { + overrideFooterConfig(config, appModuleConfig.footer); + } + } + + return config; +} diff --git a/shell/footer/new-footer/defaults.tsx b/shell/footer/new-footer/defaults.tsx new file mode 100644 index 00000000..427bfec9 --- /dev/null +++ b/shell/footer/new-footer/defaults.tsx @@ -0,0 +1,18 @@ +import { ChildMenuItem, LabeledMenu } from '../../../types'; +import CopyrightNotice from './CopyrightNotice'; +import LanguageMenu from './LanguageMenu'; +import Logo from './Logo'; + +export const rightLinks: ChildMenuItem[] = [ + , +]; + +export const centerLinks: LabeledMenu[] = []; + +export const leftLinks: ChildMenuItem[] = [ + +]; + +export const revealMenu = undefined; + +export const copyrightNotice = ; diff --git a/shell/site.config.dev.shell.tsx b/shell/site.config.dev.shell.tsx index fce32f2f..189a4ee3 100644 --- a/shell/site.config.dev.shell.tsx +++ b/shell/site.config.dev.shell.tsx @@ -1,3 +1,4 @@ +import { Button } from '@openedx/paragon'; import { Divider } from '../runtime'; import { AppConfigTypes, EnvironmentTypes, ProjectSiteConfig } from '../types'; @@ -94,6 +95,89 @@ const config: ProjectSiteConfig = { } ], }, + footer: { + centerLinks: [ + { + label: 'First Column', + links: [ + { + label: 'Link 1', + url: '#', + }, + { + label: 'Link 2', + url: '#', + }, + { + label: 'Link 3', + url: '#', + }, + ], + }, + { + label: 'Second Column', + links: [ + { + label: 'Link 5', + url: '#', + }, + { + label: 'Link 6', + url: '#', + }, + { + label: 'Link 7 With A Long Label ', + url: '#', + }, + { + label: 'Link 8', + url: '#', + }, + ] + }, + { + label: 'Third Column', + links: [ + { + label: 'Link 9', + url: '#', + }, + { + label: 'Link 10 With Another Longer Label', + url: '#', + }, + ] + }, + { + label: 'Fourth Column', + links: [ + { + label: 'Link 11', + url: '#', + }, + { + label: 'Link 12', + url: '#', + }, + ] + } + ], + revealMenu: { + label: 'I Reveal Buttons', + links: [ + , + , + { + label: 'Link Three', + url: '#', + } + ] + }, + }, APP_ID: 'shell', ACCOUNT_PROFILE_URL: 'http://apps.local.openedx.io:1995', diff --git a/types.ts b/types.ts index 8cee353c..2410bdde 100644 --- a/types.ts +++ b/types.ts @@ -1,4 +1,4 @@ -import { ElementType, ReactElement } from 'react'; +import { ElementType, ReactElement, ReactNode } from 'react'; import { MessageDescriptor } from 'react-intl'; import { IndexRouteObject, NonIndexRouteObject } from 'react-router'; @@ -33,6 +33,7 @@ export type AppModuleRouteObject = AppModuleIndexRouteObject | AppModuleNonIndex export interface ApplicationModuleConfig { route: AppModuleRouteObject, header?: HeaderConfig, + footer?: FooterConfig, } export interface InternalAppConfig { @@ -68,6 +69,7 @@ export interface OptionalSiteConfig { }>, header?: HeaderConfig, + footer?: FooterConfig, // Cookies ACCESS_TOKEN_COOKIE_NAME: string, @@ -205,6 +207,35 @@ export interface UrlMenuItem extends BaseLinkMenuItem { url: string, } +// Footer + +export interface LabeledMenu { + label: ReactNode, + links: ChildMenuItem[], +} + +export interface FooterConfig { + logoUrl?: string, + logoDestinationUrl?: string | null, + leftLinks?: ChildMenuItem[], + centerLinks?: LabeledMenu[], + rightLinks?: ChildMenuItem[], + revealMenu?: LabeledMenu, + copyrightNotice?: ReactNode, +} + +export interface ResolvedFooterConfig { + logoUrl: string, + logoDestinationUrl: string | null, + leftLinks: ChildMenuItem[], + centerLinks: LabeledMenu[], + rightLinks: ChildMenuItem[], + revealMenu?: LabeledMenu, // this can be undefined + copyrightNotice?: ReactNode, // this can be undefined +} + +// TODO: Link Menu Items need to support 'external' links via Hyperlink. May need to replace all +// NavLink components with Hyperlink to have a consistent prop schema. /** * A menu item that displays as a link. * From 827e37a4e17d027c63021bab661221b9b4ebd751 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 11:21:24 -0400 Subject: [PATCH 39/75] fix: removing old footers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The “new-footer” replaces the defeault and studio footers. A subsequent commit will move the content in “footer/new-footer” up a folder into “footer”. --- shell/footer/_footer.scss | 5 - shell/footer/data/hooks.ts | 20 --- .../default-footer/DefaultFooter.messages.ts | 156 ------------------ .../default-footer/DefaultFooter.test.tsx | 101 ------------ shell/footer/default-footer/DefaultFooter.tsx | 47 ------ .../default-footer/LanguageSelector.tsx | 56 ------- .../__snapshots__/DefaultFooter.test.tsx.snap | 100 ----------- shell/footer/default-footer/index.ts | 3 - shell/footer/i18n/index.ts | 1 - .../studio-footer/StudioFooter.test.tsx | 145 ---------------- shell/footer/studio-footer/StudioFooter.tsx | 130 --------------- shell/footer/studio-footer/index.tsx | 3 - shell/footer/studio-footer/messages.ts | 61 ------- shell/index.scss | 2 - 14 files changed, 830 deletions(-) delete mode 100644 shell/footer/_footer.scss delete mode 100644 shell/footer/data/hooks.ts delete mode 100644 shell/footer/default-footer/DefaultFooter.messages.ts delete mode 100644 shell/footer/default-footer/DefaultFooter.test.tsx delete mode 100644 shell/footer/default-footer/DefaultFooter.tsx delete mode 100644 shell/footer/default-footer/LanguageSelector.tsx delete mode 100644 shell/footer/default-footer/__snapshots__/DefaultFooter.test.tsx.snap delete mode 100644 shell/footer/default-footer/index.ts delete mode 100644 shell/footer/i18n/index.ts delete mode 100644 shell/footer/studio-footer/StudioFooter.test.tsx delete mode 100644 shell/footer/studio-footer/StudioFooter.tsx delete mode 100644 shell/footer/studio-footer/index.tsx delete mode 100644 shell/footer/studio-footer/messages.ts diff --git a/shell/footer/_footer.scss b/shell/footer/_footer.scss deleted file mode 100644 index 2d2e859f..00000000 --- a/shell/footer/_footer.scss +++ /dev/null @@ -1,5 +0,0 @@ -$gray-footer: #fcfcfc !default; - -.footer { - background-color: $gray-footer; -} diff --git a/shell/footer/data/hooks.ts b/shell/footer/data/hooks.ts deleted file mode 100644 index 52015d85..00000000 --- a/shell/footer/data/hooks.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useEffect, useState } from 'react'; -import { UIMatch, useMatches } from 'react-router'; -import { FooterTypes } from '../../../types'; - -export default function useActiveFooterId() { - const matches = useMatches() as UIMatch[]; - const [footerId, setFooterId] = useState(FooterTypes.DEFAULT); - - useEffect(() => { - for (let i = matches.length - 1; i >= 0; i--) { - const match = matches[i]; - if (match.handle?.footerId !== undefined) { - setFooterId(match.handle.footerId); - break; - } - } - }, [matches]); - - return footerId; -} diff --git a/shell/footer/default-footer/DefaultFooter.messages.ts b/shell/footer/default-footer/DefaultFooter.messages.ts deleted file mode 100644 index 2db7e6a5..00000000 --- a/shell/footer/default-footer/DefaultFooter.messages.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { defineMessages } from '../../../runtime'; - -const messages = defineMessages({ - 'footer.socialLinks.srText.facebook': { - id: 'footer.socialLinks.srText.facebook', - defaultMessage: 'Like edX on Facebook', - description: 'This is screenreader text for the edX Facebook social media link in the footer.', - }, - 'footer.socialLinks.srText.twitter': { - id: 'footer.socialLinks.srText.twitter', - defaultMessage: 'Follow edX on Twitter', - description: 'This is screenreader text for the edX Twitter social media link in the footer.', - }, - 'footer.socialLinks.srText.youtube': { - id: 'footer.socialLinks.srText.youtube', - defaultMessage: 'Subscribe to the edX YouTube channel', - description: 'This is screenreader text for the edX YouTube social media link in the footer.', - }, - 'footer.socialLinks.srText.linkedin': { - id: 'footer.socialLinks.srText.linkedin', - defaultMessage: 'Follow edX on LinkedIn', - description: 'This is screenreader text for the edX LinkedIn social media link in the footer.', - }, - 'footer.socialLinks.srText.reddit': { - id: 'footer.socialLinks.srText.reddit', - defaultMessage: 'Subscribe to the edX subreddit', - description: 'This is screenreader text for the edX reddit social media link in the footer.', - }, - 'footer.languageForm.select.label': { - id: 'footer.languageForm.select.label', - defaultMessage: 'Choose Language', - description: 'The label for the laguage select part of the language selection form.', - }, - 'footer.languageForm.submit.label': { - id: 'footer.languageForm.submit.label', - defaultMessage: 'Apply', - description: 'The label for button to submit the language selection form.', - }, - 'footer.edxLinks.about': { - id: 'footer.edxLinks.about', - defaultMessage: 'About', - description: 'The label for the link to the about edX page.', - }, - 'footer.edxLinks.business': { - id: 'footer.edxLinks.business', - defaultMessage: 'edX for Business', - description: 'The label for the link to the edX for business page.', - }, - 'footer.edxLinks.affiliates': { - id: 'footer.edxLinks.affiliates', - defaultMessage: 'Affiliates', - description: 'The label for the link to the edX affiliates page.', - }, - 'footer.edxLinks.openEdx': { - id: 'footer.edxLinks.openEdx', - defaultMessage: 'Open edX', - description: 'The label for the link to the open edX site.', - }, - 'footer.edxLinks.careers': { - id: 'footer.edxLinks.careers', - defaultMessage: 'Careers', - description: 'The label for the link to the edX Careers page.', - }, - 'footer.edxLinks.news': { - id: 'footer.edxLinks.news', - defaultMessage: 'News', - description: 'The label for the link to the edX news page.', - }, - 'footer.legalLinks.heading': { - id: 'footer.legalLinks.heading', - defaultMessage: 'Legal', - description: 'Heading for the legal links section of the footer.', - }, - 'footer.legalLinks.termsOfService': { - id: 'footer.legalLinks.termsOfService', - defaultMessage: 'Terms of Service & Honor Code', - description: 'The label for the link to the edX terms of service page.', - }, - 'footer.legalLinks.privacyPolicy': { - id: 'footer.legalLinks.privacyPolicy', - defaultMessage: 'Privacy Policy', - description: 'The label for the link to the edX privacy policy page.', - }, - 'footer.legalLinks.a11yPolicy': { - id: 'footer.legalLinks.a11yPolicy', - defaultMessage: 'Accessibility Policy', - description: 'The label for the link to the edX accessibility policy page.', - }, - 'footer.legalLinks.trademarkPolicy': { - id: 'footer.legalLinks.trademarkPolicy', - defaultMessage: 'Trademark Policy', - description: 'The label for the link to the edX trademark policy page.', - }, - 'footer.legalLinks.sitemap': { - id: 'footer.legalLinks.sitemap', - defaultMessage: 'Sitemap', - description: 'The label for the link to the edX sitemap page.', - }, - 'footer.connectLinks.heading': { - id: 'footer.connectLinks.heading', - defaultMessage: 'Connect', - description: 'Heading for the connect links section of the footer.', - }, - 'footer.connectLinks.blog': { - id: 'footer.connectLinks.blog', - defaultMessage: 'Blog', - description: 'The label for the link to the edX blog.', - }, - 'footer.connectLinks.contact': { - id: 'footer.connectLinks.contact', - defaultMessage: 'Contact Us', - description: 'The label for the link to the contact edX page.', - }, - 'footer.connectLinks.help': { - id: 'footer.connectLinks.help', - defaultMessage: 'Help Center', - description: 'The label for the link to the edX help center.', - }, - 'footer.connectLinks.mediaKit': { - id: 'footer.connectLinks.mediaKit', - defaultMessage: 'Media Kit', - description: 'The label for the link to the edX media kit page.', - }, - 'footer.connectLinks.donate': { - id: 'footer.connectLinks.donate', - defaultMessage: 'Donate', - description: 'The label for the link to the edX donation page.', - }, - 'footer.mobileApp.apple': { - id: 'footer.mobileApp.apple', - defaultMessage: 'Download the edX mobile app from the Apple App Store', - description: 'The label for the link to download the apple version of the edX app.', - }, - 'footer.mobileApp.google': { - id: 'footer.mobileApp.google', - defaultMessage: 'Download the edX mobile app from Google Play', - description: 'The label for the link to download the google version of the edX app.', - }, - 'footer.logo.altText': { - id: 'footer.logo.altText', - defaultMessage: 'Powered by Open edX', - description: 'alt text for the footer logo.', - }, - 'footer.logo.ariaLabel': { - id: 'footer.logo.ariaLabel', - defaultMessage: 'edX Home', - description: 'aria-label for the footer logo.', - }, - 'footer.ariaLabel': { - id: 'footer.ariaLabel', - defaultMessage: 'Page Footer', - description: 'aria-label for the footer component', - }, -}); - -export default messages; diff --git a/shell/footer/default-footer/DefaultFooter.test.tsx b/shell/footer/default-footer/DefaultFooter.test.tsx deleted file mode 100644 index 84b0cc7b..00000000 --- a/shell/footer/default-footer/DefaultFooter.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import { useMemo } from 'react'; -import renderer from 'react-test-renderer'; - -// @ts-expect-error 'site.config' is set up via webpack alias, so we know it works, but TypeScript -// can't figure out what it means. -import siteConfig from 'site.config'; -import { - AppContext, - IntlProvider -} from '../../../runtime'; - -import Footer from './DefaultFooter'; - -const FooterWithContext = ({ locale = 'en' }: { locale: string }) => { - const contextValue = useMemo(() => ({ - authenticatedUser: null, - config: { - ...siteConfig, - LOGO_TRADEMARK_URL: siteConfig.LOGO_TRADEMARK_URL, - LMS_BASE_URL: siteConfig.LMS_BASE_URL, - }, - locale: 'en', - }), []); - - return ( - - -
- - - ); -}; - -const FooterWithLanguageSelector = ({ - languageSelected = () => {} -}: { languageSelected?: (languageCode: string) => void }) => { - const contextValue = useMemo(() => ({ - authenticatedUser: null, - config: { - ...siteConfig, - LOGO_TRADEMARK_URL: siteConfig.LOGO_TRADEMARK_URL, - LMS_BASE_URL: siteConfig.LMS_BASE_URL, - }, - locale: 'en', - }), []); - - return ( - - -
- - - ); -}; - -describe('
', () => { - describe('renders correctly', () => { - it('renders without a language selector', () => { - const tree = renderer - .create() - .toJSON(); - expect(tree).toMatchSnapshot(); - }); - it('renders with a language selector', () => { - const tree = renderer - .create() - .toJSON(); - expect(tree).toMatchSnapshot(); - }); - }); - - describe('handles language switching', () => { - it('calls onLanguageSelected prop when a language is changed', () => { - const mockHandleLanguageSelected = jest.fn(); - render(); - - fireEvent.submit(screen.getByTestId('site-footer-submit-btn'), { - target: { - elements: { - 'site-footer-language-select': { - value: 'es', - }, - }, - }, - }); - - expect(mockHandleLanguageSelected).toHaveBeenCalledWith('es'); - }); - }); -}); diff --git a/shell/footer/default-footer/DefaultFooter.tsx b/shell/footer/default-footer/DefaultFooter.tsx deleted file mode 100644 index b771486f..00000000 --- a/shell/footer/default-footer/DefaultFooter.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { - getConfig, - useIntl -} from '../../../runtime'; - -import messages from './DefaultFooter.messages'; -import LanguageSelector from './LanguageSelector'; - -interface DefaultFooterProps { - logo?: string, - onLanguageSelected?: (languageCode: string) => void, - supportedLanguages?: { label: string, value: string }[], -} - -export default function DefaultFooter({ logo, onLanguageSelected, supportedLanguages = [] }: DefaultFooterProps) { - const intl = useIntl(); - - const showLanguageSelector = supportedLanguages.length > 0 && onLanguageSelected; - - return ( -
-
- - {intl.formatMessage(messages['footer.logo.altText'])} - -
- {showLanguageSelector && ( - - )} -
-
- ); -} diff --git a/shell/footer/default-footer/LanguageSelector.tsx b/shell/footer/default-footer/LanguageSelector.tsx deleted file mode 100644 index 6fa732b5..00000000 --- a/shell/footer/default-footer/LanguageSelector.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { - FormattedMessage, - useIntl -} from '../../../runtime'; - -interface LanguageSelectorProps { - onSubmit: (languageCode: string) => void, - options: { - label: string, - value: string, - }[], -} - -export default function LanguageSelector({ - options, onSubmit, ...props -}: LanguageSelectorProps) { - const intl = useIntl(); - const handleSubmit = (e) => { - e.preventDefault(); - const languageCode = e.target.elements['site-footer-language-select'].value; - onSubmit(languageCode); - }; - - return ( -
-
- - - -
-
- ); -} diff --git a/shell/footer/default-footer/__snapshots__/DefaultFooter.test.tsx.snap b/shell/footer/default-footer/__snapshots__/DefaultFooter.test.tsx.snap deleted file mode 100644 index 329bf75e..00000000 --- a/shell/footer/default-footer/__snapshots__/DefaultFooter.test.tsx.snap +++ /dev/null @@ -1,100 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`
renders correctly renders with a language selector 1`] = ` -
-
- - Powered by Open edX - -
-
-
- - - -
-
-
-
-`; - -exports[`
renders correctly renders without a language selector 1`] = ` - -`; diff --git a/shell/footer/default-footer/index.ts b/shell/footer/default-footer/index.ts deleted file mode 100644 index 23586dce..00000000 --- a/shell/footer/default-footer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Footer from './DefaultFooter'; - -export default Footer; diff --git a/shell/footer/i18n/index.ts b/shell/footer/i18n/index.ts deleted file mode 100644 index ff8b4c56..00000000 --- a/shell/footer/i18n/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/shell/footer/studio-footer/StudioFooter.test.tsx b/shell/footer/studio-footer/StudioFooter.test.tsx deleted file mode 100644 index 10eb6e72..00000000 --- a/shell/footer/studio-footer/StudioFooter.test.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import { - AppProvider, - initializeMockApp, - mergeConfig -} from '../../../runtime'; -import StudioFooter from './StudioFooter'; -import messages from './messages'; - -describe('Footer', () => { - beforeEach(() => { - initializeMockApp({ messages: [], authenticatedUser: null }); - }); - - describe('help section default view', () => { - it('help button should read Looking for help with Studio?', () => { - render( - - - - ); - expect(screen.getByText(messages.openHelpButtonLabel.defaultMessage)) - .toBeVisible(); - }); - it('help button link row should not be visible', () => { - render( - - - - ); - expect(screen.queryByTestId('helpButtonRow')).toBeNull(); - }); - }); - describe('help section expanded view', () => { - it('help button should read Hide Studio help', () => { - render( - - - - ); - const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage); - fireEvent.click(helpToggleButton); - expect(screen.getByText(messages.closeHelpButtonLabel.defaultMessage)) - .toBeVisible(); - }); - it('help button link row should be visible', () => { - render( - - - - ); - const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage); - fireEvent.click(helpToggleButton); - expect(screen.getByTestId('helpButtonRow')).toBeVisible(); - }); - it('Open edX portal button should be visible', () => { - render( - - - - ); - const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage); - fireEvent.click(helpToggleButton); - expect(screen.getByTestId('openEdXPortalButton')).toBeVisible(); - }); - it('should not show contact us button', () => { - render( - - - - ); - const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage); - fireEvent.click(helpToggleButton); - expect(screen.queryByTestId('contactUsButton')).toBeNull(); - }); - it('should show contact us button', () => { - mergeConfig({ - SUPPORT_EMAIL: 'support@email.com', - }); - render( - - - - ); - const helpToggleButton = screen.getByText(messages.openHelpButtonLabel.defaultMessage); - fireEvent.click(helpToggleButton); - expect(screen.getByTestId('contactUsButton')).toBeVisible(); - }); - }); - describe('policy link row', () => { - it('should only show LMS link', () => { - render( - - - - ); - expect(screen.getByText('LMS')).toBeVisible(); - expect(screen.queryByTestId('termsOfService')).toBeNull(); - expect(screen.queryByTestId('privacyPolicy')).toBeNull(); - expect(screen.queryByTestId('accessibilityRequest')).toBeNull(); - }); - it('should show terms of service link', () => { - mergeConfig({ - TERMS_OF_SERVICE_URL: 'termsofserviceurl', - }); - render( - - - - ); - expect(screen.getByText('LMS')).toBeVisible(); - expect(screen.queryByTestId('termsOfService')).toBeVisible(); - expect(screen.queryByTestId('privacyPolicy')).toBeNull(); - expect(screen.queryByTestId('accessibilityRequest')).toBeNull(); - }); - it('should show privacy policy link', () => { - mergeConfig({ - PRIVACY_POLICY_URL: 'privacypolicyurl', - }); - render( - - - - ); - expect(screen.getByText('LMS')).toBeVisible(); - expect(screen.queryByTestId('termsOfService')).toBeNull(); - expect(screen.queryByTestId('privacyPolicy')).toBeVisible(); - expect(screen.queryByTestId('accessibilityRequest')).toBeNull(); - }); - it('should show accessibilty request link', () => { - mergeConfig({ - ACCESSIBILITY_URL: 'accessibilityurl', - }); - render( - - - - ); - expect(screen.getByText('LMS')).toBeVisible(); - expect(screen.queryByTestId('termsOfService')).toBeNull(); - expect(screen.queryByTestId('privacyPolicy')).toBeNull(); - expect(screen.queryByTestId('accessibilityRequest')).toBeVisible(); - }); - }); -}); diff --git a/shell/footer/studio-footer/StudioFooter.tsx b/shell/footer/studio-footer/StudioFooter.tsx deleted file mode 100644 index aa356943..00000000 --- a/shell/footer/studio-footer/StudioFooter.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { - ActionRow, - Button, - Container, - Hyperlink, - Image, - TransitionReplace, -} from '@openedx/paragon'; -import { ExpandLess, ExpandMore, Help } from '@openedx/paragon/icons'; -import { useContext, useState } from 'react'; - -import { - AppContext, - FormattedMessage, - useIntl -} from '../../../runtime'; -import messages from './messages'; - -export default function StudioFooter() { - const intl = useIntl(); - const [isOpen, setIsOpen] = useState(false); - - const { config } = useContext(AppContext); - - return ( - <> -
-
- -
-
- - - {isOpen ? ( - - - - - - - {config.SUPPORT_EMAIL !== null && ( - - )} - - - ) : null} - - - © {new Date().getFullYear()} {config.SITE_NAME} - - {config.TERMS_OF_SERVICE_URL !== null && ( - - {intl.formatMessage(messages.termsOfServiceLinkLabel)} - - )} - {config.PRIVACY_POLICY_URL !== null && ( - - {intl.formatMessage(messages.privacyPolicyLinkLabel)} - - )} - {config.ACCESSIBILITY_URL !== null && ( - - {intl.formatMessage(messages.accessibilityRequestLinkLabel)} - - )} - LMS - - - {/* - Site operators: Please do not remove this paragraph! this attributes back to edX and - makes your acknowledgement of edX's trademarks clear. - Translators: 'edX' and 'Open edX' are trademarks of 'edX Inc.'. Please do not translate - any of these trademarks and company names. - */} - - edX Inc. - - - Powered by Open edX - - - - - ); -} diff --git a/shell/footer/studio-footer/index.tsx b/shell/footer/studio-footer/index.tsx deleted file mode 100644 index eb334610..00000000 --- a/shell/footer/studio-footer/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import StudioFooter from './StudioFooter'; - -export default StudioFooter; diff --git a/shell/footer/studio-footer/messages.ts b/shell/footer/studio-footer/messages.ts deleted file mode 100644 index 0b0320af..00000000 --- a/shell/footer/studio-footer/messages.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { defineMessages } from '../../../runtime'; - -const messages = defineMessages({ - openHelpButtonLabel: { - id: 'authoring.footer.help.openHelp.button.label', - defaultMessage: 'Looking for help with Studio?', - description: 'Label for button that opens the collapsed section with help buttons', - }, - closeHelpButtonLabel: { - id: 'authoring.footer.help.closeHelp.button.label', - defaultMessage: 'Hide Studio help', - description: 'Label for button that closes the collapsed section with help buttons', - }, - edxDocumentationButtonLabel: { - id: 'authoring.footer.help.edxDocumentation.button.label', - defaultMessage: 'edX documentation', - description: 'Label for button that links to the edX documentation site', - }, - openEdxPortalButtonLabel: { - id: 'authoring.footer.help.openEdxPortal.button.label', - defaultMessage: 'Open edX portal', - description: 'Label for button that links to the Open edX portal', - }, - edx101ButtonLabel: { - id: 'authoring.footer.help.edx101.button.label', - defaultMessage: 'Enroll in edX 101', - description: 'Label for button that links to the edX 101 course', - }, - studioXButtonLabel: { - id: 'authoring.footer.help.studioX.button.label', - defaultMessage: 'Enroll in StudioX', - description: 'Label for button that links to the edX StudioX course', - }, - contactUsButtonLabel: { - id: 'authoring.footer.help.contactUs.button.label', - defaultMessage: 'Contact us', - description: 'Label for button that links to the email for partner support', - }, - termsOfServiceLinkLabel: { - id: 'authoring.footer.termsOfService.link.label', - defaultMessage: 'Terms of Service', - description: 'Label for button that links to the terms of service page', - }, - privacyPolicyLinkLabel: { - id: 'authoring.footer.privacyPolicy.link.label', - defaultMessage: 'Privacy Policy', - description: 'Label for button that links to the privacy policy page', - }, - accessibilityRequestLinkLabel: { - id: 'authoring.footer.accessibilityRequest.link.label', - defaultMessage: 'Accessibility Accomodation Request', - description: 'Label for button that links to the accessibility accomodation requests page', - }, - trademarkMessage: { - id: 'authoring.footer.trademark.message', - defaultMessage: 'edX and Open edX, and the edX and Open edX logos are registered trademarks of', - description: 'Message about the use of logos and names edX and Open edX', - }, -}); - -export default messages; diff --git a/shell/index.scss b/shell/index.scss index 4da264cb..aea1eb4a 100644 --- a/shell/index.scss +++ b/shell/index.scss @@ -1,7 +1,5 @@ @use "@openedx/paragon/scss/core/core.scss"; -@use "./footer/footer"; - .flex-basis-0 { flex-basis: 0 !important; } From bea341228b334061d1985e2bc2612b88243d860d Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 11:49:35 -0400 Subject: [PATCH 40/75] =?UTF-8?q?refactor:=20moving=20=E2=80=98new-footer?= =?UTF-8?q?=E2=80=99=20to=20=E2=80=98footer=E2=80=99,=20menu=20helpers=20t?= =?UTF-8?q?o=20=E2=80=98menus=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shell/Shell.tsx | 2 +- shell/footer/{new-footer => }/CenterLinks.tsx | 1 + .../{new-footer => }/CopyrightNotice.tsx | 3 +- shell/footer/{new-footer => }/Footer.tsx | 0 .../footer/{new-footer => }/FooterContext.tsx | 3 +- .../footer/{new-footer => }/LanguageMenu.tsx | 2 +- .../{new-footer => }/LanguageMenuItem.tsx | 1 + shell/footer/{new-footer => }/LeftLinks.tsx | 1 + .../footer/{new-footer => }/LegalNotices.tsx | 2 +- shell/footer/{new-footer => }/LinkGrid.tsx | 2 +- .../footer/{new-footer => }/LinkGridItem.tsx | 13 +++--- shell/footer/{new-footer => }/LinkRowItem.tsx | 7 ++-- shell/footer/{new-footer => }/Logo.tsx | 1 + shell/footer/{new-footer => }/PoweredBy.tsx | 3 +- shell/footer/{new-footer => }/RevealLinks.tsx | 1 + shell/footer/{new-footer => }/RightLinks.tsx | 1 + shell/footer/{new-footer => }/data/api.ts | 7 +++- shell/footer/{new-footer => }/data/hooks.ts | 4 +- shell/footer/{new-footer => }/data/utils.ts | 8 ++-- shell/footer/{new-footer => }/defaults.tsx | 3 +- .../anonymous-menu/AnonymousMenuItem.tsx | 8 +++- .../AuthenticatedMenuItem.tsx | 2 +- shell/header/data/utils.ts | 40 +------------------ shell/header/nav-links/NavLinkDropdown.tsx | 2 +- .../header/nav-links/NavLinkDropdownItem.tsx | 7 +++- shell/header/nav-links/NavLinksItem.tsx | 8 +++- shell/menus/data/utils.ts | 40 +++++++++++++++++++ 27 files changed, 103 insertions(+), 69 deletions(-) rename shell/footer/{new-footer => }/CenterLinks.tsx (99%) rename shell/footer/{new-footer => }/CopyrightNotice.tsx (96%) rename shell/footer/{new-footer => }/Footer.tsx (100%) rename shell/footer/{new-footer => }/FooterContext.tsx (83%) rename shell/footer/{new-footer => }/LanguageMenu.tsx (97%) rename shell/footer/{new-footer => }/LanguageMenuItem.tsx (99%) rename shell/footer/{new-footer => }/LeftLinks.tsx (99%) rename shell/footer/{new-footer => }/LegalNotices.tsx (91%) rename shell/footer/{new-footer => }/LinkGrid.tsx (93%) rename shell/footer/{new-footer => }/LinkGridItem.tsx (85%) rename shell/footer/{new-footer => }/LinkRowItem.tsx (91%) rename shell/footer/{new-footer => }/Logo.tsx (99%) rename shell/footer/{new-footer => }/PoweredBy.tsx (90%) rename shell/footer/{new-footer => }/RevealLinks.tsx (99%) rename shell/footer/{new-footer => }/RightLinks.tsx (99%) rename shell/footer/{new-footer => }/data/api.ts (89%) rename shell/footer/{new-footer => }/data/hooks.ts (78%) rename shell/footer/{new-footer => }/data/utils.ts (89%) rename shell/footer/{new-footer => }/defaults.tsx (87%) create mode 100644 shell/menus/data/utils.ts diff --git a/shell/Shell.tsx b/shell/Shell.tsx index 486a03c8..8510a562 100644 --- a/shell/Shell.tsx +++ b/shell/Shell.tsx @@ -4,7 +4,7 @@ import { AppProvider, PluginSlot } from '../runtime'; -import Footer from './footer/new-footer/Footer'; +import Footer from './footer/Footer'; import Header from './header/Header'; export default function Shell() { diff --git a/shell/footer/new-footer/CenterLinks.tsx b/shell/footer/CenterLinks.tsx similarity index 99% rename from shell/footer/new-footer/CenterLinks.tsx rename to shell/footer/CenterLinks.tsx index aea097da..d75a4f0f 100644 --- a/shell/footer/new-footer/CenterLinks.tsx +++ b/shell/footer/CenterLinks.tsx @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import FooterContext from './FooterContext'; import LinkGrid from './LinkGrid'; diff --git a/shell/footer/new-footer/CopyrightNotice.tsx b/shell/footer/CopyrightNotice.tsx similarity index 96% rename from shell/footer/new-footer/CopyrightNotice.tsx rename to shell/footer/CopyrightNotice.tsx index ca089f4a..d779198e 100644 --- a/shell/footer/new-footer/CopyrightNotice.tsx +++ b/shell/footer/CopyrightNotice.tsx @@ -1,5 +1,6 @@ import { Hyperlink } from '@openedx/paragon'; -import { useConfig } from '../../../runtime'; + +import { useConfig } from '../../runtime'; interface CopyrightNoticeProps { title?: string, diff --git a/shell/footer/new-footer/Footer.tsx b/shell/footer/Footer.tsx similarity index 100% rename from shell/footer/new-footer/Footer.tsx rename to shell/footer/Footer.tsx diff --git a/shell/footer/new-footer/FooterContext.tsx b/shell/footer/FooterContext.tsx similarity index 83% rename from shell/footer/new-footer/FooterContext.tsx rename to shell/footer/FooterContext.tsx index d097b440..6bb8f39a 100644 --- a/shell/footer/new-footer/FooterContext.tsx +++ b/shell/footer/FooterContext.tsx @@ -1,5 +1,6 @@ import { createContext } from 'react'; -import { ResolvedFooterConfig } from '../../../types'; + +import { ResolvedFooterConfig } from '../../types'; const FooterContext = createContext({ logoUrl: '', diff --git a/shell/footer/new-footer/LanguageMenu.tsx b/shell/footer/LanguageMenu.tsx similarity index 97% rename from shell/footer/new-footer/LanguageMenu.tsx rename to shell/footer/LanguageMenu.tsx index 5caae53b..724644ec 100644 --- a/shell/footer/new-footer/LanguageMenu.tsx +++ b/shell/footer/LanguageMenu.tsx @@ -5,7 +5,7 @@ import { AppContext, getLocalizedLanguageName, getSupportedLanguageList -} from '../../../runtime'; +} from '../../runtime'; import LanguageMenuItem from './LanguageMenuItem'; diff --git a/shell/footer/new-footer/LanguageMenuItem.tsx b/shell/footer/LanguageMenuItem.tsx similarity index 99% rename from shell/footer/new-footer/LanguageMenuItem.tsx rename to shell/footer/LanguageMenuItem.tsx index f7f6d7e4..601a0344 100644 --- a/shell/footer/new-footer/LanguageMenuItem.tsx +++ b/shell/footer/LanguageMenuItem.tsx @@ -1,5 +1,6 @@ import { Dropdown } from '@openedx/paragon'; import { useCallback } from 'react'; + import { updateSiteLanguage } from './data/api'; interface LanguageMenuItemProps { diff --git a/shell/footer/new-footer/LeftLinks.tsx b/shell/footer/LeftLinks.tsx similarity index 99% rename from shell/footer/new-footer/LeftLinks.tsx rename to shell/footer/LeftLinks.tsx index 2d03f99e..07d175f7 100644 --- a/shell/footer/new-footer/LeftLinks.tsx +++ b/shell/footer/LeftLinks.tsx @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import FooterContext from './FooterContext'; import LinkRowItem from './LinkRowItem'; diff --git a/shell/footer/new-footer/LegalNotices.tsx b/shell/footer/LegalNotices.tsx similarity index 91% rename from shell/footer/new-footer/LegalNotices.tsx rename to shell/footer/LegalNotices.tsx index 41ae29dc..a66cf157 100644 --- a/shell/footer/new-footer/LegalNotices.tsx +++ b/shell/footer/LegalNotices.tsx @@ -1,7 +1,7 @@ import { useContext } from 'react'; import { useIntl } from 'react-intl'; -import messages from '../../Shell.messages'; +import messages from '../Shell.messages'; import FooterContext from './FooterContext'; export default function LegalNotices() { diff --git a/shell/footer/new-footer/LinkGrid.tsx b/shell/footer/LinkGrid.tsx similarity index 93% rename from shell/footer/new-footer/LinkGrid.tsx rename to shell/footer/LinkGrid.tsx index 08956ce2..7514853e 100644 --- a/shell/footer/new-footer/LinkGrid.tsx +++ b/shell/footer/LinkGrid.tsx @@ -1,6 +1,6 @@ // TODO: Do something better than using the array index here. /* eslint-disable react/no-array-index-key */ -import { LabeledMenu } from '../../../types'; +import { LabeledMenu } from '../../types'; import LinkGridItem from './LinkGridItem'; interface LinkGridProps { diff --git a/shell/footer/new-footer/LinkGridItem.tsx b/shell/footer/LinkGridItem.tsx similarity index 85% rename from shell/footer/new-footer/LinkGridItem.tsx rename to shell/footer/LinkGridItem.tsx index 361cd72f..8d940469 100644 --- a/shell/footer/new-footer/LinkGridItem.tsx +++ b/shell/footer/LinkGridItem.tsx @@ -1,13 +1,16 @@ import { Hyperlink } from '@openedx/paragon'; import { useIntl } from 'react-intl'; -import { getAppUrl } from '../../../runtime/routing'; + +import { getAppUrl } from '../../runtime/routing'; import { ChildMenuItem -} from '../../../types'; +} from '../../types'; import { - getItemLabel, isAppMenuItem, - isReactNodeMenuItem, isUrlMenuItem -} from '../../header/data/utils'; + getItemLabel, + isAppMenuItem, + isReactNodeMenuItem, + isUrlMenuItem +} from '../menus/data/utils'; interface NavLinksItemProps { item: ChildMenuItem, diff --git a/shell/footer/new-footer/LinkRowItem.tsx b/shell/footer/LinkRowItem.tsx similarity index 91% rename from shell/footer/new-footer/LinkRowItem.tsx rename to shell/footer/LinkRowItem.tsx index f39598de..c495cae7 100644 --- a/shell/footer/new-footer/LinkRowItem.tsx +++ b/shell/footer/LinkRowItem.tsx @@ -1,15 +1,16 @@ import { Hyperlink } from '@openedx/paragon'; import { useIntl } from 'react-intl'; -import { getAppUrl } from '../../../runtime/routing'; + +import { getAppUrl } from '../../runtime/routing'; import { ChildMenuItem -} from '../../../types'; +} from '../../types'; import { getItemLabel, isAppMenuItem, isReactNodeMenuItem, isUrlMenuItem -} from '../../header/data/utils'; +} from '../menus/data/utils'; interface LinkRowItemProps { item: ChildMenuItem, diff --git a/shell/footer/new-footer/Logo.tsx b/shell/footer/Logo.tsx similarity index 99% rename from shell/footer/new-footer/Logo.tsx rename to shell/footer/Logo.tsx index 0d239bf0..18cb2cee 100644 --- a/shell/footer/new-footer/Logo.tsx +++ b/shell/footer/Logo.tsx @@ -1,5 +1,6 @@ import { Hyperlink, Image } from '@openedx/paragon'; import { useContext } from 'react'; + import FooterContext from './FooterContext'; export default function Logo() { diff --git a/shell/footer/new-footer/PoweredBy.tsx b/shell/footer/PoweredBy.tsx similarity index 90% rename from shell/footer/new-footer/PoweredBy.tsx rename to shell/footer/PoweredBy.tsx index 56e64d9e..16c25c1a 100644 --- a/shell/footer/new-footer/PoweredBy.tsx +++ b/shell/footer/PoweredBy.tsx @@ -1,6 +1,7 @@ import { Hyperlink, Image } from '@openedx/paragon'; import { useIntl } from 'react-intl'; -import messages from '../../Shell.messages'; + +import messages from '../Shell.messages'; export default function PoweredBy() { const intl = useIntl(); diff --git a/shell/footer/new-footer/RevealLinks.tsx b/shell/footer/RevealLinks.tsx similarity index 99% rename from shell/footer/new-footer/RevealLinks.tsx rename to shell/footer/RevealLinks.tsx index 3d01ce46..8767a492 100644 --- a/shell/footer/new-footer/RevealLinks.tsx +++ b/shell/footer/RevealLinks.tsx @@ -1,6 +1,7 @@ import { Button, Collapsible } from '@openedx/paragon'; import { ExpandLess, ExpandMore } from '@openedx/paragon/icons'; import { useContext } from 'react'; + import FooterContext from './FooterContext'; import LinkRowItem from './LinkRowItem'; diff --git a/shell/footer/new-footer/RightLinks.tsx b/shell/footer/RightLinks.tsx similarity index 99% rename from shell/footer/new-footer/RightLinks.tsx rename to shell/footer/RightLinks.tsx index dc64fec9..9e379740 100644 --- a/shell/footer/new-footer/RightLinks.tsx +++ b/shell/footer/RightLinks.tsx @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import FooterContext from './FooterContext'; import LinkRowItem from './LinkRowItem'; diff --git a/shell/footer/new-footer/data/api.ts b/shell/footer/data/api.ts similarity index 89% rename from shell/footer/new-footer/data/api.ts rename to shell/footer/data/api.ts index bc701283..4ec1d240 100644 --- a/shell/footer/new-footer/data/api.ts +++ b/shell/footer/data/api.ts @@ -1,4 +1,9 @@ -import { getAuthenticatedHttpClient, getAuthenticatedUser, getConfig, updateLocale } from '../../../../runtime'; +import { + getAuthenticatedHttpClient, + getAuthenticatedUser, + getConfig, + updateLocale +} from '../../../runtime'; export async function updateSiteLanguage(locale: string) { const user = getAuthenticatedUser(); diff --git a/shell/footer/new-footer/data/hooks.ts b/shell/footer/data/hooks.ts similarity index 78% rename from shell/footer/new-footer/data/hooks.ts rename to shell/footer/data/hooks.ts index d624670e..523b40a8 100644 --- a/shell/footer/new-footer/data/hooks.ts +++ b/shell/footer/data/hooks.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; -import { ResolvedFooterConfig } from '../../../../types'; -import { useActiveAppId } from '../../../data/hooks'; +import { ResolvedFooterConfig } from '../../../types'; +import { useActiveAppId } from '../../data/hooks'; import { resolveFooterConfig } from './utils'; export default function useResolvedFooterConfig() { diff --git a/shell/footer/new-footer/data/utils.ts b/shell/footer/data/utils.ts similarity index 89% rename from shell/footer/new-footer/data/utils.ts rename to shell/footer/data/utils.ts index 418e8f29..a07bf17e 100644 --- a/shell/footer/new-footer/data/utils.ts +++ b/shell/footer/data/utils.ts @@ -1,9 +1,9 @@ -import { getConfig } from '../../../../runtime'; -import { getAppUrl } from '../../../../runtime/routing'; +import { getConfig } from '../../../runtime'; +import { getAppUrl } from '../../../runtime/routing'; import { ConfigurableAppConfig, FooterConfig, ResolvedFooterConfig -} from '../../../../types'; -import isConfigurableApp from '../../../data/isConfigurableApp'; +} from '../../../types'; +import isConfigurableApp from '../../data/isConfigurableApp'; import { centerLinks, copyrightNotice, leftLinks, revealMenu, rightLinks } from '../defaults'; function overrideFooterConfig(base: ResolvedFooterConfig, override: FooterConfig) { diff --git a/shell/footer/new-footer/defaults.tsx b/shell/footer/defaults.tsx similarity index 87% rename from shell/footer/new-footer/defaults.tsx rename to shell/footer/defaults.tsx index 427bfec9..1f451461 100644 --- a/shell/footer/new-footer/defaults.tsx +++ b/shell/footer/defaults.tsx @@ -1,4 +1,5 @@ -import { ChildMenuItem, LabeledMenu } from '../../../types'; +import { ChildMenuItem, LabeledMenu } from '../../types'; + import CopyrightNotice from './CopyrightNotice'; import LanguageMenu from './LanguageMenu'; import Logo from './Logo'; diff --git a/shell/header/anonymous-menu/AnonymousMenuItem.tsx b/shell/header/anonymous-menu/AnonymousMenuItem.tsx index f525a3d7..c0c1c5aa 100644 --- a/shell/header/anonymous-menu/AnonymousMenuItem.tsx +++ b/shell/header/anonymous-menu/AnonymousMenuItem.tsx @@ -5,8 +5,12 @@ import { MenuItem } from '../../../types'; import { getAppUrl } from '../../../runtime/routing'; import { - getItemLabel, isAppMenuItem, isDropdownMenuItem, isReactNodeMenuItem, isUrlMenuItem -} from '../data/utils'; + getItemLabel, + isAppMenuItem, + isDropdownMenuItem, + isReactNodeMenuItem, + isUrlMenuItem +} from '../../menus/data/utils'; import NavLinkDropdown from '../nav-links/NavLinkDropdown'; interface AnonymousMenuItemProps { diff --git a/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx b/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx index 06ea1ecd..f8d798cf 100644 --- a/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx +++ b/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx @@ -11,7 +11,7 @@ import { isAppMenuItem, isReactNodeMenuItem, isUrlMenuItem -} from '../data/utils'; +} from '../../menus/data/utils'; interface AuthenticatedMenuItemProps { item: MenuItem, diff --git a/shell/header/data/utils.ts b/shell/header/data/utils.ts index 459d3294..146853e2 100644 --- a/shell/header/data/utils.ts +++ b/shell/header/data/utils.ts @@ -1,13 +1,9 @@ -import { isValidElement, ReactElement, ReactNode } from 'react'; -import { IntlShape, MessageDescriptor } from 'react-intl'; import { getConfig } from '../../../runtime'; import { getAppUrl } from '../../../runtime/routing'; import { - AppMenuItem, ConfigurableAppConfig, - DropdownMenuItem, HeaderConfig, LinkMenuItem, MenuItem, - ResolvedHeaderConfig, - UrlMenuItem + HeaderConfig, + ResolvedHeaderConfig } from '../../../types'; import isConfigurableApp from '../../data/isConfigurableApp'; import { @@ -17,38 +13,6 @@ import { secondaryLinks } from '../defaults'; -// A name can be a string or a react-intl MessageDescriptor. -export function getItemLabel(item: LinkMenuItem | DropdownMenuItem, intl: IntlShape): ReactNode { - const { label } = item; - - if (typeof label === 'string') { - return label; - } - - if (isValidElement(label)) { - return label; - } - - // If it's not a valid element, it's a MessageDescriptor. - return intl.formatMessage(label as MessageDescriptor); -} - -export function isAppMenuItem(item: MenuItem): item is AppMenuItem { - return item && typeof item === 'object' && 'appId' in item; -} - -export function isUrlMenuItem(item: MenuItem): item is UrlMenuItem { - return item && typeof item === 'object' && 'url' in item; -} - -export function isReactNodeMenuItem(item: LinkMenuItem | DropdownMenuItem | ReactElement): item is ReactElement { - return isValidElement(item); -} - -export function isDropdownMenuItem(item: MenuItem): item is DropdownMenuItem { - return item && typeof item === 'object' && 'items' in item; -} - function overrideHeaderConfig(base: ResolvedHeaderConfig, override: HeaderConfig) { if (override.logoUrl !== undefined) { base.logoUrl = override.logoUrl; diff --git a/shell/header/nav-links/NavLinkDropdown.tsx b/shell/header/nav-links/NavLinkDropdown.tsx index 9b9f00db..c1c2f6a4 100644 --- a/shell/header/nav-links/NavLinkDropdown.tsx +++ b/shell/header/nav-links/NavLinkDropdown.tsx @@ -5,7 +5,7 @@ import { } from '../../../types'; import { getItemLabel -} from '../data/utils'; +} from '../../menus/data/utils'; import NavLinkDropdownItem from './NavLinkDropdownItem'; interface NavLinkDropdownProps { diff --git a/shell/header/nav-links/NavLinkDropdownItem.tsx b/shell/header/nav-links/NavLinkDropdownItem.tsx index 02a75baa..4b74d88d 100644 --- a/shell/header/nav-links/NavLinkDropdownItem.tsx +++ b/shell/header/nav-links/NavLinkDropdownItem.tsx @@ -5,8 +5,11 @@ import { ChildMenuItem } from '../../../types'; import { - getItemLabel, isAppMenuItem, isReactNodeMenuItem, isUrlMenuItem -} from '../data/utils'; + getItemLabel, + isAppMenuItem, + isReactNodeMenuItem, + isUrlMenuItem +} from '../../menus/data/utils'; interface NavLinkDropdownItemProps { item: ChildMenuItem, diff --git a/shell/header/nav-links/NavLinksItem.tsx b/shell/header/nav-links/NavLinksItem.tsx index 75cf0344..d1c832eb 100644 --- a/shell/header/nav-links/NavLinksItem.tsx +++ b/shell/header/nav-links/NavLinksItem.tsx @@ -5,8 +5,12 @@ import { MenuItem } from '../../../types'; import { - getItemLabel, isAppMenuItem, isDropdownMenuItem, isReactNodeMenuItem, isUrlMenuItem -} from '../data/utils'; + getItemLabel, + isAppMenuItem, + isDropdownMenuItem, + isReactNodeMenuItem, + isUrlMenuItem +} from '../../menus/data/utils'; import NavLinkDropdown from './NavLinkDropdown'; interface NavLinksItemProps { diff --git a/shell/menus/data/utils.ts b/shell/menus/data/utils.ts new file mode 100644 index 00000000..5418c076 --- /dev/null +++ b/shell/menus/data/utils.ts @@ -0,0 +1,40 @@ +import { isValidElement, ReactElement, ReactNode } from 'react'; +import { IntlShape, MessageDescriptor } from 'react-intl'; + +import { + AppMenuItem, + DropdownMenuItem, + LinkMenuItem, MenuItem, + UrlMenuItem +} from '../../../types'; +// A name can be a string or a react-intl MessageDescriptor. +export function getItemLabel(item: LinkMenuItem | DropdownMenuItem, intl: IntlShape): ReactNode { + const { label } = item; + + if (typeof label === 'string') { + return label; + } + + if (isValidElement(label)) { + return label; + } + + // If it's not a valid element, it's a MessageDescriptor. + return intl.formatMessage(label as MessageDescriptor); +} + +export function isAppMenuItem(item: MenuItem): item is AppMenuItem { + return item && typeof item === 'object' && 'appId' in item; +} + +export function isUrlMenuItem(item: MenuItem): item is UrlMenuItem { + return item && typeof item === 'object' && 'url' in item; +} + +export function isReactNodeMenuItem(item: LinkMenuItem | DropdownMenuItem | ReactElement): item is ReactElement { + return isValidElement(item); +} + +export function isDropdownMenuItem(item: MenuItem): item is DropdownMenuItem { + return item && typeof item === 'object' && 'items' in item; +} From afbdb7fa8de91868816863ef2a7a6f0bf44f5a1a Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 11:54:42 -0400 Subject: [PATCH 41/75] refactor: de-duplicating AnonymousMenuItem and NavLinksItem The two components were basically identical; this is step one of trying to make sense of all these customizable item components. --- shell/header/anonymous-menu/AnonymousMenu.tsx | 4 +- .../anonymous-menu/AnonymousMenuItem.tsx | 62 ------------------- shell/header/nav-links/NavLinksItem.tsx | 7 +++ 3 files changed, 9 insertions(+), 64 deletions(-) delete mode 100644 shell/header/anonymous-menu/AnonymousMenuItem.tsx diff --git a/shell/header/anonymous-menu/AnonymousMenu.tsx b/shell/header/anonymous-menu/AnonymousMenu.tsx index c00eacf2..5728faac 100644 --- a/shell/header/anonymous-menu/AnonymousMenu.tsx +++ b/shell/header/anonymous-menu/AnonymousMenu.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import { useContext } from 'react'; import HeaderContext from '../HeaderContext'; -import AnonymousMenuItem from './AnonymousMenuItem'; +import NavLinksItem from '../nav-links/NavLinksItem'; interface AnonymousMenuProps { className?: string, @@ -15,7 +15,7 @@ export default function AnonymousMenu({ className }: AnonymousMenuProps) { {anonymousLinks.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))}
); diff --git a/shell/header/anonymous-menu/AnonymousMenuItem.tsx b/shell/header/anonymous-menu/AnonymousMenuItem.tsx deleted file mode 100644 index c0c1c5aa..00000000 --- a/shell/header/anonymous-menu/AnonymousMenuItem.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { NavLink } from '@openedx/paragon'; -import { useIntl } from 'react-intl'; - -import { MenuItem } from '../../../types'; - -import { getAppUrl } from '../../../runtime/routing'; -import { - getItemLabel, - isAppMenuItem, - isDropdownMenuItem, - isReactNodeMenuItem, - isUrlMenuItem -} from '../../menus/data/utils'; -import NavLinkDropdown from '../nav-links/NavLinkDropdown'; - -interface AnonymousMenuItemProps { - item: MenuItem, -} - -export default function AnonymousMenuItem({ item }: AnonymousMenuItemProps) { - const intl = useIntl(); - - // If the item is falsy for whatever reason, just return null. - if (!item) { - return null; - } - if (isReactNodeMenuItem(item)) { - return item; - } - - if (isAppMenuItem(item)) { - const url = getAppUrl(item.appId); - // If the app in question is not loaded, then the url may be null. If this is the case, - // we just don't bother to try to show the link. This helps us keep configuration logic - // simpler. - if (url !== null) { - const label = getItemLabel(item, intl); - return ( - - {label} - - ); - } - return null; - } - if (isUrlMenuItem(item)) { - const label = getItemLabel(item, intl); - return ( - - {label} - - ); - } - if (isDropdownMenuItem(item)) { - return ( - - ); - } - // If the item is something we haven't accounted for above, we don't know - // how to display it here. Just return null. - return null; -} diff --git a/shell/header/nav-links/NavLinksItem.tsx b/shell/header/nav-links/NavLinksItem.tsx index d1c832eb..414afee5 100644 --- a/shell/header/nav-links/NavLinksItem.tsx +++ b/shell/header/nav-links/NavLinksItem.tsx @@ -1,5 +1,6 @@ import { NavLink } from '@openedx/paragon'; import { useIntl } from 'react-intl'; + import { getAppUrl } from '../../../runtime/routing'; import { MenuItem @@ -20,9 +21,15 @@ interface NavLinksItemProps { export default function NavLinksItem({ item }: NavLinksItemProps) { const intl = useIntl(); + // If the item is falsy for whatever reason, just return null. + if (!item) { + return null; + } + if (isReactNodeMenuItem(item)) { return item; } + if (isAppMenuItem(item)) { const url = getAppUrl(item.appId); // If the app in question is not loaded, then the url may be null. If this is the case, From 4d6efc136ca21916c8554a66e48491d125b27f9e Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 11:55:15 -0400 Subject: [PATCH 42/75] fix: adjusting shell dev project child path --- shell/site.config.dev.shell.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/site.config.dev.shell.tsx b/shell/site.config.dev.shell.tsx index 189a4ee3..0c1549ef 100644 --- a/shell/site.config.dev.shell.tsx +++ b/shell/site.config.dev.shell.tsx @@ -36,10 +36,10 @@ const config: ProjectSiteConfig = { label: 'Child Help', appId: 'support', } - ] + ], }, route: { - path: '/child1', + path: 'child1', Component: ChildOnePage, } } From cd7809bd1df682a8f89c094c32dae88546d1d106 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 14:23:38 -0400 Subject: [PATCH 43/75] refactor: simplifying and DRYing up menu item components --- .../{LinkGridItem.tsx => HyperlinkItem.tsx} | 4 +- shell/footer/LeftLinks.tsx | 4 +- shell/footer/LinkGrid.tsx | 4 +- shell/footer/LinkRowItem.tsx | 51 ------------------ shell/footer/RevealLinks.tsx | 4 +- shell/footer/RightLinks.tsx | 4 +- shell/header/anonymous-menu/AnonymousMenu.tsx | 4 +- .../authenticated-menu/AuthenticatedMenu.tsx | 4 +- .../DropdownItem.tsx} | 26 ++++++---- shell/header/nav-links/NavLinkDropdown.tsx | 4 +- .../header/nav-links/NavLinkDropdownItem.tsx | 52 ------------------- .../{NavLinksItem.tsx => NavLinkItem.tsx} | 4 +- shell/header/nav-links/NavLinks.tsx | 4 +- 13 files changed, 35 insertions(+), 134 deletions(-) rename shell/footer/{LinkGridItem.tsx => HyperlinkItem.tsx} (92%) delete mode 100644 shell/footer/LinkRowItem.tsx rename shell/header/{authenticated-menu/AuthenticatedMenuItem.tsx => nav-links/DropdownItem.tsx} (73%) delete mode 100644 shell/header/nav-links/NavLinkDropdownItem.tsx rename shell/header/nav-links/{NavLinksItem.tsx => NavLinkItem.tsx} (93%) diff --git a/shell/footer/LinkGridItem.tsx b/shell/footer/HyperlinkItem.tsx similarity index 92% rename from shell/footer/LinkGridItem.tsx rename to shell/footer/HyperlinkItem.tsx index 8d940469..ab0ca605 100644 --- a/shell/footer/LinkGridItem.tsx +++ b/shell/footer/HyperlinkItem.tsx @@ -12,11 +12,11 @@ import { isUrlMenuItem } from '../menus/data/utils'; -interface NavLinksItemProps { +interface HyperlinkItemProps { item: ChildMenuItem, } -export default function LinkGridItem({ item }: NavLinksItemProps) { +export default function HyperlinkItem({ item }: HyperlinkItemProps) { const intl = useIntl(); if (isReactNodeMenuItem(item)) { diff --git a/shell/footer/LeftLinks.tsx b/shell/footer/LeftLinks.tsx index 07d175f7..6db89ad4 100644 --- a/shell/footer/LeftLinks.tsx +++ b/shell/footer/LeftLinks.tsx @@ -1,7 +1,7 @@ import { useContext } from 'react'; import FooterContext from './FooterContext'; -import LinkRowItem from './LinkRowItem'; +import HyperlinkItem from './HyperlinkItem'; export default function LeftLinks() { const { leftLinks } = useContext(FooterContext); @@ -11,7 +11,7 @@ export default function LeftLinks() { {leftLinks.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))}
); diff --git a/shell/footer/LinkGrid.tsx b/shell/footer/LinkGrid.tsx index 7514853e..12d38719 100644 --- a/shell/footer/LinkGrid.tsx +++ b/shell/footer/LinkGrid.tsx @@ -1,7 +1,7 @@ // TODO: Do something better than using the array index here. /* eslint-disable react/no-array-index-key */ import { LabeledMenu } from '../../types'; -import LinkGridItem from './LinkGridItem'; +import HyperlinkItem from './HyperlinkItem'; interface LinkGridProps { items: LabeledMenu[], @@ -13,7 +13,7 @@ export default function LinkGrid({ items }: LinkGridProps) {
{menu.label}
{menu.links.map((item, index) => ( - + ))}
))} diff --git a/shell/footer/LinkRowItem.tsx b/shell/footer/LinkRowItem.tsx deleted file mode 100644 index c495cae7..00000000 --- a/shell/footer/LinkRowItem.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Hyperlink } from '@openedx/paragon'; -import { useIntl } from 'react-intl'; - -import { getAppUrl } from '../../runtime/routing'; -import { - ChildMenuItem -} from '../../types'; -import { - getItemLabel, - isAppMenuItem, - isReactNodeMenuItem, - isUrlMenuItem -} from '../menus/data/utils'; - -interface LinkRowItemProps { - item: ChildMenuItem, -} - -export default function LinkRowItem({ item }: LinkRowItemProps) { - const intl = useIntl(); - - if (isReactNodeMenuItem(item)) { - return item; - } - if (isAppMenuItem(item)) { - const url = getAppUrl(item.appId); - // If the app in question is not loaded, then the url may be null. If this is the case, - // we just don't bother to try to show the link. This helps us keep configuration logic - // simpler. - if (url !== null) { - const label = getItemLabel(item, intl); - return ( - - {label} - - ); - } - return null; - } - if (isUrlMenuItem(item)) { - const label = getItemLabel(item, intl); - return ( - - {label} - - ); - } - // If the item is something we haven't accounted for above, we don't know - // how to display it here. Just return null. - return null; -} diff --git a/shell/footer/RevealLinks.tsx b/shell/footer/RevealLinks.tsx index 8767a492..51db95fe 100644 --- a/shell/footer/RevealLinks.tsx +++ b/shell/footer/RevealLinks.tsx @@ -3,7 +3,7 @@ import { ExpandLess, ExpandMore } from '@openedx/paragon/icons'; import { useContext } from 'react'; import FooterContext from './FooterContext'; -import LinkRowItem from './LinkRowItem'; +import HyperlinkItem from './HyperlinkItem'; export default function RevealLinks() { const { revealMenu } = useContext(FooterContext); @@ -38,7 +38,7 @@ export default function RevealLinks() { {links.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))}
diff --git a/shell/footer/RightLinks.tsx b/shell/footer/RightLinks.tsx index 9e379740..d5a0fbf0 100644 --- a/shell/footer/RightLinks.tsx +++ b/shell/footer/RightLinks.tsx @@ -1,7 +1,7 @@ import { useContext } from 'react'; import FooterContext from './FooterContext'; -import LinkRowItem from './LinkRowItem'; +import HyperlinkItem from './HyperlinkItem'; export default function RightLinks() { const { rightLinks } = useContext(FooterContext); @@ -11,7 +11,7 @@ export default function RightLinks() { {rightLinks.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))}
); diff --git a/shell/header/anonymous-menu/AnonymousMenu.tsx b/shell/header/anonymous-menu/AnonymousMenu.tsx index 5728faac..13b87b33 100644 --- a/shell/header/anonymous-menu/AnonymousMenu.tsx +++ b/shell/header/anonymous-menu/AnonymousMenu.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import { useContext } from 'react'; import HeaderContext from '../HeaderContext'; -import NavLinksItem from '../nav-links/NavLinksItem'; +import NavLinkItem from '../nav-links/NavLinkItem'; interface AnonymousMenuProps { className?: string, @@ -15,7 +15,7 @@ export default function AnonymousMenu({ className }: AnonymousMenuProps) { {anonymousLinks.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))}
); diff --git a/shell/header/authenticated-menu/AuthenticatedMenu.tsx b/shell/header/authenticated-menu/AuthenticatedMenu.tsx index d143bb68..9a72e647 100644 --- a/shell/header/authenticated-menu/AuthenticatedMenu.tsx +++ b/shell/header/authenticated-menu/AuthenticatedMenu.tsx @@ -7,7 +7,7 @@ import { } from '../../../runtime'; import HeaderContext from '../HeaderContext'; -import AuthenticatedMenuItem from './AuthenticatedMenuItem'; +import DropdownItem from '../nav-links/DropdownItem'; interface AuthenticatedMenuProps { className?: string, @@ -30,7 +30,7 @@ export default function AuthenticatedMenu({ className }: AuthenticatedMenuProps) {authenticatedLinks.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))} ); diff --git a/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx b/shell/header/nav-links/DropdownItem.tsx similarity index 73% rename from shell/header/authenticated-menu/AuthenticatedMenuItem.tsx rename to shell/header/nav-links/DropdownItem.tsx index f8d798cf..66f9ae1c 100644 --- a/shell/header/authenticated-menu/AuthenticatedMenuItem.tsx +++ b/shell/header/nav-links/DropdownItem.tsx @@ -1,11 +1,9 @@ -import { Dropdown } from '@openedx/paragon'; +import { Dropdown, NavDropdown } from '@openedx/paragon'; import { useIntl } from 'react-intl'; - import { getAppUrl } from '../../../runtime/routing'; import { - MenuItem + ChildMenuItem } from '../../../types'; - import { getItemLabel, isAppMenuItem, @@ -13,20 +11,25 @@ import { isUrlMenuItem } from '../../menus/data/utils'; -interface AuthenticatedMenuItemProps { - item: MenuItem, +interface DropdownItemProps { + item: ChildMenuItem, + as?: typeof Dropdown.Item | typeof NavDropdown.Item, } -export default function AuthenticatedMenuItem({ item }: AuthenticatedMenuItemProps) { +export default function DropdownItem({ item, as = Dropdown.Item }: DropdownItemProps) { const intl = useIntl(); + const Component = as; + // If the item is falsy for whatever reason, just return null. if (!item) { return null; } + if (isReactNodeMenuItem(item)) { return item; } + if (isAppMenuItem(item)) { const url = getAppUrl(item.appId); // If the app in question is not loaded, then the url may be null. If this is the case, @@ -35,9 +38,9 @@ export default function AuthenticatedMenuItem({ item }: AuthenticatedMenuItemPro if (url !== null) { const label = getItemLabel(item, intl); return ( - + {label} - + ); } return null; @@ -45,11 +48,12 @@ export default function AuthenticatedMenuItem({ item }: AuthenticatedMenuItemPro if (isUrlMenuItem(item)) { const label = getItemLabel(item, intl); return ( - + {label} - + ); } + // If the item is something we haven't accounted for above, we don't know // how to display it here. Just return null. return null; diff --git a/shell/header/nav-links/NavLinkDropdown.tsx b/shell/header/nav-links/NavLinkDropdown.tsx index c1c2f6a4..d4083591 100644 --- a/shell/header/nav-links/NavLinkDropdown.tsx +++ b/shell/header/nav-links/NavLinkDropdown.tsx @@ -6,7 +6,7 @@ import { import { getItemLabel } from '../../menus/data/utils'; -import NavLinkDropdownItem from './NavLinkDropdownItem'; +import DropdownItem from './DropdownItem'; interface NavLinkDropdownProps { item: DropdownMenuItem, @@ -20,7 +20,7 @@ export default function NavLinkDropdown({ item }: NavLinkDropdownProps) { {item.items.map((subItem, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))} ); diff --git a/shell/header/nav-links/NavLinkDropdownItem.tsx b/shell/header/nav-links/NavLinkDropdownItem.tsx deleted file mode 100644 index 4b74d88d..00000000 --- a/shell/header/nav-links/NavLinkDropdownItem.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { NavDropdown } from '@openedx/paragon'; -import { useIntl } from 'react-intl'; -import { getAppUrl } from '../../../runtime/routing'; -import { - ChildMenuItem -} from '../../../types'; -import { - getItemLabel, - isAppMenuItem, - isReactNodeMenuItem, - isUrlMenuItem -} from '../../menus/data/utils'; - -interface NavLinkDropdownItemProps { - item: ChildMenuItem, -} - -export default function NavLinkDropdownItem({ item }: NavLinkDropdownItemProps) { - const intl = useIntl(); - - if (isReactNodeMenuItem(item)) { - return item; - } - - if (isAppMenuItem(item)) { - const url = getAppUrl(item.appId); - // If the app in question is not loaded, then the url may be null. If this is the case, - // we just don't bother to try to show the link. This helps us keep configuration logic - // simpler. - if (url !== null) { - const label = getItemLabel(item, intl); - return ( - - {label} - - ); - } - return null; - } - if (isUrlMenuItem(item)) { - const label = getItemLabel(item, intl); - return ( - - {label} - - ); - } - - // If the item is something we haven't accounted for above, we don't know - // how to display it here. Just return null. - return null; -} diff --git a/shell/header/nav-links/NavLinksItem.tsx b/shell/header/nav-links/NavLinkItem.tsx similarity index 93% rename from shell/header/nav-links/NavLinksItem.tsx rename to shell/header/nav-links/NavLinkItem.tsx index 414afee5..8999995f 100644 --- a/shell/header/nav-links/NavLinksItem.tsx +++ b/shell/header/nav-links/NavLinkItem.tsx @@ -14,11 +14,11 @@ import { } from '../../menus/data/utils'; import NavLinkDropdown from './NavLinkDropdown'; -interface NavLinksItemProps { +interface NavLinkItemProps { item: MenuItem, } -export default function NavLinksItem({ item }: NavLinksItemProps) { +export default function NavLinkItem({ item }: NavLinkItemProps) { const intl = useIntl(); // If the item is falsy for whatever reason, just return null. diff --git a/shell/header/nav-links/NavLinks.tsx b/shell/header/nav-links/NavLinks.tsx index 20b878a5..943d71e2 100644 --- a/shell/header/nav-links/NavLinks.tsx +++ b/shell/header/nav-links/NavLinks.tsx @@ -2,7 +2,7 @@ import { Nav } from '@openedx/paragon'; import { MenuItem } from '../../../types'; -import NavLinksItem from './NavLinksItem'; +import NavLinkItem from './NavLinkItem'; interface NavLinksProps { items: MenuItem[], @@ -15,7 +15,7 @@ export default function NavLinks({ items, className }: NavLinksProps) { {items.map((item, index) => ( // TODO: Do something better than using the array index here. // eslint-disable-next-line react/no-array-index-key - + ))} ); From 5bbf1832ce1284233dc5fe0533b376e77a535587 Mon Sep 17 00:00:00 2001 From: David Joy Date: Fri, 1 Nov 2024 16:00:12 -0400 Subject: [PATCH 44/75] fix(style): adjusting header padding in mobile/desktop layouts --- shell/header/Header.tsx | 4 ++-- shell/header/desktop/DesktopLayout.tsx | 2 +- shell/header/mobile/MobileLayout.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/shell/header/Header.tsx b/shell/header/Header.tsx index 8d7b795a..53dbac66 100644 --- a/shell/header/Header.tsx +++ b/shell/header/Header.tsx @@ -13,8 +13,8 @@ export default function Header() { return ( -
-