diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..4f7b6d8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint", + "simple-import-sort", + "import" + ], + "rules": { + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + "import/first": "error", + "import/newline-after-import": "error", + "import/no-duplicates": "error" + } +} diff --git a/package-lock.json b/package-lock.json index b5ffa86..e06b9f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6245,6 +6245,20 @@ "fastq": "^1.6.0" } }, + "@pkgr/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-7dIJ9CRVzBnqyEl7diUHPUFJf/oty2SeoVzcMocc5PeOUDK9KGzvgIBjGRRzzlRDaOjh3ADwH0WeibQvi3ls2Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + } + }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz", @@ -7325,19 +7339,71 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.30.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.5.tgz", - "integrity": "sha512-lftkqRoBvc28VFXEoRgyZuztyVUQ04JvUnATSPtIRFAccbXTWL6DEtXGYMcbg998kXw1NLUJm7rTQ9eUt+q6Ig==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz", + "integrity": "sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==", "requires": { - "@typescript-eslint/scope-manager": "5.30.5", - "@typescript-eslint/type-utils": "5.30.5", - "@typescript-eslint/utils": "5.30.5", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/type-utils": "5.30.6", + "@typescript-eslint/utils": "5.30.6", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" + } + }, + "@typescript-eslint/types": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", + "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/experimental-utils": { @@ -7349,14 +7415,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.30.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.5.tgz", - "integrity": "sha512-zj251pcPXI8GO9NDKWWmygP6+UjwWmrdf9qMW/L/uQJBM/0XbU2inxe5io/234y/RCvwpKEYjZ6c1YrXERkK4Q==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.6.tgz", + "integrity": "sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==", "requires": { - "@typescript-eslint/scope-manager": "5.30.5", - "@typescript-eslint/types": "5.30.5", - "@typescript-eslint/typescript-estree": "5.30.5", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" + } + }, + "@typescript-eslint/types": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/scope-manager": { @@ -7369,13 +7474,65 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.30.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.5.tgz", - "integrity": "sha512-k9+ejlv1GgwN1nN7XjVtyCgE0BTzhzT1YsQF0rv4Vfj2U9xnslBgMYYvcEYAFVdvhuEscELJsB7lDkN7WusErw==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz", + "integrity": "sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==", "requires": { - "@typescript-eslint/utils": "5.30.5", + "@typescript-eslint/utils": "5.30.6", "debug": "^4.3.4", "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" + } + }, + "@typescript-eslint/types": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", + "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", + "requires": { + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" + } + } } }, "@typescript-eslint/types": { @@ -9651,6 +9808,15 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, "globals": { "version": "13.16.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", @@ -9709,6 +9875,42 @@ } } }, + "eslint-import-resolver-typescript": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.2.5.tgz", + "integrity": "sha512-yEBi/EWxFFMjcZTBxrgdu5cFAXB2atOhYDhp0P0yHqjZa5YiPNqQVt4/lNNVWwW7Kf8IIZmyeBboWOgsfffe7w==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.10.0", + "get-tsconfig": "npm:@unts/get-tsconfig@^4.1.1", + "globby": "^13.1.2", + "is-core-module": "^2.9.0", + "is-glob": "^4.0.3", + "synckit": "^0.7.2" + }, + "dependencies": { + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, "eslint-module-utils": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", @@ -9914,6 +10116,12 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" }, + "eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true + }, "eslint-plugin-testing-library": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz", @@ -9923,12 +10131,19 @@ } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } } }, "eslint-utils": { @@ -10562,6 +10777,12 @@ "get-intrinsic": "^1.1.1" } }, + "get-tsconfig": { + "version": "npm:@unts/get-tsconfig@4.1.1", + "resolved": "https://registry.npmjs.org/@unts/get-tsconfig/-/get-tsconfig-4.1.1.tgz", + "integrity": "sha512-8mPf1bBzF2S+fyuyYOQWjDcaJTTgJ14UAnXW9I3KwrqioRWG1byRXHwciYdqXpbdOiu7Fg4WJbymBIakGk+aMA==", + "dev": true + }, "gl-matrix": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", @@ -10626,6 +10847,12 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -10639,6 +10866,12 @@ "slash": "^3.0.0" } }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -10923,6 +11156,12 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, + "i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -12643,158 +12882,1861 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "requires": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - } - }, - "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "oblivious-set": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "npm": { + "version": "8.13.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.13.2.tgz", + "integrity": "sha512-aS6q/QKxkw9mTX8gR7Ft38BcRkW1i+h3sI1yAFmfQ30Yl1a1G4ZX3oNGDzaLCilU5ThFZQBS1F4ZSZsrVxJ7HA==", + "dev": true, "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.0.4", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.1.0", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.1.5", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.1", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.0.0", + "ini": "^3.0.0", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.2", + "libnpmdiff": "^4.0.2", + "libnpmexec": "^4.0.2", + "libnpmfund": "^3.0.1", + "libnpmhook": "^8.0.2", + "libnpmorg": "^4.0.2", + "libnpmpack": "^4.0.2", + "libnpmpublish": "^6.0.2", + "libnpmsearch": "^5.0.2", + "libnpmteam": "^4.0.2", + "libnpmversion": "^3.0.1", + "make-fetch-happen": "^10.1.8", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.0.0", + "nopt": "^5.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.2", + "npm-pick-manifest": "^7.0.1", + "npm-profile": "^6.1.0", + "npm-registry-fetch": "^13.1.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.1", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "@gar/promisify": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "@npmcli/arborist": { + "version": "5.2.3", + "bundled": true, + "dev": true, + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.0", + "cacache": "^16.0.6", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/ci-detect": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "@npmcli/config": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/disparity-colors": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.3.0" + } + }, + "@npmcli/fs": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/map-workspaces": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + } + }, + "@npmcli/metavuln-calculator": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "@npmcli/package-json": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "bundled": true, + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "bin-links": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "builtins": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "cacache": { + "version": "16.1.1", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "chalk": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^4.1.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "cli-table3": { + "version": "0.6.2", + "bundled": true, + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "color-support": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "columnify": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + } + }, + "common-ancestor-path": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "debug": { + "version": "4.3.4", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "depd": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "err-code": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "bundled": true, + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "4.0.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "glob": { + "version": "8.0.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "bundled": true, + "dev": true + }, + "has": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore-walk": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^5.0.1" + } + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + } + }, + "ip": { + "version": "1.1.8", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "bundled": true, + "dev": true + }, + "is-cidr": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "bundled": true, + "dev": true + }, + "json-stringify-nice": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "just-diff": { + "version": "5.0.2", + "bundled": true, + "dev": true + }, + "just-diff-apply": { + "version": "5.2.0", + "bundled": true, + "dev": true + }, + "libnpmaccess": { + "version": "6.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmdiff": { + "version": "4.0.4", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.0.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + } + }, + "libnpmexec": { + "version": "4.0.8", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/arborist": "^5.0.0", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/run-script": "^4.1.3", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "walk-up-path": "^1.0.0" + } + }, + "libnpmfund": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/arborist": "^5.0.0" + } + }, + "libnpmhook": { + "version": "8.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmorg": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmpack": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + } + }, + "libnpmpublish": { + "version": "6.0.4", + "bundled": true, + "dev": true, + "requires": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + } + }, + "libnpmsearch": { + "version": "5.0.3", + "bundled": true, + "dev": true, + "requires": { + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmteam": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmversion": { + "version": "3.0.6", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + } + }, + "lru-cache": { + "version": "7.9.0", + "bundled": true, + "dev": true + }, + "make-fetch-happen": { + "version": "10.1.8", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.1.6", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "bundled": true, + "dev": true + }, + "node-gyp": { + "version": "9.0.0", + "bundled": true, + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-audit-report": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "npm-bundled": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-packlist": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "7.0.1", + "bundled": true, + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + } + }, + "npm-profile": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + } + }, + "npm-registry-fetch": { + "version": "13.1.1", + "bundled": true, + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "6.0.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "p-map": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pacote": { + "version": "13.6.1", + "bundled": true, + "dev": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + } + }, + "parse-conflict-json": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "proc-log": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "promise-all-reject-late": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-call-limit": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "read-package-json": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "7.3.7", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "spdx-correct": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "bundled": true, + "dev": true + }, + "ssri": { + "version": "9.0.1", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string-width": { + "version": "4.2.3", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.11", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "treeverse": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "walk-up-path": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "requires": { + "array.prototype.reduce": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", @@ -15305,6 +17247,16 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "synckit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.7.2.tgz", + "integrity": "sha512-CSZRtSRZ8RhJGMtWyLRqlarmWPPlsgZJHtV6cz0VTHNOg+R7UBoE2eNPQmB5Qrhtk3RX2AAcJmVwMXFULVQSwg==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.2.0", + "tslib": "^2.4.0" + } + }, "tailwindcss": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.5.tgz", @@ -15433,6 +17385,16 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "tiny-invariant": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", diff --git a/package.json b/package.json index c12d7b0..c9d2011 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,17 @@ "@types/react-beautiful-dnd": "^13.1.2", "@types/react-dom": "^18.0.6", "@types/react-router-dom": "^5.3.3", - "eslint-config-react-app": "^7.0.1" + "@typescript-eslint/eslint-plugin": "^5.30.6", + "@typescript-eslint/parser": "^5.30.6", + "eslint": "^8.19.0", + "eslint-config-react-app": "^7.0.1", + "eslint-import-resolver-typescript": "^3.2.5", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-simple-import-sort": "^7.0.0", + "i": "^0.3.7", + "npm": "^8.13.2" }, "scripts": { "start": "HTTPS=true SSL_CRT_FILE=./devpie.local.pem SSL_KEY_FILE=./devpie.local-key.pem react-scripts start", diff --git a/src/components/Avatar/Avatar.tsx b/src/components/Avatar/Avatar.tsx index 9797405..4eba77d 100644 --- a/src/components/Avatar/Avatar.tsx +++ b/src/components/Avatar/Avatar.tsx @@ -1,8 +1,9 @@ -import React from "react"; import { styled } from "@mui/material/styles"; -import { getUserInitials } from "../../helpers"; +import { getUserInitials } from "helpers/helpers"; +import React from "react"; +import { User } from "types/user"; + import ImageViewer, { ImageViewerProps } from "../ImageViewer"; -import { User } from "../../types"; interface Props { alt: ImageViewerProps["alt"]; diff --git a/src/components/DropdownButton.tsx b/src/components/DropdownButton.tsx index c4e0da3..a7c5a25 100644 --- a/src/components/DropdownButton.tsx +++ b/src/components/DropdownButton.tsx @@ -1,11 +1,12 @@ -import React from "react"; import ClickAwayListener from "@mui/material/ClickAwayListener"; import Grow from "@mui/material/Grow"; -import Paper from "@mui/material/Paper"; -import Popper from "@mui/material/Popper"; import MenuItem from "@mui/material/MenuItem"; import MenuList from "@mui/material/MenuList"; +import Paper from "@mui/material/Paper"; +import Popper from "@mui/material/Popper"; import { styled } from "@mui/material/styles"; +import React from "react"; + import { MoreOptions } from "./MoreOptions"; export function DropdownButton({ onDelete }: { onDelete: () => void }) { diff --git a/src/components/ImageViewer/ImageViewer.tsx b/src/components/ImageViewer/ImageViewer.tsx index 551b980..594988e 100644 --- a/src/components/ImageViewer/ImageViewer.tsx +++ b/src/components/ImageViewer/ImageViewer.tsx @@ -1,12 +1,10 @@ -import React from "react"; -import { placeholder } from "./placeholder"; -import { - // isIOS, - getOrientation, - convertRotationToDegrees, -} from "./ImageUtils"; import "./animate.css"; + import { styled } from "@mui/material/styles"; +import React from "react"; + +import { convertRotationToDegrees, getOrientation } from "./ImageUtils"; +import { placeholder } from "./placeholder"; export interface ImageViewerProps { alt: string; @@ -86,7 +84,7 @@ export default class ImageViewer extends React.Component< return this.fetchImage(url) .then(this.processImageBuffer) .then(this.createObjectURL) - .catch(() => {}); + .catch(); } render() { diff --git a/src/components/ImageViewer/index.ts b/src/components/ImageViewer/index.ts index 2aac89f..0ae9b56 100644 --- a/src/components/ImageViewer/index.ts +++ b/src/components/ImageViewer/index.ts @@ -1,4 +1,5 @@ import ImageViewer, { ImageViewerProps } from "./ImageViewer"; + export type { ImageViewerProps }; export default ImageViewer; diff --git a/src/Layout.tsx b/src/components/Layout.tsx similarity index 100% rename from src/Layout.tsx rename to src/components/Layout.tsx index 4c7338f..23464b0 100644 --- a/src/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,5 +1,5 @@ -import React from "react"; import { styled } from "@mui/material/styles"; +import React from "react"; export const Layout = (props: React.PropsWithChildren) => ( {props.children} diff --git a/src/components/Loader.tsx b/src/components/Loader.tsx index a6048b3..b258f53 100644 --- a/src/components/Loader.tsx +++ b/src/components/Loader.tsx @@ -1,6 +1,6 @@ -import React from "react"; import { CircularProgress } from "@mui/material"; import { styled } from "@mui/material/styles"; +import React from "react"; export const Loader = () => ( diff --git a/src/components/MenuLink/MenuLink.tsx b/src/components/MenuLink/MenuLink.tsx index 0b83bcf..1f200ac 100644 --- a/src/components/MenuLink/MenuLink.tsx +++ b/src/components/MenuLink/MenuLink.tsx @@ -1,6 +1,6 @@ +import { MenuItem } from "@mui/material"; import React from "react"; import { Link } from "react-router-dom"; -import { MenuItem } from "@mui/material"; interface Props { to: string; diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index 45b3dc1..c035433 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -1,9 +1,9 @@ -import React from "react"; +import Close from "@mui/icons-material/Close"; import Dialog from "@mui/material/Dialog"; import DialogContent from "@mui/material/DialogContent"; import IconButton from "@mui/material/IconButton"; import { styled } from "@mui/material/styles"; -import Close from "@mui/icons-material/Close"; +import React from "react"; export interface Props { open: boolean; diff --git a/src/components/MoreOptions.tsx b/src/components/MoreOptions.tsx index 4d4c4be..3d6e564 100644 --- a/src/components/MoreOptions.tsx +++ b/src/components/MoreOptions.tsx @@ -1,7 +1,7 @@ -import React from "react"; -import { styled } from "@mui/material/styles"; -import IconButton from "@mui/material/IconButton"; import MoreHoriz from "@mui/icons-material/MoreHoriz"; +import IconButton from "@mui/material/IconButton"; +import { styled } from "@mui/material/styles"; +import React from "react"; export const MoreOptions = ({ aref, diff --git a/src/components/Panel.tsx b/src/components/Panel.tsx index 66a6bda..92b7b7c 100644 --- a/src/components/Panel.tsx +++ b/src/components/Panel.tsx @@ -1,7 +1,8 @@ -import React from "react"; -import { styled } from "@mui/material/styles"; -import { TextField, IconButton } from "@mui/material"; import Close from "@mui/icons-material/Close"; +import { IconButton, TextField } from "@mui/material"; +import { styled } from "@mui/material/styles"; +import React from "react"; + import { DropdownButton } from "./DropdownButton"; interface Actions { diff --git a/src/components/SearchBar.tsx b/src/components/SearchBar.tsx index d4d34d6..38559aa 100644 --- a/src/components/SearchBar.tsx +++ b/src/components/SearchBar.tsx @@ -1,5 +1,5 @@ -import React from "react"; import { styled } from "@mui/material/styles"; +import React from "react"; export const SearchBar = () => ; diff --git a/src/components/SideBar/SideBar.tsx b/src/components/SideBar/SideBar.tsx index ac3f8a1..3a83d01 100644 --- a/src/components/SideBar/SideBar.tsx +++ b/src/components/SideBar/SideBar.tsx @@ -1,9 +1,14 @@ +import { styled } from "@mui/material/styles"; +import { + assignColor, + findPinnedByPath, + getOrgs, + orderBy, +} from "helpers/helpers"; +import { useTenantMap } from "hooks/users"; import React from "react"; import { Link } from "react-router-dom"; -import { styled } from "@mui/material/styles"; -import { useTenantMap } from "../../hooks/users"; -import { assignColor, findPinnedByPath, getOrgs, orderBy } from "../../helpers"; -import { usePinned } from "../../services/PinnedProvider"; +import { usePinned } from "services/PinnedProvider"; const RenderOrganizations = () => { const { isLoading, isError, data: tmap } = useTenantMap(); diff --git a/src/components/TopBar/NotifyModal.tsx b/src/components/TopBar/NotifyModal.tsx index cc989fa..1d1e73b 100644 --- a/src/components/TopBar/NotifyModal.tsx +++ b/src/components/TopBar/NotifyModal.tsx @@ -1,15 +1,15 @@ -import React, { useEffect, useState } from "react"; -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; -import Star from "@mui/icons-material/Star"; -import MoreHoriz from "@mui/icons-material/MoreHoriz"; -import IconButton from "@mui/material/IconButton"; import Check from "@mui/icons-material/Check"; import Close from "@mui/icons-material/Close"; +import MoreHoriz from "@mui/icons-material/MoreHoriz"; +import Star from "@mui/icons-material/Star"; import Button from "@mui/material/Button"; -import { Invite } from "./types"; +import IconButton from "@mui/material/IconButton"; import { styled } from "@mui/material/styles"; -import { useInviteDecision } from "../../hooks/invites"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { useInviteDecision } from "hooks/invites"; +import React, { useEffect, useState } from "react"; +import { Invite } from "types/invite"; dayjs.extend(relativeTime); @@ -71,7 +71,7 @@ export const NotifyModal = ({ invites, open }: Props) => { {renderUnreadIndicator(invite)} -

{invite.teamName} wants you to join their team.

+

____ wants you to join their organization.

{!invite.read ? ( <> diff --git a/src/components/TopBar/TopBar.tsx b/src/components/TopBar/TopBar.tsx index 5217419..33decbc 100644 --- a/src/components/TopBar/TopBar.tsx +++ b/src/components/TopBar/TopBar.tsx @@ -1,12 +1,13 @@ -import React, { useState } from "react"; +import Notifications from "@mui/icons-material/Notifications"; import Badge from "@mui/material/Badge"; import IconButton from "@mui/material/IconButton"; -import Notifications from "@mui/icons-material/Notifications"; -import { UserMenu } from "../UserMenu"; +import { styled } from "@mui/material/styles"; +import { useInvites } from "hooks/invites"; +import React, { useState } from "react"; + import { SearchBar } from "../SearchBar"; +import { UserMenu } from "../UserMenu"; import { NotifyModal } from "./NotifyModal"; -import { useInvites } from "../../hooks/invites"; -import { styled } from "@mui/material/styles"; export const TopBar = () => { const [isNotificationsOpen, setNotificationsOpen] = useState(false); diff --git a/src/components/UserMenu/UserMenu.tsx b/src/components/UserMenu/UserMenu.tsx index 1676e86..c2284d5 100644 --- a/src/components/UserMenu/UserMenu.tsx +++ b/src/components/UserMenu/UserMenu.tsx @@ -1,9 +1,3 @@ -import React, { useRef } from "react"; -import Button from "@mui/material/Button"; -import ImageViewer from "../ImageViewer"; -import { styled } from "@mui/material/styles"; -import { Auth } from "aws-amplify"; -import { useSeatsAvailable, useUser } from "../../hooks/users"; import { Divider, List, @@ -14,10 +8,17 @@ import { MenuItem, MenuList, } from "@mui/material"; -import { MenuLink } from "../MenuLink"; -import { User } from "../../types"; +import Button from "@mui/material/Button"; +import { styled } from "@mui/material/styles"; +import { Auth } from "aws-amplify"; +import { formatPath } from "helpers/helpers"; +import { useSeatsAvailable, useUser } from "hooks/users"; +import React, { useRef } from "react"; import { Link } from "react-router-dom"; -import { formatPath } from "../../helpers"; +import { User } from "types/user"; + +import ImageViewer from "../ImageViewer"; +import { MenuLink } from "../MenuLink"; export const UserMenu = () => { const seatsResult = useSeatsAvailable(); diff --git a/src/features/Account/Account.tsx b/src/features/Account/Account.tsx index e4b45ca..dc73001 100644 --- a/src/features/Account/Account.tsx +++ b/src/features/Account/Account.tsx @@ -1,12 +1,13 @@ -import React, { useEffect, useState } from "react"; -import Table from "rc-table"; -import { useTableUsers, useUsers } from "../../hooks/users"; import { styled } from "@mui/material/styles"; -import { Modal as AddUser } from "./Modal"; import { Auth } from "aws-amplify"; -import { components } from "./TableRow"; +import { Layout } from "components/Layout"; +import { useTableUsers, useUsers } from "hooks/users"; +import Table from "rc-table"; +import React, { useEffect, useState } from "react"; + +import { Modal as AddUser } from "./Modal"; import { columns } from "./TableColumns"; -import { Layout } from "../../Layout"; +import { components } from "./TableRow"; export const Account = () => { const [userInfo, setUserInfo] = useState<{ company: string }>(); diff --git a/src/features/Account/AvatarModal/AvatarEditor/AvatarEditor.jsx b/src/features/Account/AvatarModal/AvatarEditor/AvatarEditor.jsx index 2ad4b75..f21fed2 100644 --- a/src/features/Account/AvatarModal/AvatarEditor/AvatarEditor.jsx +++ b/src/features/Account/AvatarModal/AvatarEditor/AvatarEditor.jsx @@ -1,6 +1,6 @@ -import React from "react"; -import piexif from "piexifjs"; import Konva from "konva/lib/Core"; +import piexif from "piexifjs"; +import React from "react"; export class AvatarEditor extends React.Component { static defaultProps = { diff --git a/src/features/Account/AvatarModal/AvatarModal.tsx b/src/features/Account/AvatarModal/AvatarModal.tsx index bed6d34..ef96e64 100644 --- a/src/features/Account/AvatarModal/AvatarModal.tsx +++ b/src/features/Account/AvatarModal/AvatarModal.tsx @@ -1,8 +1,9 @@ +import { styled } from "@mui/material/styles"; +import ImageViewer from "components/ImageViewer"; +import { Modal } from "components/Modal"; import React from "react"; + import { AvatarEditor } from "./AvatarEditor"; -import { Modal } from "../../../components/Modal"; -import ImageViewer from "../../../components/ImageViewer"; -import { styled } from "@mui/material/styles"; interface Actions { onToggle: () => void; diff --git a/src/features/Account/DeleteDialog/DeleteDialog.tsx b/src/features/Account/DeleteDialog/DeleteDialog.tsx index c942cb8..26dd369 100644 --- a/src/features/Account/DeleteDialog/DeleteDialog.tsx +++ b/src/features/Account/DeleteDialog/DeleteDialog.tsx @@ -1,14 +1,14 @@ -import * as React from "react"; +import DeleteIcon from "@mui/icons-material/Delete"; +import { styled } from "@mui/material"; import Button from "@mui/material/Button"; import Dialog from "@mui/material/Dialog"; import DialogActions from "@mui/material/DialogActions"; import DialogContent from "@mui/material/DialogContent"; import DialogContentText from "@mui/material/DialogContentText"; import DialogTitle from "@mui/material/DialogTitle"; -import { styled } from "@mui/material"; -import DeleteIcon from "@mui/icons-material/Delete"; import IconButton from "@mui/material/IconButton"; -import { useDeleteUser } from "../../../hooks/users"; +import { useDeleteUser } from "hooks/users"; +import * as React from "react"; interface Props { title: string; diff --git a/src/features/Account/Modal/Modal.tsx b/src/features/Account/Modal/Modal.tsx index cdfd406..c9657ce 100644 --- a/src/features/Account/Modal/Modal.tsx +++ b/src/features/Account/Modal/Modal.tsx @@ -1,12 +1,12 @@ -import React, { useState } from "react"; +import { Alert, TextField } from "@mui/material"; import Button from "@mui/material/Button"; import Dialog from "@mui/material/Dialog"; import DialogContentText from "@mui/material/DialogContentText"; import DialogTitle from "@mui/material/DialogTitle"; -import { Alert, TextField } from "@mui/material"; import { styled } from "@mui/material/styles"; -import { NewUser } from "../../../types"; -import { useCreateUser, useSeatsAvailable } from "../../../hooks/users"; +import { useCreateUser, useSeatsAvailable } from "hooks/users"; +import React, { useState } from "react"; +import { NewUser } from "types/user"; export const Modal = () => { const [open, setOpen] = useState(false); diff --git a/src/features/Account/TableColumns.tsx b/src/features/Account/TableColumns.tsx index 160f510..64043cd 100644 --- a/src/features/Account/TableColumns.tsx +++ b/src/features/Account/TableColumns.tsx @@ -1,6 +1,7 @@ -import { DeleteDialog } from "./DeleteDialog"; -import React from "react"; import { styled } from "@mui/material/styles"; +import React from "react"; + +import { DeleteDialog } from "./DeleteDialog"; export const columns = [ { diff --git a/src/features/Account/index.ts b/src/features/Account/index.ts index 605d193..cd4ddda 100644 --- a/src/features/Account/index.ts +++ b/src/features/Account/index.ts @@ -1,2 +1,3 @@ import { Account } from "./Account"; + export default Account; diff --git a/src/features/NoMatch/NoMatch.tsx b/src/features/NoMatch/NoMatch.tsx index e0b32da..b97be3f 100644 --- a/src/features/NoMatch/NoMatch.tsx +++ b/src/features/NoMatch/NoMatch.tsx @@ -1,5 +1,5 @@ +import { Layout } from "components/Layout"; import React from "react"; -import { Layout } from "../../Layout"; const NoMatch = () => ( diff --git a/src/features/NoMatch/index.ts b/src/features/NoMatch/index.ts index fcfcfcb..f4359b6 100644 --- a/src/features/NoMatch/index.ts +++ b/src/features/NoMatch/index.ts @@ -1,2 +1,3 @@ -import {NoMatch} from "./NoMatch"; -export default NoMatch; \ No newline at end of file +import { NoMatch } from "./NoMatch"; + +export default NoMatch; diff --git a/src/features/Profile/Profile.tsx b/src/features/Profile/Profile.tsx index f95b789..2996c2d 100644 --- a/src/features/Profile/Profile.tsx +++ b/src/features/Profile/Profile.tsx @@ -1,5 +1,5 @@ +import { Layout } from "components/Layout"; import React from "react"; -import { Layout } from "../../Layout"; class Profile extends React.Component { render() { diff --git a/src/features/Profile/index.ts b/src/features/Profile/index.ts index 0351c1f..50b4dbe 100644 --- a/src/features/Profile/index.ts +++ b/src/features/Profile/index.ts @@ -1,2 +1,3 @@ import { Profile } from "./Profile"; + export default Profile; diff --git a/src/features/Project/Project.tsx b/src/features/Project/Project.tsx index b29843f..d5eee7c 100644 --- a/src/features/Project/Project.tsx +++ b/src/features/Project/Project.tsx @@ -1,14 +1,15 @@ +import { styled } from "@mui/material/styles"; +import { Layout } from "components/Layout"; +import { MoreOptions } from "components/MoreOptions"; +import { useProject } from "hooks/project"; +import { useUsers } from "hooks/users"; import React, { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; -import { SprintBoard } from "./SprintBoard"; -import { ProjectUsers } from "./ProjectUsers"; -import { Project } from "../../types"; +import { Project } from "types/project"; + import { ProjectSettings } from "./ProjectSettings"; -import { useProject } from "../../hooks/project"; -import { MoreOptions } from "../../components/MoreOptions"; -import { styled } from "@mui/material/styles"; -import { Layout } from "../../Layout"; -import { useUsers } from "../../hooks/users"; +import { ProjectUsers } from "./ProjectUsers"; +import { SprintBoard } from "./SprintBoard"; export const SelectedProject = () => { const { id } = useParams(); @@ -72,7 +73,7 @@ const Settings = (props: { project: Project }) => { window.addEventListener("scroll", handleScroll); }, []); - let classes = ["controls"]; + const classes = ["controls"]; if (scrolled) { classes.push("scrolled"); } diff --git a/src/features/Project/ProjectSettings.tsx b/src/features/Project/ProjectSettings.tsx index 054d402..43d6468 100644 --- a/src/features/Project/ProjectSettings.tsx +++ b/src/features/Project/ProjectSettings.tsx @@ -1,12 +1,14 @@ -import React, { useState } from "react"; -import Switch from "@mui/material/Switch"; import { styled } from "@mui/material/styles"; -import { UsersTable } from "./UsersTable"; -import { useDeleteProject, useUpdateProject } from "../../hooks/project"; -import { PanelForm, PanelSection, PanelField } from "../../components/Panel"; -import { Avatar } from "../../components/Avatar"; +import Switch from "@mui/material/Switch"; +import { Avatar } from "components/Avatar"; +import { PanelField, PanelForm, PanelSection } from "components/Panel"; +import { useDeleteProject, useUpdateProject } from "hooks/project"; +import React, { useState } from "react"; import { useNavigate } from "react-router-dom"; -import { User, Project } from "../../types"; +import { Project } from "types/project"; +import { User } from "types/user"; + +import { UsersTable } from "./UsersTable"; interface Actions { onClose: () => void; diff --git a/src/features/Project/ProjectUsers.tsx b/src/features/Project/ProjectUsers.tsx index 90c2526..ff4d055 100644 --- a/src/features/Project/ProjectUsers.tsx +++ b/src/features/Project/ProjectUsers.tsx @@ -1,8 +1,8 @@ -import React, { useState } from "react"; import Add from "@mui/icons-material/Add"; import { styled } from "@mui/material/styles"; -import { Avatar } from "../../components/Avatar"; -import { useUsers } from "../../hooks/users"; +import { Avatar } from "components/Avatar"; +import { useUsers } from "hooks/users"; +import React, { useState } from "react"; export const ProjectUsers = () => { const { data: users, isLoading, isError } = useUsers(); diff --git a/src/features/Project/SprintBoard/Content.tsx b/src/features/Project/SprintBoard/Content.tsx index 8a38bb2..3e7b9b0 100644 --- a/src/features/Project/SprintBoard/Content.tsx +++ b/src/features/Project/SprintBoard/Content.tsx @@ -1,11 +1,13 @@ -import React, { useState } from "react"; -import { DropResult, DragDropContext } from "react-beautiful-dnd"; import { styled } from "@mui/material/styles"; +import { makeUserDict } from "helpers/helpers"; +import { useUsers } from "hooks/users"; +import React, { useState } from "react"; +import { DragDropContext, DropResult } from "react-beautiful-dnd"; +import { ColumnDict, Task, TaskDict } from "types/board"; +import { Project } from "types/project"; + import { SprintColumn } from "./SprintColumn"; import { TaskModal } from "./SprintTask/TaskModal"; -import { makeUserDict } from "./helpers"; -import { Task, TaskDict, ColumnDict, Project } from "../../../types"; -import { useUsers } from "../../../hooks/users"; interface BoardActions { onDragEnd: (result: DropResult) => void; diff --git a/src/features/Project/SprintBoard/SprintBoard.tsx b/src/features/Project/SprintBoard/SprintBoard.tsx index baa870a..68a00fa 100644 --- a/src/features/Project/SprintBoard/SprintBoard.tsx +++ b/src/features/Project/SprintBoard/SprintBoard.tsx @@ -1,14 +1,11 @@ +import { makeColumnsDict, makeTasksDict } from "helpers/helpers"; +import { useAddTask, useColumns, useMoveTask, useTasks } from "hooks/board"; import React, { useEffect, useState } from "react"; import { DropResult } from "react-beautiful-dnd"; -import { makeColumnsDict, makeTasksDict } from "./helpers"; +import { Board } from "types/board"; +import { Project } from "types/project"; + import { BoardContent } from "./Content"; -import { - useAddTask, - useMoveTask, - useColumns, - useTasks, -} from "../../../hooks/board"; -import { Project, Board } from "../../../types"; export const SprintBoard = ({ project }: { project: Project }) => { const rawColumns = useColumns(project.id); @@ -18,8 +15,8 @@ export const SprintBoard = ({ project }: { project: Project }) => { return null; } - let columns = makeColumnsDict(rawColumns.data); - let tasks = makeTasksDict(rawTasks.data); + const columns = makeColumnsDict(rawColumns.data); + const tasks = makeTasksDict(rawTasks.data); return ; }; @@ -42,7 +39,7 @@ const BoardManager = ({ const { columns, tasks } = board; const handleAddTask = async (task: string) => { - const columnKey: string = "column-1"; + const columnKey = "column-1"; const column = columns[columnKey]; await addTask({ diff --git a/src/features/Project/SprintBoard/SprintColumn/Header.tsx b/src/features/Project/SprintBoard/SprintColumn/Header.tsx index 35bc72d..8b035a9 100644 --- a/src/features/Project/SprintBoard/SprintColumn/Header.tsx +++ b/src/features/Project/SprintBoard/SprintColumn/Header.tsx @@ -1,8 +1,9 @@ import Add from "@mui/icons-material/Add"; -import React, { useState } from "react"; import { styled } from "@mui/material/styles"; +import React, { useState } from "react"; +import { Column } from "types/board"; + import { AddTask } from "../SprintTask"; -import { Column } from "../../../../types"; export const ColumnHeader = ({ column, diff --git a/src/features/Project/SprintBoard/SprintColumn/SprintColumn.tsx b/src/features/Project/SprintBoard/SprintColumn/SprintColumn.tsx index 5581f45..3b01ea3 100644 --- a/src/features/Project/SprintBoard/SprintColumn/SprintColumn.tsx +++ b/src/features/Project/SprintBoard/SprintColumn/SprintColumn.tsx @@ -1,10 +1,12 @@ -import React from "react"; import Paper from "@mui/material/Paper"; +import { styled } from "@mui/material/styles"; +import React from "react"; import { Droppable } from "react-beautiful-dnd"; +import { Column, Task, TaskDict } from "types/board"; +import { UserDict } from "types/user"; + import { SprintTask } from "../SprintTask"; import { ColumnHeader } from "./Header"; -import { styled } from "@mui/material/styles"; -import { Column, Task, TaskDict, UserDict } from "../../../../types"; interface Actions { onAddTask: (task: string) => void; diff --git a/src/features/Project/SprintBoard/SprintTask/AddTask/AddTask.tsx b/src/features/Project/SprintBoard/SprintTask/AddTask/AddTask.tsx index 9288b59..56914e5 100644 --- a/src/features/Project/SprintBoard/SprintTask/AddTask/AddTask.tsx +++ b/src/features/Project/SprintBoard/SprintTask/AddTask/AddTask.tsx @@ -1,12 +1,12 @@ -import React, { useState } from "react"; import Button from "@mui/material/Button"; +import { styled } from "@mui/material/styles"; import TextareaAutosize from "@mui/material/TextareaAutosize"; import { AxiosError } from "axios"; +import React, { useState } from "react"; import { useQuery } from "react-query"; -import { client as api } from "../../../../../services/APIService"; import { useParams } from "react-router-dom"; -import { styled } from "@mui/material/styles"; -import { Project } from "../../../../../types"; +import { client as api } from "services/APIService"; +import { Project } from "types/project"; interface AddTaskProps { isCreating: boolean; diff --git a/src/features/Project/SprintBoard/SprintTask/SprintTask.tsx b/src/features/Project/SprintBoard/SprintTask/SprintTask.tsx index b53c4fc..080e3f2 100644 --- a/src/features/Project/SprintBoard/SprintTask/SprintTask.tsx +++ b/src/features/Project/SprintBoard/SprintTask/SprintTask.tsx @@ -1,12 +1,13 @@ +import { styled } from "@mui/material/styles"; +import { Avatar } from "components/Avatar"; import React from "react"; import { Draggable, DraggingStyle, NotDraggingStyle, } from "react-beautiful-dnd"; -import { styled } from "@mui/material/styles"; -import { Avatar } from "../../../../components/Avatar"; -import { Task, UserDict } from "../../../../types"; +import { Task } from "types/board"; +import { UserDict } from "types/user"; export const SprintTask = ({ users, @@ -23,7 +24,7 @@ export const SprintTask = ({ {({ innerRef, draggableProps, dragHandleProps }, { isDragging }) => (
- ) => { + const handleNewCommentChange = () => { // add new comment - then merge to comments list }; diff --git a/src/features/Project/SprintBoard/SprintTask/index.ts b/src/features/Project/SprintBoard/SprintTask/index.ts index 7127bbb..f739899 100644 --- a/src/features/Project/SprintBoard/SprintTask/index.ts +++ b/src/features/Project/SprintBoard/SprintTask/index.ts @@ -1,2 +1,2 @@ -export { SprintTask } from "./SprintTask"; export { AddTask } from "./AddTask"; +export { SprintTask } from "./SprintTask"; diff --git a/src/features/Project/SprintBoard/helpers.ts b/src/features/Project/SprintBoard/helpers.ts deleted file mode 100644 index 01d9131..0000000 --- a/src/features/Project/SprintBoard/helpers.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - Column, - ColumnDict, - User, - Task, - TaskDict, - UserDict, -} from "../../../types"; - -export function makeUserDict(users: User[] | undefined): UserDict | undefined { - if (!users) { - return; - } - return (users || []).reduce((acc, curr) => { - return { - ...acc, - [`${curr.id}`]: { - ...curr, - }, - }; - }, {}); -} - -export function makeColumnsDict(columns: Column[]): ColumnDict { - return Object.keys(columns).reduce((acc: any, key: any) => { - return { - ...acc, - ...{ - [columns[key].columnName.toString()]: { ...columns[key] }, - }, - }; - }, {}); -} - -export function makeTasksDict(tasks: Task[]): TaskDict { - return Object.keys(tasks).reduce((acc: any, key: any) => { - return { - ...acc, - ...{ - [tasks[key].id.toString()]: { ...tasks[key] }, - }, - }; - }, {}); -} diff --git a/src/features/Project/UsersTable.tsx b/src/features/Project/UsersTable.tsx index 21f47a4..d27a605 100644 --- a/src/features/Project/UsersTable.tsx +++ b/src/features/Project/UsersTable.tsx @@ -1,15 +1,15 @@ -import React from "react"; +import Paper from "@mui/material/Paper"; +import { styled } from "@mui/material/styles"; import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableCell from "@mui/material/TableCell"; import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; -import Paper from "@mui/material/Paper"; -import { styled } from "@mui/material/styles"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; -import { User } from "../../types"; +import React from "react"; +import { User } from "types/user"; dayjs.extend(relativeTime); diff --git a/src/features/Project/index.ts b/src/features/Project/index.ts index 03e0d32..6ce6b68 100644 --- a/src/features/Project/index.ts +++ b/src/features/Project/index.ts @@ -1,2 +1,3 @@ import { SelectedProject } from "./Project"; + export default SelectedProject; diff --git a/src/features/Projects/Card/Card.tsx b/src/features/Projects/Card/Card.tsx index a4554b4..69e1bef 100644 --- a/src/features/Projects/Card/Card.tsx +++ b/src/features/Projects/Card/Card.tsx @@ -1,19 +1,13 @@ import React, { useState } from "react"; import { Link } from "react-router-dom"; import { styled } from "@mui/material/styles"; -import { useTenantMap } from "../../../hooks/users"; -import { Loader } from "../../../components/Loader"; +import { useTenantMap } from "hooks/users"; +import { Loader } from "components/Loader"; import PushPinIcon from "@mui/icons-material/PushPin"; -import { - assignColor, - getOrgs, - getPinState, - PinnedProject, - orderBy, -} from "../../../helpers"; +import { assignColor, getOrgs, getPinState, orderBy } from "helpers/helpers"; import IconButton from "@mui/material/IconButton"; -import { usePinned } from "../../../services/PinnedProvider"; -import { Project } from "../../../types"; +import { usePinned } from "services/PinnedProvider"; +import { Project, PinnedProject } from "types/project"; interface Props { project: Project; diff --git a/src/features/Projects/List/List.tsx b/src/features/Projects/List/List.tsx index 9810a24..4e3d8da 100644 --- a/src/features/Projects/List/List.tsx +++ b/src/features/Projects/List/List.tsx @@ -2,9 +2,9 @@ import React from "react"; import { CircularProgress, Grid } from "@mui/material"; import { Card } from "../Card"; import { styled } from "@mui/material/styles"; -import { orderBy } from "../../../helpers"; -import { useProjects } from "../../../hooks/project"; -import { Project } from "../../../types"; +import { orderBy } from "helpers/helpers"; +import { useProjects } from "hooks/project"; +import { Project } from "types/project"; const renderProjectCards = (projects: Project[]) => { return orderBy("name", projects).map((project: Project) => ( diff --git a/src/features/Projects/Projects.tsx b/src/features/Projects/Projects.tsx index de0ab81..9319a26 100644 --- a/src/features/Projects/Projects.tsx +++ b/src/features/Projects/Projects.tsx @@ -4,9 +4,9 @@ import Fab from "@mui/material/Fab"; import Add from "@mui/icons-material/Add"; import { List } from "./List"; import { Modal } from "./Modal"; -import { useCreateProject } from "../../hooks/project"; +import { useCreateProject } from "hooks/project"; import { styled } from "@mui/material/styles"; -import { Layout } from "../../Layout"; +import { Layout } from "components/Layout"; export const Projects = () => { const [isOpen, setOpen] = useState(false); diff --git a/src/helpers.ts b/src/helpers.ts deleted file mode 100644 index e6e3f20..0000000 --- a/src/helpers.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { TMap, Project } from "./types"; - -export function getUserInitials(firstName: string, lastName: string) { - return firstName.substring(0, 1) + (lastName || "").substring(0, 1); -} - -export const formatPath = (company: string | undefined): string => { - if (!company) { - return ""; - } - const re = /[^a-zA-Z0-9]+/g; - - return company.replaceAll(re, "").toLowerCase(); -}; - -interface Organization { - id: string; - path: string; - name: string; - color?: string; -} - -export const getOrgs = (data: TMap) => { - return Object.keys(data).map((id) => ({ - path: data[id].path, - id: data[id].id, - name: data[id].company, - })) as Organization[]; -}; - -export function assignColor(obj: T, index: number) { - return { - ...obj, - color: `badge${(index % 9) + 1}`, - }; -} - -export interface PinnedProject { - tenantPath: string; - projectId: string; - name: string; -} - -export const getPinState = (project: Project) => { - const pinnedSettings = localStorage.getItem("settings.pinned"); - if (pinnedSettings) { - const data = JSON.parse(pinnedSettings); - if (data && data.length) { - return !!data.find((obj: PinnedProject) => { - return obj.projectId === project.id; - }); - } - } - - return false; -}; - -export const findPinnedByPath = ( - settings: PinnedProject[], - path: string -): PinnedProject[] => { - if (settings) { - if (settings && settings.length) { - return settings.filter((obj: PinnedProject) => { - return obj.tenantPath === path; - }); - } - } - - return []; -}; - -type SortBy = "asc" | "desc"; - -// Sorts values by given key in descending order unless ascending order is specified. -function orderBy(key: string, values: T[], sortBy: SortBy = "desc") { - return values.sort( - (a: { [index: string]: any }, b: { [index: string]: any }) => { - let fieldA, fieldB; - - try { - // Assume it's a string. - fieldA = a[key].toLowerCase(); - fieldB = b[key].toLowerCase(); - } catch { - fieldA = a[key]; - fieldB = b[key]; - } - - if (sortBy === "desc") { - return sortByDesc(fieldA, fieldB); - } else { - return sortByAsc(fieldA, fieldB); - } - } - ); -} - -const sortByDesc = (a: any, b: any) => { - return a > b ? 1 : a < b ? -1 : 0; -}; - -const sortByAsc = (a: any, b: any) => { - return a < b ? 1 : a > b ? -1 : 0; -}; - -export { orderBy }; diff --git a/src/helpers/helpers.ts b/src/helpers/helpers.ts new file mode 100644 index 0000000..4fedace --- /dev/null +++ b/src/helpers/helpers.ts @@ -0,0 +1,122 @@ +import { Column, ColumnDict, Task, TaskDict } from "types/board"; +import { PinnedProject, Project } from "types/project"; +import { Organization, TMap } from "types/tenant"; +import { User, UserDict } from "types/user"; + +export function getUserInitials(firstName: string, lastName: string) { + return firstName.substring(0, 1) + (lastName || "").substring(0, 1); +} + +export function formatPath(company: string | undefined): string { + if (!company) { + return ""; + } + const re = /[^a-zA-Z0-9]+/g; + return company.replaceAll(re, "").toLowerCase(); +} + +export function getOrgs(data: TMap) { + return Object.keys(data).map((id) => ({ + path: data[id].path, + id: data[id].id, + name: data[id].company, + })) as Organization[]; +} + +export function assignColor(obj: T, index: number) { + return { + ...obj, + color: `badge${(index % 9) + 1}`, + }; +} + +export function getPinState(project: Project) { + const pinnedSettings = localStorage.getItem("settings.pinned") || "[]"; + const data = JSON.parse(pinnedSettings); + if (data.length) { + return !!data.find((obj: PinnedProject) => { + return obj.projectId === project.id; + }); + } + return false; +} + +export function findPinnedByPath( + pinned: PinnedProject[], + path: string +): PinnedProject[] { + if (pinned && pinned.length) { + return pinned.filter((obj: PinnedProject) => { + return obj.tenantPath === path; + }); + } + return []; +} + +type SortBy = "asc" | "desc"; +// Sorts values by given key in descending order unless ascending order is specified. +export function orderBy(key: string, values: T[], sortBy: SortBy = "desc") { + return values.sort( + (a: { [index: string]: any }, b: { [index: string]: any }) => { + let fieldA, fieldB; + try { + // Assume it's a string. + fieldA = a[key].toLowerCase(); + fieldB = b[key].toLowerCase(); + } catch { + fieldA = a[key]; + fieldB = b[key]; + } + + if (sortBy === "desc") { + return sortByDesc(fieldA, fieldB); + } else { + return sortByAsc(fieldA, fieldB); + } + } + ); +} + +function sortByDesc(a: any, b: any) { + return a > b ? 1 : a < b ? -1 : 0; +} + +function sortByAsc(a: any, b: any) { + return a < b ? 1 : a > b ? -1 : 0; +} + +export function makeUserDict(users: User[] | undefined): UserDict | undefined { + if (!users) { + return; + } + return (users || []).reduce((acc, curr) => { + return { + ...acc, + [`${curr.id}`]: { + ...curr, + }, + }; + }, {}); +} + +export function makeColumnsDict(columns: Column[]): ColumnDict { + return Object.keys(columns).reduce((acc: any, key: any) => { + return { + ...acc, + ...{ + [columns[key].columnName.toString()]: { ...columns[key] }, + }, + }; + }, {}); +} + +export function makeTasksDict(tasks: Task[]): TaskDict { + return Object.keys(tasks).reduce((acc: any, key: any) => { + return { + ...acc, + ...{ + [tasks[key].id.toString()]: { ...tasks[key] }, + }, + }; + }, {}); +} diff --git a/src/hooks/board.ts b/src/hooks/board.ts index 48b0c67..7475049 100644 --- a/src/hooks/board.ts +++ b/src/hooks/board.ts @@ -1,6 +1,6 @@ -import { client as api } from "../services/APIService"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { Task, AddTask, DeleteTask, MoveTask, Column } from "../types"; +import { client as api } from "services/APIService"; +import { AddTask, Column, DeleteTask, MoveTask, Task } from "types/board"; export function useColumns(projectId: string) { return useQuery(["project", projectId, "columns"], () => { @@ -73,7 +73,7 @@ export function useDeleteTask() { queryClient.setQueryData( ["project", variables.projectId, "columns"], (prev) => { - let state = prev as Column[]; + const state = prev as Column[]; const column = (state || []).find((item) => { return item.columnName === variables.columnId; diff --git a/src/hooks/invites.ts b/src/hooks/invites.ts index 2b5aab6..8bcfc9b 100644 --- a/src/hooks/invites.ts +++ b/src/hooks/invites.ts @@ -1,19 +1,6 @@ import { useMutation, useQuery, useQueryClient } from "react-query"; -import { Invite } from "../components/TopBar/types"; -import { client as api } from "../services/APIService"; - -export function useCreateInvite() { - const { mutate } = useMutation< - Invite, - Error, - { teamId: string; emailList: string[] } - >(({ teamId, emailList }) => - api.post(`/users/teams/${teamId}/invites`, { - emailList, - }) - ); - return [mutate]; -} +import { Invite } from "types/invite"; +import { client as api } from "services/APIService"; export function useInvites() { return useQuery( diff --git a/src/hooks/project.ts b/src/hooks/project.ts index c72cbf6..dcea8eb 100644 --- a/src/hooks/project.ts +++ b/src/hooks/project.ts @@ -1,7 +1,7 @@ -import { useQuery, useQueryClient, useMutation } from "react-query"; -import { client as api } from "../services/APIService"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate } from "react-router-dom"; -import { Project } from "../types"; +import { client as api } from "services/APIService"; +import { Project } from "types/project"; export function useProject(projectId: string | undefined) { return useQuery( @@ -51,7 +51,7 @@ export function useUpdateProject() { ...rest, }), { - onSuccess: (data, variables) => { + onSuccess: (data) => { queryClient.setQueryData(["project", data.id], data); }, } diff --git a/src/hooks/users.ts b/src/hooks/users.ts index 01ca9f7..c823b58 100644 --- a/src/hooks/users.ts +++ b/src/hooks/users.ts @@ -1,17 +1,16 @@ +import { Auth } from "aws-amplify"; import { useMemo } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { client as api } from "../services/APIService"; -import { Auth } from "aws-amplify"; +import { client as api } from "services/APIService"; +import { SeatsAvailable, TMap } from "types/tenant"; import { + CurrentUser, + DeleteUserInput, NewUser, - SeatsAvailable, + TableUser, User, - DeleteUserInput, - CurrentUser, UserQuery, - TableUser, - TMap, -} from "../types"; +} from "types/user"; export function useUser() { const { isLoading, isError, data } = useQuery( diff --git a/src/index.tsx b/src/index.tsx index 1435250..a2d538e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,7 +1,23 @@ +import "@aws-amplify/ui-react/styles.css"; +import "./index.css"; + +import { Image, View, withAuthenticator } from "@aws-amplify/ui-react"; +import Copyright from "@mui/icons-material/Copyright"; +import { + styled, + StyledEngineProvider, + ThemeProvider, +} from "@mui/material/styles"; +import Amplify from "aws-amplify"; +import { Loader } from "components/Loader"; +import { SideBar } from "components/SideBar"; +import { TopBar } from "components/TopBar/TopBar"; +import { formatPath } from "helpers/helpers"; +import { useUser } from "hooks/users"; import React, { lazy } from "react"; import { createRoot } from "react-dom/client"; -import { ReactQueryDevtools } from "react-query/devtools"; import { QueryClient, QueryClientProvider } from "react-query"; +import { ReactQueryDevtools } from "react-query/devtools"; import { BrowserRouter, Navigate, @@ -10,26 +26,10 @@ import { Routes, useParams, } from "react-router-dom"; +import { PinnedProvider } from "services/PinnedProvider"; -import { theme } from "./theme"; -import { - styled, - StyledEngineProvider, - ThemeProvider, -} from "@mui/material/styles"; -import "@aws-amplify/ui-react/styles.css"; -import "./index.css"; - -import { View, Image, withAuthenticator } from "@aws-amplify/ui-react"; -import Amplify from "aws-amplify"; import awsconfig from "./aws-exports"; -import { useUser } from "./hooks/users"; -import { formatPath } from "./helpers"; -import { Loader } from "./components/Loader"; -import { SideBar } from "./components/SideBar"; -import Copyright from "@mui/icons-material/Copyright"; -import { TopBar } from "./components/TopBar/TopBar"; -import { PinnedProvider } from "./services/PinnedProvider"; +import { theme } from "./theme"; Amplify.configure({ ...awsconfig, @@ -37,11 +37,11 @@ Amplify.configure({ userPoolWebClientId: process.env.REACT_APP_USER_POOL_CLIENT_ID, }); -const Account = lazy(() => import("./features/Account")); -const NoMatch = lazy(() => import("./features/NoMatch")); -const Profile = lazy(() => import("./features/Profile")); -const Projects = lazy(() => import("./features/Projects")); -const SelectedProject = lazy(() => import("./features/Project")); +const Account = lazy(() => import("features/Account")); +const NoMatch = lazy(() => import("features/NoMatch")); +const Profile = lazy(() => import("features/Profile")); +const Projects = lazy(() => import("features/Projects")); +const SelectedProject = lazy(() => import("features/Project")); const queryClient = new QueryClient(); diff --git a/src/services/APIService.ts b/src/services/APIService.ts index ad419c4..5c88370 100644 --- a/src/services/APIService.ts +++ b/src/services/APIService.ts @@ -7,16 +7,16 @@ class APIService { this.baseUrl = process.env.REACT_APP_BACKEND || "http://localhost/api"; } - post(path: string, data: any) { - return this.request("POST", path, data); + post(path: string, data: T) { + return this.request("POST", path, data); } - put(path: string, data: any) { - return this.request("PUT", path, data); + put(path: string, data: T) { + return this.request("PUT", path, data); } - patch(path: string, data: any) { - return this.request("PATCH", path, data); + patch(path: string, data: T) { + return this.request("PATCH", path, data); } get(path: string) { @@ -40,7 +40,7 @@ class APIService { return window.location.pathname.split("/")[1]; } - async request(method: string, path: string, data?: any) { + async request(method: string, path: string, data?: T) { const url = `${this.baseUrl}${path}`; const session = await Auth.currentSession(); const accessToken = session.getIdToken().getJwtToken(); diff --git a/src/services/PinnedProvider.tsx b/src/services/PinnedProvider.tsx index c579a3c..e3bc515 100644 --- a/src/services/PinnedProvider.tsx +++ b/src/services/PinnedProvider.tsx @@ -1,5 +1,5 @@ import React, { PropsWithChildren, useState } from "react"; -import { PinnedProject } from "../helpers"; +import { PinnedProject } from "types/project"; interface PinnedCtx { pinned: PinnedProject[]; @@ -9,7 +9,7 @@ interface PinnedCtx { const PinnedContext = React.createContext(undefined); export function PinnedProvider({ children }: PropsWithChildren) { - let settings = localStorage.getItem("settings.pinned") || "[]"; + const settings = localStorage.getItem("settings.pinned") || "[]"; const totalPinned = JSON.parse(settings) as PinnedProject[]; const [pinned, setPinned] = useState(totalPinned); diff --git a/src/types.ts b/src/types.ts deleted file mode 100644 index aafaf39..0000000 --- a/src/types.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { UseQueryResult } from "react-query"; - -export interface User { - id: string; - email: string; - emailVerified: boolean; - firstName: string; - lastName: string; - picture: string; - locale: string; - company?: string; - updatedAt: string; - createdAt: string; -} - -export interface UserDict { - [index: string]: User; -} - -export type CurrentUser = User & { - tenantId: string; - company: string; - accountOwner: boolean; - connections: ConnectionMap; - username: string; -}; - -interface ConnectionMap { - [index: string]: Connection; -} - -type Connection = { - id: string; - path: string; - plan: string; - companyName: string; -}; - -export interface NewUser { - email: string; - firstName: string; - lastName: string; - company: string; -} - -export interface DeleteUserInput { - userId: string; -} - -export interface SeatsAvailable { - maxSeats: number; - seatsAvailable: number; -} - -export interface TableUser { - id: string; - user: { - firstName: string; - lastName: string; - }; - email: string; - createdAt: string; -} - -export type UserQuery = UseQueryResult; - -export interface ColumnDict { - [index: string]: Column; -} - -export interface TaskDict { - [index: string]: Task; -} - -export interface Project { - id: string; - name: string; - prefix: string; - description: string; - tenantId: string; - userId: string; - active: boolean; - public: boolean; - columnOrder: string[]; - createdAt: string; - updatedAt: string; -} - -export interface Board { - columns: ColumnDict; - tasks: TaskDict; -} - -export interface Column { - id: string; - projectId: string; - title: string; - columnName: string; - taskIds: string[]; - created: string; -} - -export interface Task { - id: string; - key: string; - seq: number; - title: string; - points: number; - assignedTo: string; - comments: string[]; - attachments: string[]; - content: string; - projectId: string; - createdAt: string; - updatedAt: string; -} - -export interface AddTask { - projectId: string; - columnId: string; - task: string; -} - -export interface DeleteTask { - projectId: string; - columnId: string; - taskId: string; -} - -export interface MoveTask { - projectId: string; - to: string; - from: string; - taskId: string; - taskIds: string[]; -} - -export interface TMap { - [index: string]: { - path: string; - company: string; - id: string; - }; -} diff --git a/src/types/board.ts b/src/types/board.ts new file mode 100644 index 0000000..c95d7bf --- /dev/null +++ b/src/types/board.ts @@ -0,0 +1,56 @@ +export interface Board { + columns: ColumnDict; + tasks: TaskDict; +} + +export interface ColumnDict { + [index: string]: Column; +} + +export interface TaskDict { + [index: string]: Task; +} + +export interface Column { + id: string; + projectId: string; + title: string; + columnName: string; + taskIds: string[]; + created: string; +} + +export interface Task { + id: string; + key: string; + seq: number; + title: string; + points: number; + assignedTo: string; + comments: string[]; + attachments: string[]; + content: string; + projectId: string; + createdAt: string; + updatedAt: string; +} + +export interface AddTask { + projectId: string; + columnId: string; + task: string; +} + +export interface DeleteTask { + projectId: string; + columnId: string; + taskId: string; +} + +export interface MoveTask { + projectId: string; + to: string; + from: string; + taskId: string; + taskIds: string[]; +} diff --git a/src/components/TopBar/types.ts b/src/types/invite.ts similarity index 90% rename from src/components/TopBar/types.ts rename to src/types/invite.ts index dd0a2e0..7f61718 100644 --- a/src/components/TopBar/types.ts +++ b/src/types/invite.ts @@ -2,7 +2,6 @@ export interface Invite { id: string; userId: string; teamId: string; - teamName: string; read: boolean; accepted: boolean; expiration: string; diff --git a/src/types/project.ts b/src/types/project.ts new file mode 100644 index 0000000..d48f0cf --- /dev/null +++ b/src/types/project.ts @@ -0,0 +1,19 @@ +export interface Project { + id: string; + name: string; + prefix: string; + description: string; + tenantId: string; + userId: string; + active: boolean; + public: boolean; + columnOrder: string[]; + createdAt: string; + updatedAt: string; +} + +export interface PinnedProject { + tenantPath: string; + projectId: string; + name: string; +} diff --git a/src/types/tenant.ts b/src/types/tenant.ts new file mode 100644 index 0000000..1f5f359 --- /dev/null +++ b/src/types/tenant.ts @@ -0,0 +1,30 @@ +export interface ConnectionMap { + [index: string]: Connection; +} + +export type Connection = { + id: string; + path: string; + plan: string; + companyName: string; +}; + +export interface Organization { + id: string; + path: string; + name: string; + color?: string; +} + +export interface SeatsAvailable { + maxSeats: number; + seatsAvailable: number; +} + +export interface TMap { + [index: string]: { + path: string; + company: string; + id: string; + }; +} diff --git a/src/types/user.ts b/src/types/user.ts new file mode 100644 index 0000000..5c32241 --- /dev/null +++ b/src/types/user.ts @@ -0,0 +1,51 @@ +import { UseQueryResult } from "react-query"; + +import { ConnectionMap } from "./tenant"; + +export interface User { + id: string; + email: string; + emailVerified: boolean; + firstName: string; + lastName: string; + picture: string; + locale: string; + company?: string; + updatedAt: string; + createdAt: string; +} + +export interface UserDict { + [index: string]: User; +} + +export type CurrentUser = User & { + tenantId: string; + company: string; + accountOwner: boolean; + connections: ConnectionMap; + username: string; +}; + +export interface NewUser { + email: string; + firstName: string; + lastName: string; + company: string; +} + +export interface DeleteUserInput { + userId: string; +} + +export interface TableUser { + id: string; + user: { + firstName: string; + lastName: string; + }; + email: string; + createdAt: string; +} + +export type UserQuery = UseQueryResult; diff --git a/tsconfig.json b/tsconfig.json index 74463f8..d25f2e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "baseUrl": "src", "target": "es5", "lib": [ "dom",