diff --git a/package-lock.json b/package-lock.json index 53fe27b3..0c2c546e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "tauri-app", + "name": "yaak-app", "version": "0.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "tauri-app", + "name": "yaak-app", "version": "0.0.0", "dependencies": { "@codemirror/commands": "^6.2.1", @@ -51,10 +51,9 @@ "@types/parse-json": "^4.0.0", "@types/react-dom": "^18.0.6", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", "autoprefixer": "^10.4.13", - "concurrently": "^7.6.0", "eslint": "^8.34.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-import": "^2.27.5", @@ -911,6 +910,30 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", @@ -2149,19 +2172,19 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -2216,14 +2239,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" }, "engines": { @@ -2243,13 +2266,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2260,13 +2283,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2287,9 +2310,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2300,13 +2323,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2360,18 +2383,18 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -2419,12 +2442,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3055,20 +3078,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/cm6-graphql": { "version": "0.0.4-canary-b30a2325.0", "resolved": "https://registry.npmjs.org/cm6-graphql/-/cm6-graphql-0.0.4-canary-b30a2325.0.tgz", @@ -3119,118 +3128,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.1" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/concurrently/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concurrently/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -3335,19 +3232,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5488,12 +5372,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6594,21 +6472,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -6689,15 +6552,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -6789,12 +6643,6 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, "node_modules/stack-generator": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", @@ -7141,15 +6989,6 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/ts-easing": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", @@ -7624,56 +7463,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7688,15 +7477,6 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -7710,33 +7490,6 @@ "node": ">= 6" } }, - "node_modules/yargs": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.0.tgz", - "integrity": "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -8288,6 +8041,21 @@ "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", "optional": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, "@eslint/eslintrc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", @@ -9099,19 +8867,19 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -9143,53 +8911,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" } }, "@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -9224,18 +8992,18 @@ } }, "@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { @@ -9266,12 +9034,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -9713,17 +9481,6 @@ } } }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, "cm6-graphql": { "version": "0.0.4-canary-b30a2325.0", "resolved": "https://registry.npmjs.org/cm6-graphql/-/cm6-graphql-0.0.4-canary-b30a2325.0.tgz", @@ -9765,85 +9522,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -9927,12 +9605,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11530,12 +11202,6 @@ "p-locate": "^5.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -12288,23 +11954,6 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } - } - }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -12364,12 +12013,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -12432,12 +12075,6 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, "stack-generator": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", @@ -12716,12 +12353,6 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, "ts-easing": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", @@ -13025,43 +12656,6 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -13073,12 +12667,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -13089,27 +12677,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, - "yargs": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.0.tgz", - "integrity": "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index d40a1ce3..a9e24931 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "tauri-app", + "name": "yaak-app", "private": true, "version": "0.0.0", "type": "module", @@ -58,10 +58,9 @@ "@types/parse-json": "^4.0.0", "@types/react-dom": "^18.0.6", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", "autoprefixer": "^10.4.13", - "concurrently": "^7.6.0", "eslint": "^8.34.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-import": "^2.27.5", diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 2455c3cb..b8b66976 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -216,7 +216,9 @@ async fn actually_send_ephemeral_request( response = models::update_response_if_id(response, pool) .await .expect("Failed to update response"); - emit_all_others(&window, "updated_response", &response); + window + .emit_all("updated_model", &response) + .expect("Failed to emit updated_model"); Ok(response) } Err(e) => response_err(response, e.to_string(), window, pool).await, @@ -238,7 +240,9 @@ async fn send_request( let response = models::create_response(&req.id, 0, "", 0, None, "", vec![], pool) .await .expect("Failed to create response"); - emit_all_others(&window, "updated_response", &response); + window + .emit_all("updated_model", &response) + .expect("Failed to emit updated_model"); actually_send_ephemeral_request(req, response, window, pool).await?; Ok(()) @@ -254,7 +258,7 @@ async fn response_err( response = models::update_response_if_id(response, pool) .await .expect("Failed to update response"); - emit_all_others(&window, "updated_response", &response); + emit_all_others(&window, "updated_model", &response); Ok(response) } @@ -282,7 +286,7 @@ async fn set_key_value( .await .expect("Failed to create key value"); - emit_all_others(&window, "updated_key_value", &created_key_value); + emit_all_others(&window, "updated_model", &created_key_value); Ok(()) } @@ -298,7 +302,7 @@ async fn create_workspace( .await .expect("Failed to create workspace"); - emit_all_others(&window, "updated_workspace", &created_workspace); + emit_all_others(&window, "updated_model", &created_workspace); Ok(created_workspace.id) } @@ -330,7 +334,7 @@ async fn create_request( .await .expect("Failed to create request"); - emit_all_others(&window, "updated_request", &created_request); + emit_all_others(&window, "updated_model", &created_request); Ok(created_request.id) } @@ -345,7 +349,7 @@ async fn duplicate_request( let request = models::duplicate_request(id, pool) .await .expect("Failed to duplicate request"); - emit_all_others(&window, "updated_request", &request); + emit_all_others(&window, "updated_model", &request); Ok(request.id) } @@ -385,7 +389,7 @@ async fn update_request( .await .expect("Failed to update request"); - emit_all_others(&window, "updated_request", updated_request); + emit_all_others(&window, "updated_model", updated_request); Ok(()) } diff --git a/src-web/components/App.tsx b/src-web/components/App.tsx index 24beac03..3481829c 100644 --- a/src-web/components/App.tsx +++ b/src-web/components/App.tsx @@ -1,25 +1,11 @@ import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { persistQueryClient } from '@tanstack/react-query-persist-client'; -import { invoke } from '@tauri-apps/api'; -import { listen } from '@tauri-apps/api/event'; -import { appWindow } from '@tauri-apps/api/window'; import { MotionConfig } from 'framer-motion'; import { Suspense } from 'react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import { HelmetProvider } from 'react-helmet-async'; -import { matchPath } from 'react-router-dom'; -import { keyValueQueryKey } from '../hooks/useKeyValue'; -import { requestsQueryKey } from '../hooks/useRequests'; -import { responsesQueryKey } from '../hooks/useResponses'; -import { routePaths } from '../hooks/useRoutes'; -import { UPDATE_DEBOUNCE_MILLIS } from '../hooks/useTauriListeners'; -import { workspacesQueryKey } from '../hooks/useWorkspaces'; -import { DEFAULT_FONT_SIZE } from '../lib/constants'; -import { debounce } from '../lib/debounce'; -import { extractKeyValue } from '../lib/keyValueStore'; -import type { HttpRequest, HttpResponse, KeyValue, Workspace } from '../lib/models'; import { AppRouter } from './AppRouter'; import { DialogProvider } from './DialogContext'; @@ -43,106 +29,6 @@ persistQueryClient({ maxAge: 1000 * 60 * 60 * 24, // 24 hours }); -await listen( - 'updated_key_value', - debounce(({ payload: keyValue }: { payload: KeyValue }) => { - if (keyValue.updatedBy === appWindow.label) return; - queryClient.setQueryData(keyValueQueryKey(keyValue), extractKeyValue(keyValue)); - }, UPDATE_DEBOUNCE_MILLIS), -); - -await listen('updated_response', ({ payload: response }: { payload: HttpResponse }) => { - queryClient.setQueryData( - responsesQueryKey(response.requestId), - (responses: HttpResponse[] = []) => { - // We want updates from every response - // if (response.updatedBy === appWindow.label) return; - - const newResponses = []; - let found = false; - for (const r of responses) { - if (r.id === response.id) { - found = true; - newResponses.push(response); - } else { - newResponses.push(r); - } - } - if (!found) { - newResponses.push(response); - } - return newResponses; - }, - ); -}); - -await listen( - 'updated_workspace', - debounce(({ payload: workspace }: { payload: Workspace }) => { - queryClient.setQueryData(workspacesQueryKey(), (workspaces: Workspace[] = []) => { - if (workspace.updatedBy === appWindow.label) return; - - const newWorkspaces = []; - let found = false; - for (const w of workspaces) { - if (w.id === workspace.id) { - found = true; - newWorkspaces.push(workspace); - } else { - newWorkspaces.push(w); - } - } - if (!found) { - newWorkspaces.push(workspace); - } - return newWorkspaces; - }); - }, UPDATE_DEBOUNCE_MILLIS), -); - -await listen( - 'deleted_model', - ({ payload: model }: { payload: Workspace | HttpRequest | HttpResponse | KeyValue }) => { - function removeById(model: T) { - return (entries: T[] | undefined) => entries?.filter((e) => e.id !== model.id); - } - - if (model.model === 'workspace') { - queryClient.setQueryData(workspacesQueryKey(), removeById(model)); - } else if (model.model === 'http_request') { - queryClient.setQueryData(requestsQueryKey(model.workspaceId), removeById(model)); - } else if (model.model === 'http_response') { - queryClient.setQueryData(responsesQueryKey(model.requestId), removeById(model)); - } else if (model.model === 'key_value') { - queryClient.setQueryData(keyValueQueryKey(model), undefined); - } - }, -); - -await listen('send_request', async () => { - const params = matchPath(routePaths.request(), window.location.pathname); - const requestId = params?.params.requestId; - if (typeof requestId !== 'string') { - return; - } - await invoke('send_request', { requestId }); -}); - -await listen('zoom', ({ payload: zoomDelta }: { payload: number }) => { - const fontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize); - - let newFontSize; - if (zoomDelta === 0) { - newFontSize = DEFAULT_FONT_SIZE; - } else if (zoomDelta > 0) { - newFontSize = Math.min(fontSize * 1.1, DEFAULT_FONT_SIZE * 5); - } else if (zoomDelta < 0) { - newFontSize = Math.max(fontSize * 0.9, DEFAULT_FONT_SIZE * 0.4); - } - - document.documentElement.style.fontSize = `${newFontSize}px`; -}); - export function App() { return ( diff --git a/src-web/components/RequestPane.tsx b/src-web/components/RequestPane.tsx index 2d44012d..3d65e042 100644 --- a/src-web/components/RequestPane.tsx +++ b/src-web/components/RequestPane.tsx @@ -1,8 +1,8 @@ import classnames from 'classnames'; import type { CSSProperties } from 'react'; import { memo, useCallback, useMemo, useState } from 'react'; +import { createGlobalState } from 'react-use'; import { useActiveRequest } from '../hooks/useActiveRequest'; -import { useKeyValue } from '../hooks/useKeyValue'; import { useRequestUpdateKey } from '../hooks/useRequestUpdateKey'; import { useUpdateRequest } from '../hooks/useUpdateRequest'; import { tryFormatJson } from '../lib/formatters'; @@ -33,15 +33,14 @@ interface Props { className?: string; } +const useActiveTab = createGlobalState('body'); + export const RequestPane = memo(function RequestPane({ style, fullHeight, className }: Props) { const activeRequest = useActiveRequest(); const activeRequestId = activeRequest?.id ?? null; const updateRequest = useUpdateRequest(activeRequestId); const [forceUpdateHeaderEditorKey, setForceUpdateHeaderEditorKey] = useState(0); - const activeTab = useKeyValue({ - key: ['active_request_body_tab'], - defaultValue: 'body', - }); + const [activeTab, setActiveTab] = useActiveTab(); const tabs: TabItem[] = useMemo( () => @@ -136,8 +135,8 @@ export const RequestPane = memo(function RequestPane({ style, fullHeight, classN <> ({ key: 'last_workspace', defaultValue: null }); const routes = useRoutes(); const workspaces = useWorkspaces(); const workspace = workspaces[0]; diff --git a/src-web/components/core/Dialog.tsx b/src-web/components/core/Dialog.tsx index da919c7b..dde6fb00 100644 --- a/src-web/components/core/Dialog.tsx +++ b/src-web/components/core/Dialog.tsx @@ -1,10 +1,10 @@ import classnames from 'classnames'; import { motion } from 'framer-motion'; -import { useMemo } from 'react'; import type { ReactNode } from 'react'; +import { useMemo } from 'react'; import { Overlay } from '../Overlay'; import { IconButton } from './IconButton'; -import { HStack, VStack } from './Stacks'; +import { VStack } from './Stacks'; export interface DialogProps { children: ReactNode; diff --git a/src-web/components/core/Editor/extensions.ts b/src-web/components/core/Editor/extensions.ts index ef6338aa..703d7bbf 100644 --- a/src-web/components/core/Editor/extensions.ts +++ b/src-web/components/core/Editor/extensions.ts @@ -33,7 +33,6 @@ import { } from '@codemirror/view'; import { tags as t } from '@lezer/highlight'; import { graphql, graphqlLanguageSupport } from 'cm6-graphql'; -import { render } from 'react-dom'; import type { EditorProps } from './index'; import { text } from './text/extension'; import { twig } from './twig/extension'; diff --git a/src-web/components/core/RadioDropdown.tsx b/src-web/components/core/RadioDropdown.tsx index 1d2bbae5..d02b3729 100644 --- a/src-web/components/core/RadioDropdown.tsx +++ b/src-web/components/core/RadioDropdown.tsx @@ -3,23 +3,28 @@ import type { DropdownItemSeparator, DropdownProps } from './Dropdown'; import { Dropdown } from './Dropdown'; import { Icon } from './Icon'; -export type RadioDropdownItem = +export type RadioDropdownItem = | { type?: 'default'; label: string; shortLabel?: string; - value: string | null; + value: T; } | DropdownItemSeparator; -export interface RadioDropdownProps { - value: string | null; - onChange: (value: string | null) => void; - items: RadioDropdownItem[]; +export interface RadioDropdownProps { + value: T; + onChange: (value: T) => void; + items: RadioDropdownItem[]; children: DropdownProps['children']; } -export function RadioDropdown({ value, items, onChange, children }: RadioDropdownProps) { +export function RadioDropdown({ + value, + items, + onChange, + children, +}: RadioDropdownProps) { const dropdownItems = useMemo( () => items.map((item) => { diff --git a/src-web/hooks/Confirm.tsx b/src-web/hooks/Confirm.tsx index 734fbf1b..7f2e703e 100644 --- a/src-web/hooks/Confirm.tsx +++ b/src-web/hooks/Confirm.tsx @@ -1,5 +1,3 @@ -import { useRef } from 'react'; -import { useMount } from 'react-use'; import { Button } from '../components/core/Button'; import { HStack } from '../components/core/Stacks'; diff --git a/src-web/hooks/useDeleteRequest.ts b/src-web/hooks/useDeleteRequest.ts index c8c7f379..50779f85 100644 --- a/src-web/hooks/useDeleteRequest.ts +++ b/src-web/hooks/useDeleteRequest.ts @@ -14,7 +14,7 @@ export function useDeleteRequest(id: string | null) { }, onSuccess: async () => { if (workspaceId === null || id === null) return; - await queryClient.invalidateQueries(requestsQueryKey(workspaceId)); + await queryClient.invalidateQueries(requestsQueryKey({ workspaceId })); }, }); } diff --git a/src-web/hooks/useDeleteResponses.ts b/src-web/hooks/useDeleteResponses.ts index ec98c4d6..57a2c56d 100644 --- a/src-web/hooks/useDeleteResponses.ts +++ b/src-web/hooks/useDeleteResponses.ts @@ -11,7 +11,7 @@ export function useDeleteResponses(requestId?: string) { }, onSuccess: async () => { if (!requestId) return; - await queryClient.invalidateQueries(responsesQueryKey(requestId)); + await queryClient.invalidateQueries(responsesQueryKey({ requestId })); }, }); } diff --git a/src-web/hooks/useRequests.ts b/src-web/hooks/useRequests.ts index 70914296..eb693752 100644 --- a/src-web/hooks/useRequests.ts +++ b/src-web/hooks/useRequests.ts @@ -3,7 +3,7 @@ import { invoke } from '@tauri-apps/api'; import type { HttpRequest } from '../lib/models'; import { useActiveWorkspaceId } from './useActiveWorkspaceId'; -export function requestsQueryKey(workspaceId: string) { +export function requestsQueryKey({ workspaceId }: { workspaceId: string }) { return ['http_requests', { workspaceId }]; } @@ -12,7 +12,7 @@ export function useRequests() { return ( useQuery({ enabled: workspaceId != null, - queryKey: requestsQueryKey(workspaceId ?? 'n/a'), + queryKey: requestsQueryKey({ workspaceId: workspaceId ?? 'n/a' }), queryFn: async () => { if (workspaceId == null) return []; return (await invoke('requests', { workspaceId })) as HttpRequest[]; diff --git a/src-web/hooks/useResponses.ts b/src-web/hooks/useResponses.ts index 3fa61934..9a7e38b9 100644 --- a/src-web/hooks/useResponses.ts +++ b/src-web/hooks/useResponses.ts @@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { invoke } from '@tauri-apps/api'; import type { HttpResponse } from '../lib/models'; -export function responsesQueryKey(requestId: string) { +export function responsesQueryKey({ requestId }: { requestId: string }) { return ['http_responses', { requestId }]; } @@ -11,7 +11,7 @@ export function useResponses(requestId: string | null) { useQuery({ enabled: requestId !== null, initialData: [], - queryKey: responsesQueryKey(requestId ?? 'n/a'), + queryKey: responsesQueryKey({ requestId: requestId ?? 'n/a' }), queryFn: async () => { return (await invoke('responses', { requestId, diff --git a/src-web/hooks/useSidebarDisplay.ts b/src-web/hooks/useSidebarDisplay.ts index f3ad6248..a94a5cf0 100644 --- a/src-web/hooks/useSidebarDisplay.ts +++ b/src-web/hooks/useSidebarDisplay.ts @@ -1,4 +1,5 @@ import { useCallback } from 'react'; +import { NAMESPACE_NO_SYNC } from '../lib/keyValueStore'; import { useKeyValue } from './useKeyValue'; const START_WIDTH = 200; @@ -15,6 +16,7 @@ export interface SidebarDisplay { export function useSidebarDisplay() { const display = useKeyValue({ + namespace: NAMESPACE_NO_SYNC, key: sidebarDisplayKey, defaultValue: sidebarDisplayDefaultValue, }); diff --git a/src-web/hooks/useTauriListeners.ts b/src-web/hooks/useTauriListeners.ts index 291147f7..07d84292 100644 --- a/src-web/hooks/useTauriListeners.ts +++ b/src-web/hooks/useTauriListeners.ts @@ -1,70 +1,136 @@ import { useQueryClient } from '@tanstack/react-query'; -import { listen } from '@tauri-apps/api/event'; +import { invoke } from '@tauri-apps/api'; +import type { EventCallback } from '@tauri-apps/api/event'; import { appWindow } from '@tauri-apps/api/window'; -import { useEffect } from 'react'; +import { matchPath } from 'react-router-dom'; +import { useEffectOnce } from 'react-use'; +import { DEFAULT_FONT_SIZE } from '../lib/constants'; import { debounce } from '../lib/debounce'; -import type { HttpRequest } from '../lib/models'; +import { extractKeyValue, NAMESPACE_NO_SYNC } from '../lib/keyValueStore'; +import type { HttpRequest, HttpResponse, KeyValue, Model, Workspace } from '../lib/models'; +import { modelsEq } from '../lib/models'; +import { keyValueQueryKey } from './useKeyValue'; import { requestsQueryKey } from './useRequests'; import { useRequestUpdateKey } from './useRequestUpdateKey'; +import { responsesQueryKey } from './useResponses'; +import { routePaths } from './useRoutes'; import { useSidebarDisplay } from './useSidebarDisplay'; +import { workspacesQueryKey } from './useWorkspaces'; const unsubFns: (() => void)[] = []; -export const UPDATE_DEBOUNCE_MILLIS = 1000; +export const UPDATE_DEBOUNCE_MILLIS = 100; export function useTauriListeners() { const sidebarDisplay = useSidebarDisplay(); const queryClient = useQueryClient(); const { wasUpdatedExternally } = useRequestUpdateKey(null); - useEffect(() => { + useEffectOnce(() => { let unmounted = false; - appWindow - .listen('toggle_sidebar', async () => { - sidebarDisplay.toggle(); - }) - .then((unsub) => { + // eslint-disable-next-line @typescript-eslint/ban-types + function listen(event: string, fn: EventCallback) { + appWindow.listen(event, fn).then((unsub) => { if (unmounted) unsub(); else unsubFns.push(unsub); }); + } - listen('refresh', () => { - location.reload(); - }).then((unsub) => { - if (unmounted) unsub(); - else unsubFns.push(unsub); + function listenDebounced(event: string, fn: EventCallback) { + listen(event, debounce(fn, UPDATE_DEBOUNCE_MILLIS)); + } + + listen('toggle_sidebar', sidebarDisplay.toggle); + listen('refresh', () => location.reload()); + + listenDebounced('updated_key_value', ({ payload: keyValue }: { payload: KeyValue }) => { + if (keyValue.namespace !== NAMESPACE_NO_SYNC) { + queryClient.setQueryData(keyValueQueryKey(keyValue), extractKeyValue(keyValue)); + } }); - appWindow - .listen( - 'updated_request', - debounce(({ payload: request }: { payload: HttpRequest }) => { - queryClient.setQueryData( - requestsQueryKey(request.workspaceId), - (requests: HttpRequest[] = []) => { - const newRequests = []; - let found = false; - for (const r of requests) { - if (r.id === request.id) { - found = true; - newRequests.push(request); - } else { - newRequests.push(r); - } - } - if (!found) { - newRequests.push(request); - } - setTimeout(() => wasUpdatedExternally(request.id), 50); - return newRequests; - }, - ); - }, UPDATE_DEBOUNCE_MILLIS), - ) - .then((unsub) => { - if (unmounted) unsub(); - else unsubFns.push(unsub); - }); + listenDebounced('updated_model', ({ payload }: { payload: Model }) => { + const queryKey = + payload.model === 'http_request' + ? requestsQueryKey(payload) + : payload.model === 'http_response' + ? responsesQueryKey(payload) + : payload.model === 'workspace' + ? workspacesQueryKey(payload) + : payload.model === 'key_value' + ? keyValueQueryKey(payload) + : null; + + if (queryKey === null) { + throw new Error('Unrecognized updated model ' + payload.model); + } + + const skipSync = payload.model === 'key_value' && payload.namespace === NAMESPACE_NO_SYNC; + + if (!skipSync) { + queryClient.setQueryData(queryKey, (values: Model[] = []) => { + const newValues = []; + let found = false; + for (const v of values) { + if (modelsEq(v, payload)) { + found = true; + newValues.push(payload); + } else { + newValues.push(v); + } + } + + // Doesn't exist already, so add it to the list + if (!found) newValues.push(payload); + + if (payload.model === 'http_request') { + setTimeout(() => wasUpdatedExternally(payload.id), 50); + } + + return newValues; + }); + } + }); + + listen('deleted_model', ({ payload: model }: { payload: Model }) => { + function removeById(model: T) { + return (entries: T[] | undefined) => entries?.filter((e) => e.id !== model.id); + } + + if (model.model === 'workspace') { + queryClient.setQueryData(workspacesQueryKey(), removeById(model)); + } else if (model.model === 'http_request') { + queryClient.setQueryData(requestsQueryKey(model), removeById(model)); + } else if (model.model === 'http_response') { + queryClient.setQueryData(responsesQueryKey(model), removeById(model)); + } else if (model.model === 'key_value') { + queryClient.setQueryData(keyValueQueryKey(model), undefined); + } + }); + + listen('send_request', async () => { + const params = matchPath(routePaths.request(), window.location.pathname); + const requestId = params?.params.requestId; + if (typeof requestId !== 'string') { + return; + } + await invoke('send_request', { requestId }); + }); + + listen('zoom', ({ payload: zoomDelta }: { payload: number }) => { + const fontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize); + + let newFontSize; + if (zoomDelta === 0) { + newFontSize = DEFAULT_FONT_SIZE; + } else if (zoomDelta > 0) { + newFontSize = Math.min(fontSize * 1.1, DEFAULT_FONT_SIZE * 5); + } else if (zoomDelta < 0) { + newFontSize = Math.max(fontSize * 0.9, DEFAULT_FONT_SIZE * 0.4); + } + + document.documentElement.style.fontSize = `${newFontSize}px`; + }); return () => { unmounted = true; @@ -72,5 +138,5 @@ export function useTauriListeners() { unsub(); } }; - }, []); + }); } diff --git a/src-web/hooks/useUniqueKey.ts b/src-web/hooks/useUniqueKey.ts deleted file mode 100644 index 92731a75..00000000 --- a/src-web/hooks/useUniqueKey.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useState } from 'react'; - -export function useUniqueKey(len = 10): { key: string; regenerate: () => void } { - const [key, setKey] = useState(() => generate(len)); - return { key, wasUpdatedExternally: () => setKey(generate(len)) }; -} - -const CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - -function generate(len: number): string { - const chars = []; - for (let i = 0; i < len; i++) { - chars.push(CHARS[Math.floor(Math.random() * CHARS.length)]); - } - return chars.join(''); -} diff --git a/src-web/hooks/useUpdateAnyRequest.ts b/src-web/hooks/useUpdateAnyRequest.ts index 2c3ec3a4..ff63882d 100644 --- a/src-web/hooks/useUpdateAnyRequest.ts +++ b/src-web/hooks/useUpdateAnyRequest.ts @@ -19,10 +19,8 @@ export function useUpdateAnyRequest() { onMutate: async ({ id, update }) => { const request = await getRequest(id); if (request === null) return; - queryClient.setQueryData( - requestsQueryKey(request?.workspaceId), - (requests: HttpRequest[] | undefined) => - requests?.map((r) => (r.id === request.id ? update(r) : r)), + queryClient.setQueryData(requestsQueryKey(request), (requests: HttpRequest[] | undefined) => + requests?.map((r) => (r.id === request.id ? update(r) : r)), ); }, }); diff --git a/src-web/hooks/useUpdateRequest.ts b/src-web/hooks/useUpdateRequest.ts index e97e9ac4..1f49a8ef 100644 --- a/src-web/hooks/useUpdateRequest.ts +++ b/src-web/hooks/useUpdateRequest.ts @@ -1,6 +1,5 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { invoke } from '@tauri-apps/api'; -import { appWindow } from '@tauri-apps/api/window'; import type { HttpRequest } from '../lib/models'; import { getRequest } from '../lib/store'; import { requestsQueryKey } from './useRequests'; @@ -21,14 +20,9 @@ export function useUpdateRequest(id: string | null) { const request = await getRequest(id); if (request === null) return; - // Sync updatedBy so that the UI doesn't think the update is coming from elsewhere - request.updatedBy = appWindow.label; - const newRequest = typeof v === 'function' ? v(request) : { ...request, ...v }; - queryClient.setQueryData( - requestsQueryKey(request?.workspaceId), - (requests: HttpRequest[] | undefined) => - requests?.map((r) => (r.id === newRequest.id ? newRequest : r)), + queryClient.setQueryData(requestsQueryKey(request), (requests: HttpRequest[] | undefined) => + requests?.map((r) => (r.id === newRequest.id ? newRequest : r)), ); }, }); diff --git a/src-web/hooks/useWorkspaces.ts b/src-web/hooks/useWorkspaces.ts index f1053479..4ea8db21 100644 --- a/src-web/hooks/useWorkspaces.ts +++ b/src-web/hooks/useWorkspaces.ts @@ -1,8 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; import { invoke } from '@tauri-apps/api'; import type { Workspace } from '../lib/models'; -import { useQuery } from '@tanstack/react-query'; -export function workspacesQueryKey() { +// eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/ban-types +export function workspacesQueryKey(_?: {}) { return ['workspaces']; } diff --git a/src-web/lib/keyValueStore.ts b/src-web/lib/keyValueStore.ts index 389f7c27..0db31dc2 100644 --- a/src-web/lib/keyValueStore.ts +++ b/src-web/lib/keyValueStore.ts @@ -1,10 +1,11 @@ import { invoke } from '@tauri-apps/api'; import type { KeyValue } from './models'; -const DEFAULT_NAMESPACE = 'app'; +export const NAMESPACE_GLOBAL = 'global'; +export const NAMESPACE_NO_SYNC = 'no_sync'; export async function setKeyValue({ - namespace = DEFAULT_NAMESPACE, + namespace = NAMESPACE_GLOBAL, key, value, }: { @@ -20,7 +21,7 @@ export async function setKeyValue({ } export async function getKeyValue({ - namespace = DEFAULT_NAMESPACE, + namespace = NAMESPACE_GLOBAL, key, fallback, }: { diff --git a/src-web/lib/models.ts b/src-web/lib/models.ts index 3c8136cf..7ce81754 100644 --- a/src-web/lib/models.ts +++ b/src-web/lib/models.ts @@ -2,7 +2,6 @@ export interface BaseModel { readonly id: string; readonly createdAt: string; readonly updatedAt: string; - updatedBy: string; } export interface Workspace extends BaseModel { @@ -26,6 +25,18 @@ export const AUTH_TYPE_NONE = null; export const AUTH_TYPE_BASIC = 'basic'; export const AUTH_TYPE_BEARER = 'bearer'; +export type Model = Workspace | HttpRequest | HttpResponse | KeyValue; + +export function modelsEq(a: Model, b: Model) { + if (a.model === 'key_value' && b.model === 'key_value') { + return a.key === b.key && a.namespace === b.namespace; + } + if ('id' in a && 'id' in b) { + return a.id === b.id; + } + return false; +} + export interface HttpRequest extends BaseModel { readonly workspaceId: string; readonly model: 'http_request';