diff --git a/extensions/laravel-forge/CHANGELOG.md b/extensions/laravel-forge/CHANGELOG.md new file mode 100644 index 0000000000000..872a218bd0a0c --- /dev/null +++ b/extensions/laravel-forge/CHANGELOG.md @@ -0,0 +1,8 @@ +# Laravel Forge Changelog + +## [Better search and updated UI] - 2022-04-02 +- Update Raycast deprecated components +- Add new transition and error views +- Add server search by site and site alias +- Add positional breadcrumbs to show server/site relationship +- Various type improvements and code tweaks diff --git a/extensions/laravel-forge/README.md b/extensions/laravel-forge/README.md index 617cebd431268..70451dd8bff19 100644 --- a/extensions/laravel-forge/README.md +++ b/extensions/laravel-forge/README.md @@ -4,3 +4,4 @@ A command center for sites managed by [Laravel Forge](https://forge.laravel.com/ Get an API token here: https://forge.laravel.com/user-profile/api Source repo: https://github.com/KevinBatdorf/laravel-forge-raycast + diff --git a/extensions/laravel-forge/assets/forge-icon-64.png b/extensions/laravel-forge/assets/forge-icon-64.png new file mode 100644 index 0000000000000..4fe4a0a947cbe Binary files /dev/null and b/extensions/laravel-forge/assets/forge-icon-64.png differ diff --git a/extensions/laravel-forge/metadata/laravel-forge-01.png b/extensions/laravel-forge/metadata/laravel-forge-01.png new file mode 100644 index 0000000000000..6e78ba50bb970 Binary files /dev/null and b/extensions/laravel-forge/metadata/laravel-forge-01.png differ diff --git a/extensions/laravel-forge/metadata/laravel-forge-02.png b/extensions/laravel-forge/metadata/laravel-forge-02.png new file mode 100644 index 0000000000000..130ea7d0f04cc Binary files /dev/null and b/extensions/laravel-forge/metadata/laravel-forge-02.png differ diff --git a/extensions/laravel-forge/metadata/laravel-forge-03.png b/extensions/laravel-forge/metadata/laravel-forge-03.png new file mode 100644 index 0000000000000..4f6c8a9d4180d Binary files /dev/null and b/extensions/laravel-forge/metadata/laravel-forge-03.png differ diff --git a/extensions/laravel-forge/package-lock.json b/extensions/laravel-forge/package-lock.json index fe0404b38a0aa..402c4bc01abae 100644 --- a/extensions/laravel-forge/package-lock.json +++ b/extensions/laravel-forge/package-lock.json @@ -7,21 +7,21 @@ "name": "laravel-forge", "license": "MIT", "dependencies": { - "@raycast/api": "^1.26.3", + "@raycast/api": "^1.31.0", "lodash": "^4.17.21", - "node-fetch": "^3.1.0" + "node-fetch": "^3.2.3" }, "devDependencies": { - "@types/lodash": "^4.14.178", - "@types/node": "~17.0.1", - "@types/react": "^17.0.37", - "@typescript-eslint/eslint-plugin": "^5.7.0", - "@typescript-eslint/parser": "^5.7.0", - "eslint": "^8.5.0", - "eslint-config-prettier": "^8.3.0", - "prettier": "2.5.1", - "react-devtools": "^4.22.1", - "typescript": "^4.5.4" + "@types/lodash": "^4.14.181", + "@types/node": "~17.0.23", + "@types/react": "^17.0.43", + "@typescript-eslint/eslint-plugin": "^5.17.0", + "@typescript-eslint/parser": "^5.17.0", + "eslint": "^8.12.0", + "eslint-config-prettier": "^8.5.0", + "prettier": "2.6.1", + "react-devtools": "^4.24.3", + "typescript": "^4.6.3" } }, "node_modules/@electron/get": { @@ -56,16 +56,16 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", @@ -75,15 +75,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", @@ -140,9 +131,9 @@ } }, "node_modules/@raycast/api": { - "version": "1.26.3", - "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.26.3.tgz", - "integrity": "sha512-S/HULQU1RpFVwtiSFnajiMGhgr0CeiiL0GRNToTq1pAuaeSsgt5O+e0OUgDjb1ew8dam43s2UCLQhnzBg0u+jg==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.31.0.tgz", + "integrity": "sha512-kXeKWwew/6Qjj9UP2RVGqQdjFIscNO1HHsO0jMX2rKkOw1lP5SmtBlt/gi7d7z7P6A3BvZFeZFHv7ytsMj9QPA==", "bin": { "ray": "bin/ray" }, @@ -173,21 +164,21 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==", "dev": true }, "node_modules/@types/node": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.1.tgz", - "integrity": "sha512-NXKvBVUzIbs6ylBwmOwHFkZS2EXCcjnqr8ZCRNaXBkHAf+3mn/rPcJxwrzuc6movh8fxQAsUUfYklJ/EG+hZqQ==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "node_modules/@types/prop-types": { @@ -197,9 +188,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", - "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", + "version": "17.0.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz", + "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -214,13 +205,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", - "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.7.0", - "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -245,18 +237,16 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", - "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", + "node_modules/@typescript-eslint/parser": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "debug": "^4.3.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -266,19 +256,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", - "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", - "debug": "^4.3.2" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -286,24 +279,17 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", - "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0" + "@typescript-eslint/utils": "5.17.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -311,12 +297,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", - "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -327,13 +321,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", - "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -353,13 +347,37 @@ } } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", - "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/types": "5.17.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -371,9 +389,9 @@ } }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -459,15 +477,6 @@ "node": ">=4" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1075,18 +1084,6 @@ "once": "^1.4.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -1116,24 +1113,23 @@ } }, "node_modules/eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", - "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1141,7 +1137,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -1152,9 +1148,7 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", @@ -1171,9 +1165,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -1223,18 +1217,18 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -1253,24 +1247,15 @@ "node": ">=4.0" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "dependencies": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1460,9 +1445,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1472,7 +1457,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { @@ -1518,9 +1503,9 @@ } }, "node_modules/fetch-blob": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", - "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", + "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", "funding": [ { "type": "github", @@ -1532,6 +1517,7 @@ } ], "dependencies": { + "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" }, "engines": { @@ -1709,9 +1695,9 @@ } }, "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1740,16 +1726,16 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -1803,9 +1789,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -2162,13 +2148,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -2225,13 +2211,31 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", - "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz", + "integrity": "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==", "dependencies": { "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.2", + "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" }, "engines": { @@ -2477,9 +2481,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -2516,15 +2520,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/process-nextick-args": { @@ -2632,16 +2639,16 @@ } }, "node_modules/react-devtools": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/react-devtools/-/react-devtools-4.22.1.tgz", - "integrity": "sha512-NrjS3av6mrcnTmxPJCaanNZgYwhp3YYQLFwm7gTxRouQF6abKYo8uZ4RdONIDFDmwiB0zg6mM83RTMjRSJgGiA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/react-devtools/-/react-devtools-4.24.3.tgz", + "integrity": "sha512-N9N4oiaePi2zYBNg2YXP2JlkQt1kWS2NfrYNtxlhR/IXKJeSBfGwOFFVRe5b7bxEroStzTD4xEa8Bqk2ieeTKA==", "dev": true, "dependencies": { "cross-spawn": "^5.0.1", "electron": "^11.1.0", "ip": "^1.1.4", "minimist": "^1.2.3", - "react-devtools-core": "4.22.1", + "react-devtools-core": "4.24.3", "update-notifier": "^2.1.0" }, "bin": { @@ -2649,9 +2656,9 @@ } }, "node_modules/react-devtools-core": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.22.1.tgz", - "integrity": "sha512-pvpNDHE7p0FtcCmIWGazoY8LLVfBI9sw0Kf10kdHhPI9Tzt3OG/qEt16GrAbE0keuna5WzX3r1qPKVjqOqsuUg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.24.3.tgz", + "integrity": "sha512-+htKZxLxDN14jhRG3+IXRiJqNSGHUiPYrMtv9e7qlZxcbKeJjVs+C/hd8kZF5rydp3faBwFN6ZpTaZnLA3/ZGA==", "dev": true, "dependencies": { "shell-quote": "^1.6.1", @@ -3181,9 +3188,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3453,9 +3460,9 @@ } }, "node_modules/ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true, "engines": { "node": ">=8.3.0" @@ -3526,28 +3533,20 @@ } }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } } }, "@humanwhocodes/config-array": { @@ -3594,9 +3593,9 @@ } }, "@raycast/api": { - "version": "1.26.3", - "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.26.3.tgz", - "integrity": "sha512-S/HULQU1RpFVwtiSFnajiMGhgr0CeiiL0GRNToTq1pAuaeSsgt5O+e0OUgDjb1ew8dam43s2UCLQhnzBg0u+jg==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.31.0.tgz", + "integrity": "sha512-kXeKWwew/6Qjj9UP2RVGqQdjFIscNO1HHsO0jMX2rKkOw1lP5SmtBlt/gi7d7z7P6A3BvZFeZFHv7ytsMj9QPA==", "requires": {} }, "@sindresorhus/is": { @@ -3615,21 +3614,21 @@ } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==", "dev": true }, "@types/node": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.1.tgz", - "integrity": "sha512-NXKvBVUzIbs6ylBwmOwHFkZS2EXCcjnqr8ZCRNaXBkHAf+3mn/rPcJxwrzuc6movh8fxQAsUUfYklJ/EG+hZqQ==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "@types/prop-types": { @@ -3639,9 +3638,9 @@ "dev": true }, "@types/react": { - "version": "17.0.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", - "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", + "version": "17.0.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz", + "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==", "dev": true, "requires": { "@types/prop-types": "*", @@ -3656,13 +3655,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.7.0.tgz", - "integrity": "sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.7.0", - "@typescript-eslint/scope-manager": "5.7.0", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3671,56 +3671,53 @@ "tsutils": "^3.21.0" } }, - "@typescript-eslint/experimental-utils": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.7.0.tgz", - "integrity": "sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==", + "@typescript-eslint/parser": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.7.0.tgz", - "integrity": "sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==", + "@typescript-eslint/scope-manager": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.7.0", - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/typescript-estree": "5.7.0", - "debug": "^4.3.2" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" } }, - "@typescript-eslint/scope-manager": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.7.0.tgz", - "integrity": "sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==", + "@typescript-eslint/type-utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0" + "@typescript-eslint/utils": "5.17.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.7.0.tgz", - "integrity": "sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.7.0.tgz", - "integrity": "sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.7.0", - "@typescript-eslint/visitor-keys": "5.7.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -3728,20 +3725,34 @@ "tsutils": "^3.21.0" } }, + "@typescript-eslint/utils": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, "@typescript-eslint/visitor-keys": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.7.0.tgz", - "integrity": "sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.7.0", + "@typescript-eslint/types": "5.17.0", "eslint-visitor-keys": "^3.0.0" } }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { @@ -3805,12 +3816,6 @@ } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4289,15 +4294,6 @@ "once": "^1.4.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -4318,24 +4314,23 @@ "dev": true }, "eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", - "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4343,7 +4338,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -4354,9 +4349,7 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", @@ -4364,9 +4357,9 @@ }, "dependencies": { "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -4378,19 +4371,13 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true } } }, "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, "requires": {} }, @@ -4422,20 +4409,20 @@ } }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "requires": { - "acorn": "^8.6.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" } }, "esquery": { @@ -4594,9 +4581,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -4648,10 +4635,11 @@ } }, "fetch-blob": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", - "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", + "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", "requires": { + "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, @@ -4790,9 +4778,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -4809,16 +4797,16 @@ } }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -4860,9 +4848,9 @@ "dev": true }, "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "import-fresh": { @@ -5144,13 +5132,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mimic-response": { @@ -5195,13 +5183,18 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, "node-fetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", - "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz", + "integrity": "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==", "requires": { "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.2", + "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, @@ -5387,9 +5380,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -5411,9 +5404,9 @@ "dev": true }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==", "dev": true }, "process-nextick-args": { @@ -5494,16 +5487,16 @@ } }, "react-devtools": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/react-devtools/-/react-devtools-4.22.1.tgz", - "integrity": "sha512-NrjS3av6mrcnTmxPJCaanNZgYwhp3YYQLFwm7gTxRouQF6abKYo8uZ4RdONIDFDmwiB0zg6mM83RTMjRSJgGiA==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/react-devtools/-/react-devtools-4.24.3.tgz", + "integrity": "sha512-N9N4oiaePi2zYBNg2YXP2JlkQt1kWS2NfrYNtxlhR/IXKJeSBfGwOFFVRe5b7bxEroStzTD4xEa8Bqk2ieeTKA==", "dev": true, "requires": { "cross-spawn": "^5.0.1", "electron": "^11.1.0", "ip": "^1.1.4", "minimist": "^1.2.3", - "react-devtools-core": "4.22.1", + "react-devtools-core": "4.24.3", "update-notifier": "^2.1.0" }, "dependencies": { @@ -5561,9 +5554,9 @@ } }, "react-devtools-core": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.22.1.tgz", - "integrity": "sha512-pvpNDHE7p0FtcCmIWGazoY8LLVfBI9sw0Kf10kdHhPI9Tzt3OG/qEt16GrAbE0keuna5WzX3r1qPKVjqOqsuUg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.24.3.tgz", + "integrity": "sha512-+htKZxLxDN14jhRG3+IXRiJqNSGHUiPYrMtv9e7qlZxcbKeJjVs+C/hd8kZF5rydp3faBwFN6ZpTaZnLA3/ZGA==", "dev": true, "requires": { "shell-quote": "^1.6.1", @@ -5913,9 +5906,9 @@ "dev": true }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "unique-string": { @@ -6125,9 +6118,9 @@ } }, "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true, "requires": {} }, diff --git a/extensions/laravel-forge/package.json b/extensions/laravel-forge/package.json index 872f1449b9e7a..d6aa0e296c1fa 100644 --- a/extensions/laravel-forge/package.json +++ b/extensions/laravel-forge/package.json @@ -9,6 +9,10 @@ "macbookandrew" ], "license": "MIT", + "categories": [ + "Productivity", + "Developer Tools" + ], "commands": [ { "name": "index", @@ -56,21 +60,21 @@ } ], "dependencies": { - "@raycast/api": "^1.26.3", + "@raycast/api": "^1.31.0", "lodash": "^4.17.21", - "node-fetch": "^3.1.0" + "node-fetch": "^3.2.3" }, "devDependencies": { - "@types/lodash": "^4.14.178", - "@types/node": "~17.0.1", - "@types/react": "^17.0.37", - "@typescript-eslint/eslint-plugin": "^5.7.0", - "@typescript-eslint/parser": "^5.7.0", - "eslint": "^8.5.0", - "eslint-config-prettier": "^8.3.0", - "prettier": "2.5.1", - "react-devtools": "^4.22.1", - "typescript": "^4.5.4" + "@types/lodash": "^4.14.181", + "@types/node": "~17.0.23", + "@types/react": "^17.0.43", + "@typescript-eslint/eslint-plugin": "^5.17.0", + "@typescript-eslint/parser": "^5.17.0", + "eslint": "^8.12.0", + "eslint-config-prettier": "^8.5.0", + "prettier": "2.6.1", + "react-devtools": "^4.24.3", + "typescript": "^4.6.3" }, "scripts": { "build": "ray build -e dist", diff --git a/extensions/laravel-forge/src/Server.tsx b/extensions/laravel-forge/src/Server.tsx index cb87dadaf7437..8b1b8715a20e2 100644 --- a/extensions/laravel-forge/src/Server.tsx +++ b/extensions/laravel-forge/src/Server.tsx @@ -1,15 +1,4 @@ -import { - ActionPanel, - CopyToClipboardAction, - List, - OpenInBrowserAction, - Icon, - preferences, - PushAction, - allLocalStorageItems, - setLocalStorageItem, - LocalStorageValues, -} from "@raycast/api"; +import { ActionPanel, List, Icon, Action, getPreferenceValues, LocalStorage } from "@raycast/api"; import { useEffect, useState } from "react"; import { Server } from "./api/Server"; import { Site } from "./api/Site"; @@ -18,8 +7,9 @@ import { getServerColor, useIsMounted } from "./helpers"; export const ServersList = () => { const [servers, setServers] = useState([]); - const [siteData, setSiteData] = useState({}); + const [siteData, setSiteData] = useState({}); const [loading, setLoading] = useState(true); + const [errorMessage, setErrorMessage] = useState(""); const isMounted = useIsMounted(); /** @@ -33,40 +23,45 @@ export const ServersList = () => { const key = `forge-sites-${serverId.toString()}`; // If the sites already exist in the cache, or not found, do nothign if (siteData[key] || !isMounted.current) return; - const server = servers.find((s) => s.id.toString() === serverId) as IServer; + const server = servers.find((s) => s?.id?.toString() === serverId) as IServer; if (!server) return; const thisSiteData = (await Site.getAll(server)) as ISite[] | undefined; - thisSiteData && (await setLocalStorageItem(`forge-sites-${serverId}`, JSON.stringify(thisSiteData))); + thisSiteData && (await LocalStorage.setItem(`forge-sites-${serverId}`, JSON.stringify(thisSiteData))); }; useEffect(() => { - allLocalStorageItems() + LocalStorage.allItems() .then((data) => { if (!isMounted.current) return; const servers = data["forge-servers"]; delete data["forge-servers"]; - const serverList = JSON.parse(servers?.toString() ?? "[]") as Array; + const serverList = JSON.parse(servers?.toString() ?? "[]") as IServer[]; setServers(serverList?.length ? serverList : []); setSiteData(data ?? {}); }) .finally(() => { if (!isMounted.current) return; - Server.getAll().then(async (servers: Array | undefined) => { - if (!isMounted.current) return; - setLoading(false); - // Add the server list to storage to avoid content flash - servers && setServers(servers); - await setLocalStorageItem("forge-servers", JSON.stringify(servers)); - }); + Server.getAll() + .then(async (servers: Array | undefined) => { + if (!isMounted.current) return; + setLoading(false); + if (!servers?.length) return; + setServers(servers); + // Add the server list to storage to avoid content flash + await LocalStorage.setItem("forge-servers", JSON.stringify(servers)); + }) + .catch((error) => setErrorMessage(error.message)); }); }, []); - if (!servers.length && !loading) { - return ( - - - - ); + if (errorMessage.length) { + return ; + } + if (loading) { + return ; + } + if (!servers.length) { + return ; } return ( @@ -76,7 +71,7 @@ export const ServersList = () => { onSelectionChange={(serverId) => serverId && maybeFetchAndCacheSites(serverId)} > {servers.map((server: IServer) => { - const key = `forge-sites-${server.id.toString()}`; + const key = `forge-sites-${server?.id?.toString()}`; const sites = JSON.parse(siteData[key] ?? "[]") as ISite[]; return ; })} @@ -84,21 +79,29 @@ export const ServersList = () => { ); }; +const EmptyView = ({ title }: { title: string }) => ( + + + +); + const ServerListItem = ({ server, sites }: { server: IServer; sites: ISite[] }) => { + if (!server?.id) return null; return ( - } @@ -114,10 +117,11 @@ const ServerListItem = ({ server, sites }: { server: IServer; sites: ISite[] }) }; const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] }) => { - const sshUser = preferences?.laravel_forge_ssh_user?.value ?? "forge"; + const preferences = getPreferenceValues(); + const sshUser = preferences?.laravel_forge_ssh_user ?? "forge"; return ( - + Sites`}> @@ -129,7 +133,7 @@ const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] } accessoryTitle="forge.laravel.com" actions={ - + } /> @@ -141,7 +145,7 @@ const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] } accessoryTitle={`ssh://${sshUser}@${server.ipAddress}`} actions={ - @@ -156,7 +160,7 @@ const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] } accessoryTitle={server.ipAddress} actions={ - + } /> @@ -169,7 +173,7 @@ const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] } icon={Icon.ArrowClockwise} actions={ - await Server.reboot({ serverId: server.id, token: server.apiToken })} @@ -186,7 +190,7 @@ const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] } icon={Icon.ArrowClockwise} actions={ - @@ -205,48 +209,50 @@ const SingleServerView = ({ server, sites }: { server: IServer; sites: ISite[] } }; export const ServerCommands = ({ server }: { server: IServer }) => { - const sshUser = preferences?.laravel_forge_ssh_user?.value ?? "forge"; + const preferences = getPreferenceValues(); + const sshUser = preferences?.laravel_forge_ssh_user ?? "forge"; return ( <> - - + - Server.reboot({ serverId: server.id, token: server.apiToken })} /> - + ); }; export interface IServer { - apiToken: string; - id: number; - credentialId: string; - name: string; - type: string; - provider: string; - providerId: string; - size: string; - region: string; - dbStatus: string | null; - redisStatus: string | null; - phpVersion: string; - phpCliVersion: string; - databaseType: string; - ipAddress: string; - sshPort: number; - privateIpAddress: string; - blackfireStatus: string | null; - papertrailStatus: string | null; - revoked: boolean; - createdAt: string; - isReady: boolean; - tags: Array; - network: string; + apiToken?: string; + id?: number; + credentialId?: string | null; + name?: string; + type?: string; + provider?: string; + providerId?: string | null; + size?: string; + region?: string; + dbStatus?: string | null; + redisStatus?: string | null; + phpVersion?: string; + phpCliVersion?: string; + databaseType?: string; + ipAddress?: string; + sshPort?: number; + privateIpAddress?: string; + blackfireStatus?: string | null; + papertrailStatus?: string | null; + revoked?: boolean; + createdAt?: string; + isReady?: boolean; + tags?: string[]; + keywords?: string[]; + network?: string[]; } diff --git a/extensions/laravel-forge/src/Site.tsx b/extensions/laravel-forge/src/Site.tsx index 54801c9d82e9f..1363817afadbf 100644 --- a/extensions/laravel-forge/src/Site.tsx +++ b/extensions/laravel-forge/src/Site.tsx @@ -1,13 +1,4 @@ -import { - Icon, - OpenInBrowserAction, - List, - ActionPanel, - PushAction, - CopyToClipboardAction, - Color, - setLocalStorageItem, -} from "@raycast/api"; +import { Icon, List, ActionPanel, Color, Action, LocalStorage } from "@raycast/api"; import { useState } from "react"; import { Site } from "./api/Site"; import { IServer, ServerCommands } from "./Server"; @@ -20,11 +11,11 @@ export const SitesList = ({ server, sites: sitesArray }: { server: IServer; site const isMounted = useIsMounted(); usePolling(() => Site.getAll(server).then(async (sites: ISite[] | undefined) => { - if (isMounted.current && sites?.length) { - setSites(sites); - // Add the server list to storage to avoid content flash - await setLocalStorageItem(`forge-sites-${server.id}`, JSON.stringify(sites)); - } + if (!isMounted.current) return; + if (!sites?.length) return; + setSites(sites); + // Add the server list to storage to avoid content flash + await LocalStorage.setItem(`forge-sites-${server.id}`, JSON.stringify(sites)); }) ); @@ -39,11 +30,12 @@ export const SitesList = ({ server, sites: sitesArray }: { server: IServer; site const SiteListItem = ({ site, server }: { site: ISite; server: IServer }) => { const { icon: stateIcon, text: stateText } = siteStatusState(site); + if (!site?.id) return null; return ( { actions={ - } @@ -80,16 +72,16 @@ export const SitesSingleView = ({ site, server }: { site: ISite; server: IServer return ( <> - + Sites -> ${current.name}`}> - + } /> @@ -120,12 +112,12 @@ export const SitesSingleView = ({ site, server }: { site: ISite; server: IServer accessoryTitle="press to view" actions={ - } /> - @@ -140,7 +132,7 @@ export const SitesSingleView = ({ site, server }: { site: ISite; server: IServer accessoryTitle="press to view" actions={ - } @@ -174,7 +166,7 @@ export const SitesSingleView = ({ site, server }: { site: ISite; server: IServer accessoryTitle={value} actions={ - + } /> @@ -197,7 +189,7 @@ export const SiteCommands = ({ site, server }: { site: ISite; server: IServer }) } return ( <> - Site.deploy(site, server)} /> )} - {url && } + {url && } ); }; export interface ISite { - id: number; - serverIid: number; - name: string; - aliases: Array; - directory: string; - wildcards: boolean; - status: string; - repository: string; - repositoryProvider: string; - repositoryBranch: string; - repositoryStatus: string; - quickDeploy: boolean; - deploymentStatus: string | null; - isOnline: boolean; - projectType: string; - phpVersion: string; - app: string | null; - appStatus: string | null; - slackChannel: string | null; - telegramChatId: string | null; - telegramChatTitle: string | null; - teamsWebhookUrl: string | null; - discordWebhookUrl: string | null; - createdAt: string; - telegramSecret: string; - username: string; - deploymentUrl: string; - isSecured: boolean; - tags: Array; + id?: number; + serverId?: number; + name?: string; + aliases?: string[]; + directory?: string; + wildcards?: boolean; + status?: string; + repository?: string; + repositoryProvider?: string; + repositoryBranch?: string; + repositoryStatus?: string; + quickDeploy?: boolean; + deploymentStatus?: string | null; + isOnline?: boolean; + projectType?: string; + phpVersion?: string; + app?: string | null; + appStatus?: string | null; + slackChannel?: string | null; + telegramChatId?: string | null; + telegramChatTitle?: string | null; + teamsWebhookUrl?: string | null; + discordWebhookUrl?: string | null; + createdAt?: string; + telegramSecret?: string; + username?: string; + deploymentUrl?: string; + isSecured?: boolean; + tags?: string[]; } diff --git a/extensions/laravel-forge/src/api/Server.ts b/extensions/laravel-forge/src/api/Server.ts index b9b4bc25b03eb..108cd9a7ebd79 100644 --- a/extensions/laravel-forge/src/api/Server.ts +++ b/extensions/laravel-forge/src/api/Server.ts @@ -1,10 +1,11 @@ -import { showToast, ToastStyle, popToRoot } from "@raycast/api"; -import { preferences } from "@raycast/api"; +import { showToast, Toast, getPreferenceValues } from "@raycast/api"; import fetch from "node-fetch"; import { IServer } from "../Server"; import { sortBy } from "lodash"; import { FORGE_API_URL } from "../config"; import { mapKeys, camelCase } from "lodash"; +import { SitesResponse } from "./Site"; +import { ISite } from "../Site"; function theHeaders(token: string) { return { @@ -16,14 +17,15 @@ function theHeaders(token: string) { export const Server = { async getAll() { + const preferences = getPreferenceValues(); // Because we have support for two accounts, pass the key through - let servers = await getServers(preferences?.laravel_forge_api_key?.value as string); + let servers = await getServers(preferences?.laravel_forge_api_key as string); - if (preferences?.laravel_forge_api_key_two?.value) { - const serversTwo = await getServers(preferences?.laravel_forge_api_key_two?.value as string); + if (preferences?.laravel_forge_api_key_two) { + const serversTwo = await getServers(preferences?.laravel_forge_api_key_two as string); servers = servers.concat(serversTwo); } - return sortBy(servers, (s) => s.name.toLowerCase()) ?? {}; + return sortBy(servers, (s) => s?.name?.toLowerCase()) ?? {}; }, async reboot({ @@ -32,11 +34,15 @@ export const Server = { key = "", label = "server", }: { - serverId: number | string; - token: string; + serverId?: number | string; + token?: string; key?: string; label?: string; }) { + if (!serverId || !token) { + showToast(Toast.Style.Failure, "Server ID and token are required"); + return; + } const headers = theHeaders(token); const endpoint = key ? `servers/${serverId}/${key}/reboot` : `servers/${serverId}/reboot`; try { @@ -44,10 +50,10 @@ export const Server = { method: "post", headers, }); - showToast(ToastStyle.Success, `Rebooting ${label}...`); + showToast(Toast.Style.Success, `Rebooting ${label}...`); } catch (error) { console.error(error); - showToast(ToastStyle.Failure, `Failed to reboot ${label}`); + showToast(Toast.Style.Failure, `Failed to reboot ${label}`); return; } }, @@ -55,37 +61,54 @@ export const Server = { const getServers = async (token: string) => { const headers = theHeaders(token); + const response = await fetch(`${FORGE_API_URL}/servers`, { + method: "get", + headers, + }); + if (response.status === 401) { + throw new Error("Error authenticating with Forge"); + } + // Get site data which will by searchable along with servers + let keywordsByServer: Record> = {}; try { - const response = await fetch(`${FORGE_API_URL}/servers`, { + const sitesResponse = await fetch(`${FORGE_API_URL}/sites`, { method: "get", headers, }); - if (response.status === 401) { - throw new Error("Error authenticating with Forge"); - } - const serverData = (await response.json()) as ServersResponse; - let servers = serverData?.servers ?? []; - // eslint-disable-next-line - // @ts-expect-error Not sure how to convert Dictionary from lodash to IServer - servers = servers.map((s) => mapKeys(s, (_, k) => camelCase(k)) as IServer); - return servers - .map((server) => { - server.apiToken = token; - return server; - }) - .filter((s) => !s.revoked); + const sitesData = (await sitesResponse.json()) as SitesResponse; + let sites = sitesData?.sites ?? []; + sites = sites?.map((s) => mapKeys(s, (_, k) => camelCase(k)) as ISite); + keywordsByServer = getSiteKeywords(sites); } catch (error) { console.error(error); - await popToRoot(); - if (error instanceof Error) { - showToast(ToastStyle.Failure, error?.message); - return []; - } - showToast(ToastStyle.Failure, "Api request failed"); - return []; + // fail gracefully } + + // Get the server data + const serverData = (await response.json()) as ServersResponse; + let servers = serverData?.servers ?? []; + servers = servers.map((s) => mapKeys(s, (_, k) => camelCase(k)) as IServer); + return servers + .map((server) => { + server.keywords = server?.id && keywordsByServer[server.id] ? [...keywordsByServer[server.id]] : []; + server.apiToken = token; + return server; + }) + .filter((s) => !s.revoked); +}; + +const getSiteKeywords = (sites: ISite[]) => { + return sites?.reduce((acc, site): Record> => { + if (!site?.serverId) return acc; + const keywords = [site?.name ?? "", ...(site?.aliases ?? [])]; + if (!acc[site.serverId]) { + acc[site.serverId] = new Set(); + } + keywords.forEach((keyword) => site?.serverId && acc[site.serverId].add(keyword)); + return acc; + }, >>{}); }; type ServersResponse = { - servers: IServer[]; + servers?: IServer[]; }; diff --git a/extensions/laravel-forge/src/api/Site.ts b/extensions/laravel-forge/src/api/Site.ts index a990b1d5a4f62..899be05677e9b 100644 --- a/extensions/laravel-forge/src/api/Site.ts +++ b/extensions/laravel-forge/src/api/Site.ts @@ -1,4 +1,4 @@ -import { showToast, ToastStyle, Toast } from "@raycast/api"; +import { showToast, Toast } from "@raycast/api"; import fetch from "node-fetch"; import { ISite } from "../Site"; import { sortBy, mapKeys, camelCase } from "lodash"; @@ -16,7 +16,7 @@ function theHeaders(token: string) { export const Site = { async getAll(server: IServer) { - const headers = theHeaders(server.apiToken); + const headers = theHeaders(server?.apiToken ?? ""); try { const response = await fetch(`${FORGE_API_URL}/servers/${server.id}/sites`, { method: "get", @@ -26,22 +26,21 @@ export const Site = { let sites = siteData?.sites ?? []; // do a check to see if the server is returning 200 sites = await Promise.all( - sites.map(async (s) => { - s.isOnline = await checkServerisOnline([...s.aliases, s.name]); + sites?.map(async (s) => { + const urls = [...(s?.aliases ?? []), s?.name ?? ""]; + s.isOnline = await checkServerisOnline(urls); return s; }) ); - // eslint-disable-next-line - // @ts-expect-error Not sure how to convert Dictionary from lodash to IServer sites = sites.map((s) => mapKeys(s, (_, k) => camelCase(k)) as ISite); return sortBy(sites, "name") as ISite[]; } catch (error: unknown) { - showToast(ToastStyle.Failure, (error as ErrorEvent).message); + showToast(Toast.Style.Failure, (error as ErrorEvent).message); return; } }, async get(site: ISite, server: IServer) { - const headers = theHeaders(server.apiToken); + const headers = theHeaders(server?.apiToken ?? ""); try { const response = await fetch(`${FORGE_API_URL}/servers/${server.id}/sites/${site.id}`, { method: "get", @@ -52,13 +51,13 @@ export const Site = { // @ts-expect-error Not sure how to convert Dictionary from lodash to IServer return mapKeys(siteData["site"], (_, k) => camelCase(k)) as ISite; } catch (error: unknown) { - showToast(ToastStyle.Failure, (error as ErrorEvent).message); + showToast(Toast.Style.Failure, (error as ErrorEvent).message); return; } }, async deploy(site: ISite, server: IServer) { - const headers = theHeaders(server.apiToken); - const toast = new Toast({ style: ToastStyle.Animated, title: "Deploying..." }); + const headers = theHeaders(server?.apiToken ?? ""); + const toast = new Toast({ style: Toast.Style.Animated, title: "Deploying..." }); try { toast.show(); await fetch(`${FORGE_API_URL}/servers/${server.id}/sites/${site.id}/deployment/deploy`, { @@ -68,12 +67,12 @@ export const Site = { await new Promise((resolve) => setTimeout(resolve, 3000)); toast.hide(); } catch (error: unknown) { - showToast(ToastStyle.Failure, (error as ErrorEvent).message); + showToast(Toast.Style.Failure, (error as ErrorEvent).message); return; } }, async getConfig(type: "env" | "nginx", site: ISite, server: IServer) { - const headers = theHeaders(server.apiToken); + const headers = theHeaders(server?.apiToken ?? ""); try { const response = await fetch(`${FORGE_API_URL}/servers/${server.id}/sites/${site.id}/${type}`, { method: "get", @@ -83,12 +82,12 @@ export const Site = { // Adding
 here seems to convert the file into a readable markdown format
       return resource ? `
\n\n${resource}` : "Nothing found";
     } catch (error: unknown) {
-      showToast(ToastStyle.Failure, "There was an error.");
+      showToast(Toast.Style.Failure, "There was an error.");
       return (error as ErrorEvent).message;
     }
   },
 };
 
-type SitesResponse = {
-  sites: ISite[];
+export type SitesResponse = {
+  sites?: ISite[];
 };
diff --git a/extensions/laravel-forge/tsconfig.json b/extensions/laravel-forge/tsconfig.json
index 6bd85946e9e77..38d55edc4f8db 100644
--- a/extensions/laravel-forge/tsconfig.json
+++ b/extensions/laravel-forge/tsconfig.json
@@ -9,6 +9,7 @@
     "strict": true,
     "isolatedModules": true,
     "esModuleInterop": true,
+    "resolveJsonModule": true,
     "skipLibCheck": true,
     "forceConsistentCasingInFileNames": true,
     "jsx": "react-jsx"