diff --git a/codegen.yml b/codegen.yml index b62f4bd..53058e5 100644 --- a/codegen.yml +++ b/codegen.yml @@ -1,5 +1,7 @@ -schema: - - src/graphql/build-schema.js +schema: src/graphql/build-schema.js +documents: + - "src/**/*.graphql" + # This should be updated to match your client files # documents: 'client/**/!(*.d).{ts,tsx}' generates: @@ -7,9 +9,16 @@ generates: schema.graphql: plugins: - schema-ast - # This will contain the generated apollo hooks and schema types needed to make type-safe queries with the apollo client - # __generated__/operations.ts: - # plugins: - # - typescript - # - typescript-operations - # - typescript-react-apollo + + src/graphql/types.generated.ts: + plugins: + - typescript + + src/: + preset: near-operation-file + presetConfig: + extension: .generated.tsx + baseTypesPath: graphql/types.generated.ts + plugins: + - typescript-operations + - typed-document-node diff --git a/graphql.config.yaml b/graphql.config.yaml new file mode 100644 index 0000000..72edfcf --- /dev/null +++ b/graphql.config.yaml @@ -0,0 +1 @@ +schema: http://localhost:3000/api/graphql diff --git a/package-lock.json b/package-lock.json index 65e9b7a..b152ed8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { + "@graphql-codegen/typed-document-node": "^2.2.8", "@graphql-yoga/node": "^2.1.0", "@pothos/core": "^3.5.1", "@pothos/plugin-prisma": "^3.4.0", @@ -41,6 +42,7 @@ "multiselect-react-dropdown": "^2.0.17", "next": "12", "next-plausible": "^3.1.6", + "next-urql": "^3.3.2", "nprogress": "^0.2.0", "open": "^7.3.1", "papaparse": "^5.3.0", @@ -58,6 +60,7 @@ "react-dropdown": "^1.9.2", "react-hook-form": "^7.27.0", "react-icons": "^4.2.0", + "react-is": "^18.0.0", "react-markdown": "^8.0.0", "react-safe": "^1.3.0", "react-select": "^5.2.2", @@ -67,10 +70,12 @@ "tailwindcss": "^3.0.22", "textversionjs": "^1.1.3", "ts-node": "^10.7.0", - "tunnel": "^0.0.6" + "tunnel": "^0.0.6", + "urql": "^2.2.0" }, "devDependencies": { "@graphql-codegen/cli": "^2.6.2", + "@graphql-codegen/near-operation-file-preset": "^2.2.9", "@graphql-codegen/schema-ast": "^2.4.1", "@graphql-codegen/typescript": "^2.4.8", "@graphql-codegen/typescript-operations": "^2.3.5", @@ -285,7 +290,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -324,7 +328,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -381,7 +384,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, @@ -424,7 +426,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "dependencies": { "@babel/types": "^7.16.7" }, @@ -445,7 +446,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-member-expression-to-functions": "^7.16.7", @@ -473,7 +473,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.0" }, @@ -626,7 +625,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -642,7 +640,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", @@ -661,7 +658,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -673,7 +669,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -703,7 +698,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -715,7 +709,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -730,7 +723,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -745,7 +737,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -760,7 +751,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -782,7 +772,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -797,7 +786,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -812,7 +800,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-flow": "^7.16.7" @@ -828,7 +815,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -843,7 +829,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-function-name": "^7.16.7", @@ -860,7 +845,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -875,7 +859,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -890,7 +873,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -908,7 +890,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7" @@ -924,7 +905,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -939,7 +919,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -954,7 +933,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -969,7 +947,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -988,7 +965,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1003,7 +979,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" @@ -1019,7 +994,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" }, @@ -1463,6 +1437,19 @@ "integrity": "sha512-Th9DetZjRlMZrb74kgGJ44oWcoFyOTE884WlSuXft0Cd+J09vHRxiB7eVyK7Gthb4cSevsBBJDHYAbGGL25wPw==", "license": "(LGPL-3.0 OR MPL-2.0)" }, + "node_modules/@graphql-codegen/add": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.1.1.tgz", + "integrity": "sha512-XkVwcqosa0CVBlL1HaQT0gp+EUfhuQE3LzrEpzMQLwchxaj/NPVYtOJL6MUHaYDsHzLqxWrufjfbeB3y2NQgRw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^2.3.2", + "tslib": "~2.3.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@graphql-codegen/cli": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.6.2.tgz", @@ -1546,11 +1533,27 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/near-operation-file-preset": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@graphql-codegen/near-operation-file-preset/-/near-operation-file-preset-2.2.9.tgz", + "integrity": "sha512-ytvI5wDq+92sGp+h+HEi4+biDNWsgKdRJVm5P1wzzFuc67qTPB1EipbJF4oUqSqtV6kaTu3mdHPf5yU0SWusSw==", + "dev": true, + "dependencies": { + "@graphql-codegen/add": "^3.1.1", + "@graphql-codegen/plugin-helpers": "^2.4.0", + "@graphql-codegen/visitor-plugin-common": "2.7.4", + "@graphql-tools/utils": "^8.5.2", + "parse-filepath": "^1.0.2", + "tslib": "~2.3.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@graphql-codegen/plugin-helpers": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.4.2.tgz", "integrity": "sha512-LJNvwAPv/sKtI3RnRDm+nPD+JeOfOuSOS4FFIpQCMUCyMnFcchV/CPTTv7tT12fLUpEg6XjuFfDBvOwndti30Q==", - "dev": true, "dependencies": { "@graphql-tools/utils": "^8.5.2", "change-case-all": "1.0.14", @@ -1577,6 +1580,21 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-2.2.8.tgz", + "integrity": "sha512-72qTGNOMVnT51Fenk1MvavOwdyJewCZlrEp0miiTjtOSiTPzAm1acOck7cx8smNWyxNaDh3g4Jf60MkS8VCySw==", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^2.4.0", + "@graphql-codegen/visitor-plugin-common": "2.7.4", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.14", + "tslib": "~2.3.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@graphql-codegen/typescript": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.4.8.tgz", @@ -1613,7 +1631,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.7.4.tgz", "integrity": "sha512-aaDoEudDD+B7DK/UwDSL2Fzej75N9hNJ3N8FQuTIeDyw6FNGWUxmkjVBLQGlzfnYfK8IYkdfYkrPn3Skq0pVxA==", - "dev": true, "dependencies": { "@graphql-codegen/plugin-helpers": "^2.4.0", "@graphql-tools/optimize": "^1.0.1", @@ -1828,7 +1845,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.2.0.tgz", "integrity": "sha512-l0PTqgHeorQdeOizUor6RB49eOAng9+abSxiC5/aHRo6hMmXVaqv5eqndlmxCpx9BkgNb3URQbK+ZZHVktkP/g==", - "dev": true, "dependencies": { "tslib": "~2.3.0" }, @@ -1871,7 +1887,6 @@ "version": "6.4.6", "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.4.6.tgz", "integrity": "sha512-RJ2zoVUGPXbs1zdFjY56YWGsJaG9RyTOk5wlFe369ts+iXnzpM0ezszLfOjggtXUPlVTbjWNmdHASOh3rZ8uBA==", - "dev": true, "dependencies": { "@graphql-tools/utils": "8.6.6", "relay-compiler": "12.0.0", @@ -1885,7 +1900,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1894,7 +1908,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -1903,7 +1916,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1914,7 +1926,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -1923,7 +1934,6 @@ "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-12.0.0.tgz", "integrity": "sha512-SWqeSQZ+AMU/Cr7iZsHi1e78Z7oh00I5SvR092iCJq79aupqJ6Ds+I1Pz/Vzo5uY5PY0jvC4rBJXzlIN5g9boQ==", - "dev": true, "dependencies": { "@babel/core": "^7.14.0", "@babel/generator": "^7.14.0", @@ -1954,7 +1964,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1968,7 +1977,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1980,7 +1988,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1993,14 +2000,12 @@ "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -2022,7 +2027,6 @@ "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -3273,6 +3277,18 @@ "@types/node": "*" } }, + "node_modules/@urql/core": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.4.4.tgz", + "integrity": "sha512-TD+OS7jG1Ts6QkpU0TZ85i/vu40r71GF0QQFDhnWFtgkHcNwnpkIwWBMa72AR3j2imBTPpk61e/xb39uM/t37A==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@vercel/node-bridge": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@vercel%2fnode-bridge/-/node-bridge-2.1.1.tgz", @@ -3536,8 +3552,7 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "node_modules/asynckit": { "version": "0.4.0", @@ -3561,7 +3576,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", - "dev": true, "engines": { "node": ">=8" }, @@ -3684,7 +3698,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "dependencies": { "object.assign": "^4.1.0" } @@ -3719,8 +3732,7 @@ "node_modules/babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, "node_modules/babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.2", @@ -3748,7 +3760,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, "dependencies": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", @@ -4003,7 +4014,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4060,7 +4070,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, "dependencies": { "node-int64": "^0.4.0" } @@ -4154,7 +4163,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -4176,7 +4184,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -4238,7 +4245,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -4275,7 +4281,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -4295,7 +4300,6 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", - "dev": true, "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", @@ -4654,7 +4658,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -4672,7 +4675,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, "license": "MIT" }, "node_modules/consola": { @@ -4693,7 +4695,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -5119,7 +5120,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5219,7 +5219,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "dependencies": { "object-keys": "^1.0.12" }, @@ -5269,7 +5268,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, "engines": { "node": ">= 0.6.0" } @@ -5459,7 +5457,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -5513,8 +5510,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encoding": { "version": "0.1.12", @@ -5784,7 +5780,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, "dependencies": { "bser": "2.1.1" } @@ -5793,7 +5788,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "dev": true, "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -5807,8 +5801,7 @@ "node_modules/fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "dev": true + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, "node_modules/fetch": { "version": "1.1.0", @@ -5905,7 +5898,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6037,7 +6029,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -6126,7 +6117,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -6135,7 +6125,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6177,7 +6166,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -6424,7 +6412,6 @@ "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dev": true, "dependencies": { "tslib": "^2.1.0" }, @@ -6504,7 +6491,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6533,7 +6519,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" @@ -6548,6 +6533,11 @@ "react-is": "^16.7.0" } }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -6718,7 +6708,6 @@ "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -6743,7 +6732,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, "engines": { "node": ">=12.2" }, @@ -6764,7 +6752,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -6774,8 +6761,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -6929,7 +6915,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" @@ -7085,7 +7070,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -7139,7 +7123,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, "dependencies": { "is-unc-path": "^1.0.0" }, @@ -7162,7 +7145,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, "dependencies": { "unc-path-regex": "^0.1.2" }, @@ -7186,7 +7168,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -7208,7 +7189,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7983,7 +7963,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -8243,7 +8222,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -8252,7 +8230,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -8286,7 +8263,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9245,7 +9221,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -35384,6 +35359,18 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, + "node_modules/next-urql": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/next-urql/-/next-urql-3.3.2.tgz", + "integrity": "sha512-oXQHCFU0R3pIwXWtDqZDYOjKcD7SlNP7aove9YuukgKuItdtIR9CRUgo3qMOD5dSQ3wBBGfQ8zR6XtzqV5WiGg==", + "dependencies": { + "react-ssr-prepass": "^1.4.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "urql": "^2.0.0" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", @@ -35406,7 +35393,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -35482,8 +35468,7 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node_modules/node-releases": { "version": "2.0.2", @@ -35577,8 +35562,7 @@ "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "node_modules/number-is-nan": { "version": "1.0.1", @@ -35617,7 +35601,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -35626,7 +35609,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -35831,7 +35813,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -35843,7 +35824,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -35878,7 +35858,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -36081,7 +36060,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -36103,7 +36081,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -36148,7 +36125,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -36158,7 +36134,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -36168,7 +36143,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -36177,7 +36151,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -36202,7 +36175,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, "dependencies": { "path-root-regex": "^0.1.0" }, @@ -36214,7 +36186,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -37011,7 +36982,6 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, "dependencies": { "asap": "~2.0.3" } @@ -37027,6 +36997,11 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/property-information": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", @@ -37245,10 +37220,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.0.0.tgz", + "integrity": "sha512-yUcBYdBBbo3QiPsgYDcfQcIkGZHfxOaoE6HLSnr1sPzMhdyxusbfKOSUbSd/ocGi32dxcj366PsTj+5oggeKKw==" }, "node_modules/react-markdown": { "version": "8.0.1", @@ -37318,6 +37292,14 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, + "node_modules/react-ssr-prepass": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", + "integrity": "sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", @@ -37431,7 +37413,6 @@ "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", - "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", "fbjs": "^3.0.0", @@ -37519,7 +37500,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -37527,8 +37507,7 @@ "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "node_modules/reschema": { "version": "2.2.0", @@ -37782,7 +37761,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -37793,14 +37771,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "node_modules/sharp": { "version": "0.30.3", @@ -37857,8 +37833,7 @@ "node_modules/signedsource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=", - "dev": true + "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -37976,7 +37951,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -38050,7 +38024,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -38327,7 +38300,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -38518,7 +38490,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -38763,7 +38734,6 @@ "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -38789,7 +38759,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -38991,7 +38960,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -39000,7 +38968,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -39017,6 +38984,19 @@ "node": ">=4" } }, + "node_modules/urql": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/urql/-/urql-2.2.0.tgz", + "integrity": "sha512-36wnWqDrpXqhwT5r2/qRSZXhb7Y4sXA0nLlYEd3uLgvfIdOA8kUaPdfTujzfrvfCcfiVVFxhzqVAhc8r17NMwQ==", + "dependencies": { + "@urql/core": "^2.4.3", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "react": ">= 16.8.0" + } + }, "node_modules/use-subscription": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", @@ -39226,8 +39206,7 @@ "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "node_modules/wide-align": { "version": "1.1.5", @@ -39239,6 +39218,11 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wonka": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", + "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==" + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -39692,7 +39676,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -39719,7 +39702,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -39759,7 +39741,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, "requires": { "@babel/types": "^7.17.0" } @@ -39791,7 +39772,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -39805,7 +39785,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-member-expression-to-functions": "^7.16.7", @@ -39826,7 +39805,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -39929,7 +39907,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -39939,7 +39916,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, "requires": { "@babel/compat-data": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", @@ -39952,7 +39928,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -39961,7 +39936,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz", "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -39978,7 +39952,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -39987,7 +39960,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -39996,7 +39968,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40005,7 +39976,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40014,7 +39984,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -40030,7 +39999,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40039,7 +40007,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40048,7 +40015,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz", "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-flow": "^7.16.7" @@ -40058,7 +40024,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40067,7 +40032,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-function-name": "^7.16.7", @@ -40078,7 +40042,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40087,7 +40050,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40096,7 +40058,6 @@ "version": "7.17.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -40108,7 +40069,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7" @@ -40118,7 +40078,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40127,7 +40086,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40136,7 +40094,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40145,7 +40102,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -40158,7 +40114,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40167,7 +40122,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" @@ -40177,7 +40131,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -40474,6 +40427,16 @@ "resolved": "https://registry.npmjs.org/@glennsl%2fbs-json/-/bs-json-5.0.4.tgz", "integrity": "sha512-Th9DetZjRlMZrb74kgGJ44oWcoFyOTE884WlSuXft0Cd+J09vHRxiB7eVyK7Gthb4cSevsBBJDHYAbGGL25wPw==" }, + "@graphql-codegen/add": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-3.1.1.tgz", + "integrity": "sha512-XkVwcqosa0CVBlL1HaQT0gp+EUfhuQE3LzrEpzMQLwchxaj/NPVYtOJL6MUHaYDsHzLqxWrufjfbeB3y2NQgRw==", + "dev": true, + "requires": { + "@graphql-codegen/plugin-helpers": "^2.3.2", + "tslib": "~2.3.0" + } + }, "@graphql-codegen/cli": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.6.2.tgz", @@ -40545,11 +40508,24 @@ "tslib": "~2.3.0" } }, + "@graphql-codegen/near-operation-file-preset": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@graphql-codegen/near-operation-file-preset/-/near-operation-file-preset-2.2.9.tgz", + "integrity": "sha512-ytvI5wDq+92sGp+h+HEi4+biDNWsgKdRJVm5P1wzzFuc67qTPB1EipbJF4oUqSqtV6kaTu3mdHPf5yU0SWusSw==", + "dev": true, + "requires": { + "@graphql-codegen/add": "^3.1.1", + "@graphql-codegen/plugin-helpers": "^2.4.0", + "@graphql-codegen/visitor-plugin-common": "2.7.4", + "@graphql-tools/utils": "^8.5.2", + "parse-filepath": "^1.0.2", + "tslib": "~2.3.0" + } + }, "@graphql-codegen/plugin-helpers": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.4.2.tgz", "integrity": "sha512-LJNvwAPv/sKtI3RnRDm+nPD+JeOfOuSOS4FFIpQCMUCyMnFcchV/CPTTv7tT12fLUpEg6XjuFfDBvOwndti30Q==", - "dev": true, "requires": { "@graphql-tools/utils": "^8.5.2", "change-case-all": "1.0.14", @@ -40570,6 +40546,18 @@ "tslib": "~2.3.0" } }, + "@graphql-codegen/typed-document-node": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-2.2.8.tgz", + "integrity": "sha512-72qTGNOMVnT51Fenk1MvavOwdyJewCZlrEp0miiTjtOSiTPzAm1acOck7cx8smNWyxNaDh3g4Jf60MkS8VCySw==", + "requires": { + "@graphql-codegen/plugin-helpers": "^2.4.0", + "@graphql-codegen/visitor-plugin-common": "2.7.4", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.14", + "tslib": "~2.3.0" + } + }, "@graphql-codegen/typescript": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-2.4.8.tgz", @@ -40600,7 +40588,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.7.4.tgz", "integrity": "sha512-aaDoEudDD+B7DK/UwDSL2Fzej75N9hNJ3N8FQuTIeDyw6FNGWUxmkjVBLQGlzfnYfK8IYkdfYkrPn3Skq0pVxA==", - "dev": true, "requires": { "@graphql-codegen/plugin-helpers": "^2.4.0", "@graphql-tools/optimize": "^1.0.1", @@ -40775,7 +40762,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.2.0.tgz", "integrity": "sha512-l0PTqgHeorQdeOizUor6RB49eOAng9+abSxiC5/aHRo6hMmXVaqv5eqndlmxCpx9BkgNb3URQbK+ZZHVktkP/g==", - "dev": true, "requires": { "tslib": "~2.3.0" } @@ -40812,7 +40798,6 @@ "version": "6.4.6", "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.4.6.tgz", "integrity": "sha512-RJ2zoVUGPXbs1zdFjY56YWGsJaG9RyTOk5wlFe369ts+iXnzpM0ezszLfOjggtXUPlVTbjWNmdHASOh3rZ8uBA==", - "dev": true, "requires": { "@graphql-tools/utils": "8.6.6", "relay-compiler": "12.0.0", @@ -40822,20 +40807,17 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -40845,14 +40827,12 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "relay-compiler": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-12.0.0.tgz", "integrity": "sha512-SWqeSQZ+AMU/Cr7iZsHi1e78Z7oh00I5SvR092iCJq79aupqJ6Ds+I1Pz/Vzo5uY5PY0jvC4rBJXzlIN5g9boQ==", - "dev": true, "requires": { "@babel/core": "^7.14.0", "@babel/generator": "^7.14.0", @@ -40877,7 +40857,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -40888,7 +40867,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -40897,7 +40875,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -40907,14 +40884,12 @@ "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -40933,7 +40908,6 @@ "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -41770,6 +41744,15 @@ "@types/node": "*" } }, + "@urql/core": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.4.4.tgz", + "integrity": "sha512-TD+OS7jG1Ts6QkpU0TZ85i/vu40r71GF0QQFDhnWFtgkHcNwnpkIwWBMa72AR3j2imBTPpk61e/xb39uM/t37A==", + "requires": { + "@graphql-typed-document-node/core": "^3.1.1", + "wonka": "^4.0.14" + } + }, "@vercel/node-bridge": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@vercel%2fnode-bridge/-/node-bridge-2.1.1.tgz", @@ -41956,8 +41939,7 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asynckit": { "version": "0.4.0", @@ -41972,8 +41954,7 @@ "auto-bind": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", - "dev": true + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" }, "autoprefixer": { "version": "10.4.4", @@ -42052,7 +42033,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -42084,8 +42064,7 @@ "babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.2", @@ -42111,7 +42090,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", @@ -42311,7 +42289,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -42346,7 +42323,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, "requires": { "node-int64": "^0.4.0" } @@ -42409,7 +42385,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -42424,7 +42399,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -42466,7 +42440,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -42491,7 +42464,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, "requires": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -42511,7 +42483,6 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", - "dev": true, "requires": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", @@ -42773,8 +42744,7 @@ "common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" }, "complex.js": { "version": "2.0.11", @@ -42784,8 +42754,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "consola": { "version": "2.15.3", @@ -42803,7 +42772,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -43120,8 +43088,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decimal.js": { "version": "10.2.0", @@ -43190,7 +43157,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -43226,8 +43192,7 @@ "dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" }, "dequal": { "version": "2.0.2", @@ -43358,7 +43323,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -43401,8 +43365,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encoding": { "version": "0.1.12", @@ -43592,7 +43555,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, "requires": { "bser": "2.1.1" } @@ -43601,7 +43563,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "dev": true, "requires": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -43615,8 +43576,7 @@ "fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "dev": true + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, "fetch": { "version": "1.1.0", @@ -43681,7 +43641,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -43768,8 +43727,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -43832,14 +43790,12 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -43873,7 +43829,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -44057,7 +44012,6 @@ "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dev": true, "requires": { "tslib": "^2.1.0" } @@ -44109,8 +44063,7 @@ "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-unicode": { "version": "2.0.1", @@ -44127,7 +44080,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, "requires": { "capital-case": "^1.0.4", "tslib": "^2.0.3" @@ -44139,6 +44091,13 @@ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "html-encoding-sniffer": { @@ -44249,8 +44208,7 @@ "immutable": { "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=", - "dev": true + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" }, "import-fresh": { "version": "3.3.0", @@ -44264,8 +44222,7 @@ "import-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==" }, "indent-string": { "version": "3.2.0", @@ -44277,7 +44234,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -44286,8 +44242,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -44412,7 +44367,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, "requires": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" @@ -44507,7 +44461,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -44546,7 +44499,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, "requires": { "is-unc-path": "^1.0.0" } @@ -44560,7 +44512,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, "requires": { "unc-path-regex": "^0.1.2" } @@ -44575,7 +44526,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -44592,8 +44542,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { "version": "2.2.0", @@ -45201,7 +45150,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -45406,7 +45354,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -45415,7 +45362,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -45441,8 +45387,7 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "markdown-table": { "version": "3.0.2", @@ -46008,7 +45953,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -65905,11 +65849,18 @@ "integrity": "sha512-9L1l3f59122IBNjVDqZEE2y5kA/a8rk3xYqWWfHH9LLxtWw6hqiL43RQGT7xYjHofGdn+RX3WTVRGIv0Iq/wKA==", "requires": {} }, + "next-urql": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/next-urql/-/next-urql-3.3.2.tgz", + "integrity": "sha512-oXQHCFU0R3pIwXWtDqZDYOjKcD7SlNP7aove9YuukgKuItdtIR9CRUgo3qMOD5dSQ3wBBGfQ8zR6XtzqV5WiGg==", + "requires": { + "react-ssr-prepass": "^1.4.0" + } + }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -65951,8 +65902,7 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-releases": { "version": "2.0.2", @@ -66017,8 +65967,7 @@ "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "number-is-nan": { "version": "1.0.1", @@ -66044,14 +65993,12 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "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==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -66200,7 +66147,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" }, @@ -66209,7 +66155,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -66233,8 +66178,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-json": { "version": "6.5.0", @@ -66401,7 +66345,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -66419,7 +66362,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, "requires": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -66454,7 +66396,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -66464,7 +66405,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -66473,14 +66413,12 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -66496,7 +66434,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, "requires": { "path-root-regex": "^0.1.0" } @@ -66504,8 +66441,7 @@ "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" }, "path-type": { "version": "4.0.0", @@ -66979,7 +66915,6 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, "requires": { "asap": "~2.0.3" } @@ -66992,6 +66927,13 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "property-information": { @@ -67133,9 +67075,9 @@ "requires": {} }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.0.0.tgz", + "integrity": "sha512-yUcBYdBBbo3QiPsgYDcfQcIkGZHfxOaoE6HLSnr1sPzMhdyxusbfKOSUbSd/ocGi32dxcj366PsTj+5oggeKKw==" }, "react-markdown": { "version": "8.0.1", @@ -67188,6 +67130,12 @@ "react-transition-group": "^4.3.0" } }, + "react-ssr-prepass": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", + "integrity": "sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==", + "requires": {} + }, "react-transition-group": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", @@ -67278,7 +67226,6 @@ "version": "12.0.0", "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "fbjs": "^3.0.0", @@ -67344,14 +67291,12 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "reschema": { "version": "2.2.0", @@ -67513,7 +67458,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -67523,14 +67467,12 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "sharp": { "version": "0.30.3", @@ -67570,8 +67512,7 @@ "signedsource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=", - "dev": true + "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=" }, "simple-concat": { "version": "1.0.1", @@ -67640,7 +67581,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -67693,7 +67633,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -67889,7 +67828,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -68044,7 +67982,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -68202,8 +68139,7 @@ "ua-parser-js": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" }, "ufo": { "version": "0.7.11", @@ -68214,8 +68150,7 @@ "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" }, "undici": { "version": "4.15.1", @@ -68359,7 +68294,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -68368,7 +68302,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -68382,6 +68315,15 @@ "prepend-http": "^2.0.0" } }, + "urql": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/urql/-/urql-2.2.0.tgz", + "integrity": "sha512-36wnWqDrpXqhwT5r2/qRSZXhb7Y4sXA0nLlYEd3uLgvfIdOA8kUaPdfTujzfrvfCcfiVVFxhzqVAhc8r17NMwQ==", + "requires": { + "@urql/core": "^2.4.3", + "wonka": "^4.0.14" + } + }, "use-subscription": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", @@ -68541,8 +68483,7 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.5", @@ -68553,6 +68494,11 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "wonka": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", + "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 04cdfc7..c16180c 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "multiselect-react-dropdown": "^2.0.17", "next": "12", "next-plausible": "^3.1.6", + "next-urql": "^3.3.2", "nprogress": "^0.2.0", "open": "^7.3.1", "papaparse": "^5.3.0", @@ -76,6 +77,7 @@ "react-dropdown": "^1.9.2", "react-hook-form": "^7.27.0", "react-icons": "^4.2.0", + "react-is": "^18.0.0", "react-markdown": "^8.0.0", "react-safe": "^1.3.0", "react-select": "^5.2.2", @@ -85,11 +87,14 @@ "tailwindcss": "^3.0.22", "textversionjs": "^1.1.3", "ts-node": "^10.7.0", - "tunnel": "^0.0.6" + "tunnel": "^0.0.6", + "urql": "^2.2.0" }, "devDependencies": { "@graphql-codegen/cli": "^2.6.2", + "@graphql-codegen/near-operation-file-preset": "^2.2.9", "@graphql-codegen/schema-ast": "^2.4.1", + "@graphql-codegen/typed-document-node": "^2.2.8", "@graphql-codegen/typescript": "^2.4.8", "@graphql-codegen/typescript-operations": "^2.3.5", "@netlify/plugin-nextjs": "^4.2.4", diff --git a/schema.graphql b/schema.graphql index 5025128..d6b6445 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1,11 +1,71 @@ -type Query { - frontpage: [Question!]! -} - -""" -Forecast question. -""" -type Question { - id: String! +type Dashboard { + creator: String! + description: String! + id: ID! + questions: [Question!]! title: String! } + +"""Date serialized as the Unix timestamp.""" +scalar Date + +type PageInfo { + endCursor: String + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String +} + +"""Platform supported by metaforecast""" +type Platform { + id: ID! + label: String! +} + +type ProbabilityOption { + name: String + probability: Float +} + +"""Various indicators of the question's quality""" +type QualityIndicators { + numForecasts: Int + stars: Int! +} + +type Query { + dashboard(id: ID!): Dashboard! + frontpage: [Question!]! + questions(after: String, before: String, first: Int, last: Int): QueryQuestionsConnection! + searchQuestions(input: SearchInput!): [Question!]! +} + +type QueryQuestionsConnection { + edges: [QueryQuestionsConnectionEdge]! + pageInfo: PageInfo! +} + +type QueryQuestionsConnectionEdge { + cursor: String! + node: Question! +} + +type Question { + description: String! + id: ID! + options: [ProbabilityOption!]! + platform: Platform! + qualityIndicators: QualityIndicators! + timestamp: Date! + title: String! + url: String! + visualization: String +} + +input SearchInput { + forecastingPlatforms: [String!] + forecastsThreshold: Int + limit: Int + query: String! + starsThreshold: Int +} \ No newline at end of file diff --git a/src/backend/database/prisma.ts b/src/backend/database/prisma.ts index c3cc0f5..ecaa186 100644 --- a/src/backend/database/prisma.ts +++ b/src/backend/database/prisma.ts @@ -1,3 +1,15 @@ import { PrismaClient } from "@prisma/client"; -export const prisma = new PrismaClient({}); +declare global { + // allow global `var` declarations + // eslint-disable-next-line no-var + var prisma: PrismaClient | undefined; +} + +export const prisma = + global.prisma || + new PrismaClient({ + log: ["query"], + }); + +if (process.env.NODE_ENV !== "production") global.prisma = prisma; diff --git a/src/backend/platforms/index.ts b/src/backend/platforms/index.ts index 8906c97..bbf87bd 100644 --- a/src/backend/platforms/index.ts +++ b/src/backend/platforms/index.ts @@ -16,6 +16,20 @@ import { smarkets } from "./smarkets"; import { wildeford } from "./wildeford"; import { xrisk } from "./xrisk"; +export interface QualityIndicators { + stars: number; + numforecasts?: number | string; + numforecasters?: number; + liquidity?: number | string; + volume?: number; + volume7Days?: number; + volume24Hours?: number; + address?: number; + tradevolume?: string; + pool?: any; + createdTime?: any; +} + export interface Question { id: string; // "fantasyscotus-580" @@ -53,7 +67,7 @@ export interface Question { stars?: number; // 2 - qualityindicators: any; + qualityindicators: QualityIndicators; /* { "numforecasts": 120, diff --git a/src/backend/utils/algolia.ts b/src/backend/utils/algolia.ts index e6296e0..5728fec 100644 --- a/src/backend/utils/algolia.ts +++ b/src/backend/utils/algolia.ts @@ -1,6 +1,8 @@ import algoliasearch from "algoliasearch"; -import { pgRead } from "../database/pg-wrapper"; +import { Question } from "@prisma/client"; + +import { prisma } from "../database/prisma"; import { platforms } from "../platforms"; let cookie = process.env.ALGOLIA_MASTER_API_KEY; @@ -8,10 +10,14 @@ const algoliaAppId = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID; const client = algoliasearch(algoliaAppId, cookie); const index = client.initIndex("metaforecast"); -let getoptionsstringforsearch = (record: any) => { +export type AlgoliaQuestion = Omit & { + timestamp: string; +}; + +const getoptionsstringforsearch = (record: Question): string => { let result = ""; - if (!!record.options && record.options.length > 0) { - result = record.options + if (!!record.options && (record.options as any[]).length > 0) { + result = (record.options as any[]) .map((option: any) => option.name || null) .filter((x: any) => x != null) .join(", "); @@ -19,23 +25,23 @@ let getoptionsstringforsearch = (record: any) => { return result; }; -export async function rebuildAlgoliaDatabaseTheEasyWay() { - let records: any[] = await pgRead({ - tableName: "questions", - }); +export async function rebuildAlgoliaDatabase() { + const questions = await prisma.question.findMany(); const platformNameToLabel = Object.fromEntries( platforms.map((platform) => [platform.name, platform.label]) ); - records = records.map((record, index: number) => ({ - ...record, - platformLabel: platformNameToLabel[record.platform] || record.platform, - has_numforecasts: record.numforecasts ? true : false, - objectID: index, - optionsstringforsearch: getoptionsstringforsearch(record), - })); - // this is necessary to filter by missing attributes https://www.algolia.com/doc/guides/managing-results/refine-results/filtering/how-to/filter-by-null-or-missing-attributes/ + const records: AlgoliaQuestion[] = questions.map( + (question, index: number) => ({ + ...question, + timestamp: `${question.timestamp}`, + platformLabel: + platformNameToLabel[question.platform] || question.platform, + objectID: index, + optionsstringforsearch: getoptionsstringforsearch(question), + }) + ); if (index.exists()) { console.log("Index exists"); @@ -45,5 +51,3 @@ export async function rebuildAlgoliaDatabaseTheEasyWay() { ); } } - -export const rebuildAlgoliaDatabase = rebuildAlgoliaDatabaseTheEasyWay; diff --git a/src/graphql/build-schema.js b/src/graphql/build-schema.js index 47ff961..ad26559 100644 --- a/src/graphql/build-schema.js +++ b/src/graphql/build-schema.js @@ -2,4 +2,4 @@ // but we use ts-node instead of @boost/module require("ts-node").register({}); -module.exports = require("./schema.ts"); +module.exports = require("./schema/index.ts"); diff --git a/src/graphql/builder.ts b/src/graphql/builder.ts new file mode 100644 index 0000000..1c42aa1 --- /dev/null +++ b/src/graphql/builder.ts @@ -0,0 +1,39 @@ +import SchemaBuilder from "@pothos/core"; +import PrismaPlugin from "@pothos/plugin-prisma"; +import RelayPlugin from "@pothos/plugin-relay"; + +import { prisma } from "../backend/database/prisma"; + +import type PrismaTypes from "@pothos/plugin-prisma/generated"; +export const builder = new SchemaBuilder<{ + PrismaTypes: PrismaTypes; + Scalars: { + Date: { + Input: Date; + Output: Date; + }; + }; +}>({ + plugins: [PrismaPlugin, RelayPlugin], + prisma: { + client: prisma, + }, + relayOptions: { + clientMutationId: "omit", + cursorType: "String", + // these are required for some reason, though it's not documented and probably a bug + brandLoadedObjects: undefined, + encodeGlobalID: undefined, + decodeGlobalID: undefined, + }, +}); + +builder.scalarType("Date", { + description: "Date serialized as the Unix timestamp.", + serialize: (d) => d.getTime() / 1000, + parseValue: (d) => { + return new Date(d as string); // not sure if this is correct, need to check + }, +}); + +builder.queryType({}); diff --git a/src/graphql/schema.ts b/src/graphql/schema.ts deleted file mode 100644 index ad99436..0000000 --- a/src/graphql/schema.ts +++ /dev/null @@ -1,104 +0,0 @@ -import SchemaBuilder from "@pothos/core"; -import PrismaPlugin from "@pothos/plugin-prisma"; -import RelayPlugin from "@pothos/plugin-relay"; -import { Question } from "@prisma/client"; - -import { prisma } from "../backend/database/prisma"; -import { getFrontpage } from "../backend/frontpage"; - -import type PrismaTypes from "@pothos/plugin-prisma/generated"; -const builder = new SchemaBuilder<{ - PrismaTypes: PrismaTypes; - Scalars: { - Date: { - Input: Date; - Output: Date; - }; - }; -}>({ - plugins: [PrismaPlugin, RelayPlugin], - prisma: { - client: prisma, - }, - relayOptions: { - clientMutationId: "omit", - cursorType: "String", - // these are required for some reason, though it's not documented and probably a bug - brandLoadedObjects: undefined, - encodeGlobalID: undefined, - decodeGlobalID: undefined, - }, -}); - -builder.scalarType("Date", { - description: "Date serialized as the Unix timestamp.", - serialize: (d) => d.getTime() / 1000, - parseValue: (d) => { - return new Date(d as string); // not sure if this is correct, need to check - }, -}); - -const QuestionObj = builder.prismaObject("Question", { - findUnique: (question) => ({ id: question.id }), - fields: (t) => ({ - id: t.exposeID("id"), - title: t.exposeString("title"), - timestamp: t.field({ - type: "Date", - resolve: (parent) => parent.timestamp, - }), - }), -}); - -builder.queryType({ - fields: (t) => ({ - firstQuestion: t.prismaField({ - type: "Question", - resolve: async (query, root, args, ctx, info) => - prisma.question.findUnique({ - ...query, - rejectOnNotFound: true, - where: { id: "foretold-e1ca8cc6-33a4-4e38-9ef3-553a050ba0a9" }, - }), - }), - }), -}); - -builder.queryField("frontpage", (t) => - t.field({ - type: [QuestionObj], - resolve: async () => { - const legacyQuestions = await getFrontpage(); - const ids = legacyQuestions.map((q) => q.id); - const questions = await prisma.question.findMany({ - where: { - id: { - in: ids, - }, - }, - }); - const id2q: { [k: string]: Question } = {}; - for (const q of questions) { - id2q[q.id] = q; - } - - return ids.map((id) => id2q[id] || null).filter((q) => q !== null); - }, - }) -); - -builder.queryField("questions", (t) => - t.prismaConnection( - { - type: "Question", - cursor: "id", - maxSize: 1000, - resolve: (query, parent, args, context, info) => - prisma.question.findMany({ ...query }), - }, - {}, - {} - ) -); - -export const schema = builder.toSchema({}); diff --git a/src/graphql/schema/dashboards.ts b/src/graphql/schema/dashboards.ts new file mode 100644 index 0000000..4afc779 --- /dev/null +++ b/src/graphql/schema/dashboards.ts @@ -0,0 +1,42 @@ +import { Dashboard } from "@prisma/client"; + +import { prisma } from "../../backend/database/prisma"; +import { builder } from "../builder"; +import { QuestionObj } from "./questions"; + +const DashboardObj = builder.objectRef("Dashboard").implement({ + fields: (t) => ({ + id: t.exposeID("id"), + title: t.exposeString("title"), + description: t.exposeString("description"), + creator: t.exposeString("creator"), + questions: t.field({ + type: [QuestionObj], + resolve: async (parent) => { + return await prisma.question.findMany({ + where: { + id: { + in: parent.contents as string[], + }, + }, + }); + }, + }), + }), +}); + +builder.queryField("dashboard", (t) => + t.field({ + type: DashboardObj, + args: { + id: t.arg({ type: "ID", required: true }), + }, + resolve: async (parent, args) => { + return await prisma.dashboard.findUnique({ + where: { + id: String(args.id), + }, + }); + }, + }) +); diff --git a/src/graphql/schema/frontpage.ts b/src/graphql/schema/frontpage.ts new file mode 100644 index 0000000..1b64648 --- /dev/null +++ b/src/graphql/schema/frontpage.ts @@ -0,0 +1,29 @@ +import { Question } from "@prisma/client"; + +import { prisma } from "../../backend/database/prisma"; +import { getFrontpage } from "../../backend/frontpage"; +import { builder } from "../builder"; +import { QuestionObj } from "./questions"; + +builder.queryField("frontpage", (t) => + t.field({ + type: [QuestionObj], + resolve: async () => { + const legacyQuestions = await getFrontpage(); + const ids = legacyQuestions.map((q) => q.id); + const questions = await prisma.question.findMany({ + where: { + id: { + in: ids, + }, + }, + }); + const id2q: { [k: string]: Question } = {}; + for (const q of questions) { + id2q[q.id] = q; + } + + return ids.map((id) => id2q[id] || null).filter((q) => q !== null); + }, + }) +); diff --git a/src/graphql/schema/index.ts b/src/graphql/schema/index.ts new file mode 100644 index 0000000..6c8f20a --- /dev/null +++ b/src/graphql/schema/index.ts @@ -0,0 +1,8 @@ +import "./dashboards"; +import "./frontpage"; +import "./questions"; +import "./search"; + +import { builder } from "../builder"; + +export const schema = builder.toSchema({}); diff --git a/src/graphql/schema/questions.ts b/src/graphql/schema/questions.ts new file mode 100644 index 0000000..15690ed --- /dev/null +++ b/src/graphql/schema/questions.ts @@ -0,0 +1,102 @@ +import { prisma } from "../../backend/database/prisma"; +import { platforms, QualityIndicators } from "../../backend/platforms"; +import { builder } from "../builder"; + +const PlatformObj = builder.objectRef("Platform").implement({ + description: "Platform supported by metaforecast", + fields: (t) => ({ + label: t.string({ + resolve: (platformName) => { + if (platformName === "metaforecast") { + return "Metaforecast"; + } + if (platformName === "guesstimate") { + return "Guesstimate"; + } + // kinda slow and repetitive, TODO - store a map {name => platform} somewhere and `getPlatform` util function? + const platform = platforms.find((p) => p.name === platformName); + if (!platform) { + throw new Error(`Unknown platform ${platformName}`); + } + return platform.label; + }, + }), + id: t.id({ + resolve: (x) => x, + }), + }), +}); + +export const QualityIndicatorsObj = builder + .objectRef("QualityIndicators") + .implement({ + description: "Various indicators of the question's quality", + fields: (t) => ({ + stars: t.exposeInt("stars"), + numForecasts: t.int({ + nullable: true, + resolve: (parent) => + parent.numforecasts === undefined + ? undefined + : Number(parent.numforecasts), + }), + }), + }); + +export const ProbabilityOptionObj = builder + .objectRef<{ name: string; probability: number }>("ProbabilityOption") + .implement({ + fields: (t) => ({ + name: t.exposeString("name", { nullable: true }), + probability: t.exposeFloat("probability", { nullable: true }), // number, 0 to 1 + }), + }); + +export const QuestionObj = builder.prismaObject("Question", { + findUnique: (question) => ({ id: question.id }), + fields: (t) => ({ + id: t.exposeID("id"), + title: t.exposeString("title"), + description: t.exposeString("description"), + url: t.exposeString("url"), + timestamp: t.field({ + type: "Date", + resolve: (parent) => parent.timestamp, + }), + platform: t.field({ + type: PlatformObj, + resolve: (parent) => parent.platform, + }), + qualityIndicators: t.field({ + type: QualityIndicatorsObj, + resolve: (parent) => parent.qualityindicators as any as QualityIndicators, + }), + options: t.field({ + type: [ProbabilityOptionObj], + resolve: ({ options }) => { + if (!Array.isArray(options)) { + return []; + } + return options as any[]; + }, + }), + visualization: t.string({ + resolve: (parent) => (parent.extra as any)?.visualization, + nullable: true, + }), + }), +}); + +builder.queryField("questions", (t) => + t.prismaConnection( + { + type: "Question", + cursor: "id", + maxSize: 1000, + resolve: (query, parent, args, context, info) => + prisma.question.findMany({ ...query }), + }, + {}, + {} + ) +); diff --git a/src/graphql/schema/search.ts b/src/graphql/schema/search.ts new file mode 100644 index 0000000..393bc1b --- /dev/null +++ b/src/graphql/schema/search.ts @@ -0,0 +1,62 @@ +import { AlgoliaQuestion } from "../../backend/utils/algolia"; +import searchGuesstimate from "../../web/worker/searchGuesstimate"; +import searchWithAlgolia from "../../web/worker/searchWithAlgolia"; +import { builder } from "../builder"; +import { QuestionObj } from "./questions"; + +const SearchInput = builder.inputType("SearchInput", { + fields: (t) => ({ + query: t.string({ required: true }), + starsThreshold: t.int(), + forecastsThreshold: t.int(), + forecastingPlatforms: t.stringList(), + limit: t.int(), + }), +}); + +builder.queryField("searchQuestions", (t) => + t.field({ + type: [QuestionObj], + args: { + input: t.arg({ type: SearchInput, required: true }), + }, + resolve: async (parent, { input }) => { + // defs + const query = input.query === undefined ? "" : input.query; + if (query == "") return []; + const forecastsThreshold = input.forecastsThreshold; + const starsThreshold = input.starsThreshold; + const platformsIncludeGuesstimate = + input.forecastingPlatforms.includes("guesstimate") && + starsThreshold <= 1; + + // preparation + const unawaitedAlgoliaResponse = searchWithAlgolia({ + queryString: query, + hitsPerPage: input.limit + 50, + starsThreshold, + filterByPlatforms: input.forecastingPlatforms, + forecastsThreshold, + }); + + let results: AlgoliaQuestion[] = []; + + // consider the guesstimate and the non-guesstimate cases separately. + if (platformsIncludeGuesstimate) { + const [responsesNotGuesstimate, responsesGuesstimate] = + await Promise.all([ + unawaitedAlgoliaResponse, + searchGuesstimate(query), + ]); // faster than two separate requests + results = [...responsesNotGuesstimate, ...responsesGuesstimate]; + } else { + results = await unawaitedAlgoliaResponse; + } + + return results.map((q) => ({ + ...q, + timestamp: new Date(q.timestamp), + })); + }, + }) +); diff --git a/src/graphql/types.generated.ts b/src/graphql/types.generated.ts new file mode 100644 index 0000000..ba99a6d --- /dev/null +++ b/src/graphql/types.generated.ts @@ -0,0 +1,111 @@ +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; + /** Date serialized as the Unix timestamp. */ + Date: any; +}; + +export type Dashboard = { + __typename?: 'Dashboard'; + creator: Scalars['String']; + description: Scalars['String']; + id: Scalars['ID']; + questions: Array; + title: Scalars['String']; +}; + +export type PageInfo = { + __typename?: 'PageInfo'; + endCursor?: Maybe; + hasNextPage: Scalars['Boolean']; + hasPreviousPage: Scalars['Boolean']; + startCursor?: Maybe; +}; + +/** Platform supported by metaforecast */ +export type Platform = { + __typename?: 'Platform'; + id: Scalars['ID']; + label: Scalars['String']; +}; + +export type ProbabilityOption = { + __typename?: 'ProbabilityOption'; + name?: Maybe; + probability?: Maybe; +}; + +/** Various indicators of the question's quality */ +export type QualityIndicators = { + __typename?: 'QualityIndicators'; + numForecasts?: Maybe; + stars: Scalars['Int']; +}; + +export type Query = { + __typename?: 'Query'; + dashboard: Dashboard; + frontpage: Array; + questions: QueryQuestionsConnection; + searchQuestions: Array; +}; + + +export type QueryDashboardArgs = { + id: Scalars['ID']; +}; + + +export type QueryQuestionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type QuerySearchQuestionsArgs = { + input: SearchInput; +}; + +export type QueryQuestionsConnection = { + __typename?: 'QueryQuestionsConnection'; + edges: Array>; + pageInfo: PageInfo; +}; + +export type QueryQuestionsConnectionEdge = { + __typename?: 'QueryQuestionsConnectionEdge'; + cursor: Scalars['String']; + node: Question; +}; + +export type Question = { + __typename?: 'Question'; + description: Scalars['String']; + id: Scalars['ID']; + options: Array; + platform: Platform; + qualityIndicators: QualityIndicators; + timestamp: Scalars['Date']; + title: Scalars['String']; + url: Scalars['String']; + visualization?: Maybe; +}; + +export type SearchInput = { + forecastingPlatforms?: InputMaybe>; + forecastsThreshold?: InputMaybe; + limit?: InputMaybe; + query: Scalars['String']; + starsThreshold?: InputMaybe; +}; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 7afae05..0a1ae74 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,13 +1,15 @@ import "nprogress/nprogress.css"; import "../styles/main.css"; +import PlausibleProvider from "next-plausible"; +import { withUrqlClient } from "next-urql"; +import { AppProps } from "next/app"; import Router from "next/router"; import NProgress from "nprogress"; -import PlausibleProvider from "next-plausible"; +import { graphqlEndpoint } from "../web/urql"; Router.events.on("routeChangeStart", (as, { shallow }) => { - console.log(shallow); if (!shallow) { NProgress.start(); } @@ -15,7 +17,7 @@ Router.events.on("routeChangeStart", (as, { shallow }) => { Router.events.on("routeChangeComplete", () => NProgress.done()); Router.events.on("routeChangeError", () => NProgress.done()); -function MyApp({ Component, pageProps }) { +function MyApp({ Component, pageProps }: AppProps) { return ( @@ -23,4 +25,9 @@ function MyApp({ Component, pageProps }) { ); } -export default MyApp; +export default withUrqlClient( + () => ({ + url: graphqlEndpoint, + }), + { ssr: false } +)(MyApp); diff --git a/src/pages/dashboards/embed/[id].tsx b/src/pages/dashboards/embed/[id].tsx index e43ea61..be031e5 100644 --- a/src/pages/dashboards/embed/[id].tsx +++ b/src/pages/dashboards/embed/[id].tsx @@ -1,49 +1,43 @@ import { GetServerSideProps, NextPage } from "next"; import Error from "next/error"; -import { DashboardItem } from "../../../backend/dashboards"; +import { + DashboardByIdDocument, DashboardFragment +} from "../../../web/dashboards/queries.generated"; import { DisplayQuestions } from "../../../web/display/DisplayQuestions"; -import { FrontendQuestion } from "../../../web/platforms"; -import { reqToBasePath } from "../../../web/utils"; -import { getDashboardQuestionsByDashboardId } from "../../../web/worker/getDashboardQuestions"; +import { ssrUrql } from "../../../web/urql"; interface Props { - dashboardQuestions: FrontendQuestion[]; - dashboardItem: DashboardItem; + dashboard?: DashboardFragment; numCols?: number; } export const getServerSideProps: GetServerSideProps = async ( context ) => { + const [ssrCache, client] = ssrUrql(); const dashboardId = context.query.id as string; const numCols = Number(context.query.numCols); - const { dashboardItem, dashboardQuestions } = - await getDashboardQuestionsByDashboardId({ - dashboardId, - basePath: reqToBasePath(context.req), // required on server side to find the API endpoint - }); + const dashboard = ( + await client.query(DashboardByIdDocument, { id: dashboardId }).toPromise() + ).data?.result; - if (!dashboardItem) { + if (!dashboard) { context.res.statusCode = 404; } return { props: { - dashboardQuestions, - dashboardItem, + urqlState: ssrCache.extractData(), + dashboard, numCols: !numCols ? null : numCols < 5 ? numCols : 4, }, }; }; -const EmbedDashboardPage: NextPage = ({ - dashboardQuestions, - dashboardItem, - numCols, -}) => { - if (!dashboardItem) { +const EmbedDashboardPage: NextPage = ({ dashboard, numCols }) => { + if (!dashboard) { return ; } @@ -58,8 +52,8 @@ const EmbedDashboardPage: NextPage = ({ } gap-4 mb-6`} > diff --git a/src/pages/dashboards/view/[id].tsx b/src/pages/dashboards/view/[id].tsx index 57a64dd..e3f83af 100644 --- a/src/pages/dashboards/view/[id].tsx +++ b/src/pages/dashboards/view/[id].tsx @@ -2,57 +2,55 @@ import { GetServerSideProps, NextPage } from "next"; import Error from "next/error"; import Link from "next/link"; -import { DashboardItem } from "../../../backend/dashboards"; +import { + DashboardByIdDocument, DashboardFragment +} from "../../../web/dashboards/queries.generated"; import { DisplayQuestions } from "../../../web/display/DisplayQuestions"; import { InfoBox } from "../../../web/display/InfoBox"; import { Layout } from "../../../web/display/Layout"; import { LineHeader } from "../../../web/display/LineHeader"; -import { FrontendQuestion } from "../../../web/platforms"; -import { reqToBasePath } from "../../../web/utils"; -import { getDashboardQuestionsByDashboardId } from "../../../web/worker/getDashboardQuestions"; +import { ssrUrql } from "../../../web/urql"; interface Props { - dashboardQuestions: FrontendQuestion[]; - dashboardItem: DashboardItem; + dashboard?: DashboardFragment; } export const getServerSideProps: GetServerSideProps = async ( context ) => { + const [ssrCache, client] = ssrUrql(); const dashboardId = context.query.id as string; - const { dashboardQuestions, dashboardItem } = - await getDashboardQuestionsByDashboardId({ - dashboardId, - basePath: reqToBasePath(context.req), // required on server side to find the API endpoint - }); + const dashboard = ( + await client.query(DashboardByIdDocument, { id: dashboardId }).toPromise() + ).data?.result; - if (!dashboardItem) { + if (!dashboard) { context.res.statusCode = 404; } return { props: { - dashboardQuestions, - dashboardItem, + urqlState: ssrCache.extractData(), + dashboard, }, }; }; -const DashboardMetadata: React.FC<{ dashboardItem: DashboardItem }> = ({ - dashboardItem, +const DashboardMetadata: React.FC<{ dashboard: DashboardFragment }> = ({ + dashboard, }) => (
- {dashboardItem?.title ? ( + {dashboard.title ? (

- {dashboardItem.title} + {dashboard.title}

) : null} - {dashboardItem && dashboardItem.creator ? ( + {dashboard.creator ? (

Created by:{" "} - {dashboardItem.creator === "Clay Graubard" ? ( + {dashboard.creator === "Clay Graubard" ? ( <> @ = ({ ) : ( - dashboardItem.creator + dashboard.creator )}

) : null} - {dashboardItem?.description ? ( + {dashboard.description ? (

- {dashboardItem.description} + {dashboard.description}

) : null}
); /* Body */ -const ViewDashboardPage: NextPage = ({ - dashboardQuestions, - dashboardItem, -}) => { +const ViewDashboardPage: NextPage = ({ dashboard }) => { return (
- {dashboardItem ? ( - + {dashboard ? ( + <> + +
+ +
+ ) : ( )} -
- -
-
Dashboards cannot be changed after they are created. diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 45b4637..d3c85a1 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -10,7 +10,7 @@ export { getServerSideProps } from "../web/search/anySearchPage"; const IndexPage: NextPage = (props) => { return ( - + = async ( context ) => { - let urlQuery = context.query; // this is an object, not a string which I have to parse!! + const [ssrCache, client] = ssrUrql(); + let urlQuery = context.query; let initialQueryParameters = { query: "", @@ -25,14 +26,24 @@ export const getServerSideProps: GetServerSideProps = async ( ...urlQuery, }; - let results: FrontendQuestion[] = []; - if (initialQueryParameters.query != "") { - results = await searchAccordingToQueryData(initialQueryParameters, 1); + let results: QuestionFragment[] = []; + if (initialQueryParameters.query !== "") { + results = ( + await client + .query(SearchDocument, { + input: { + ...initialQueryParameters, + limit: 1, + }, + }) + .toPromise() + ).data.result; } return { props: { - results: results, + urqlState: ssrCache.extractData(), + results, }, }; }; diff --git a/src/web/dashboards/queries.generated.tsx b/src/web/dashboards/queries.generated.tsx new file mode 100644 index 0000000..6ab8352 --- /dev/null +++ b/src/web/dashboards/queries.generated.tsx @@ -0,0 +1,15 @@ +import * as Types from '../../graphql/types.generated'; + +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +import { QuestionFragmentDoc } from '../search/queries.generated'; +export type DashboardFragment = { __typename?: 'Dashboard', id: string, title: string, description: string, creator: string, questions: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> }; + +export type DashboardByIdQueryVariables = Types.Exact<{ + id: Types.Scalars['ID']; +}>; + + +export type DashboardByIdQuery = { __typename?: 'Query', result: { __typename?: 'Dashboard', id: string, title: string, description: string, creator: string, questions: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> } }; + +export const DashboardFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"Dashboard"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Dashboard"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"creator"}},{"kind":"Field","name":{"kind":"Name","value":"questions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Question"}}]}}]}},...QuestionFragmentDoc.definitions]} as unknown as DocumentNode; +export const DashboardByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DashboardById"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"result"},"name":{"kind":"Name","value":"dashboard"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Dashboard"}}]}}]}},...DashboardFragmentDoc.definitions]} as unknown as DocumentNode; \ No newline at end of file diff --git a/src/web/dashboards/queries.graphql b/src/web/dashboards/queries.graphql new file mode 100644 index 0000000..fe9cbfa --- /dev/null +++ b/src/web/dashboards/queries.graphql @@ -0,0 +1,15 @@ +fragment Dashboard on Dashboard { + id + title + description + creator + questions { + ...Question + } +} + +query DashboardById($id: ID!) { + result: dashboard(id: $id) { + ...Dashboard + } +} diff --git a/src/web/display/DisplayOneQuestionForCapture.tsx b/src/web/display/DisplayOneQuestionForCapture.tsx index 8505ba5..4b199a5 100644 --- a/src/web/display/DisplayOneQuestionForCapture.tsx +++ b/src/web/display/DisplayOneQuestionForCapture.tsx @@ -2,11 +2,11 @@ import domtoimage from "dom-to-image"; // https://github.com/tsayen/dom-to-image import { useEffect, useRef, useState } from "react"; import { CopyToClipboard } from "react-copy-to-clipboard"; -import { FrontendQuestion } from "../platforms"; +import { QuestionFragment } from "../search/queries.generated"; import { uploadToImgur } from "../worker/uploadToImgur"; import { DisplayQuestion } from "./DisplayQuestion"; -function displayOneQuestionInner(result: FrontendQuestion, containerRef) { +function displayOneQuestionInner(result: QuestionFragment, containerRef) { return (
{result ? ( @@ -168,7 +168,7 @@ let generateMetaculusSource = (result, hasDisplayBeenCaptured) => { }; interface Props { - result: FrontendQuestion; + result: QuestionFragment; } export const DisplayOneQuestionForCapture: React.FC = ({ result }) => { diff --git a/src/web/display/DisplayQuestion/index.tsx b/src/web/display/DisplayQuestion/index.tsx index 1854a9e..99bfc64 100644 --- a/src/web/display/DisplayQuestion/index.tsx +++ b/src/web/display/DisplayQuestion/index.tsx @@ -1,7 +1,7 @@ import { FaRegClipboard } from "react-icons/fa"; import ReactMarkdown from "react-markdown"; -import { FrontendQuestion } from "../../platforms"; +import { QuestionFragment } from "../../search/queries.generated"; import { Card } from "../Card"; import { QuestionFooter } from "./QuestionFooter"; @@ -268,7 +268,7 @@ const LastUpdated: React.FC<{ timestamp: string }> = ({ timestamp }) => ( // Main component interface Props { - question: FrontendQuestion; + question: QuestionFragment; showTimeStamp: boolean; expandFooterToFullWidth: boolean; showIdToggle?: boolean; @@ -280,10 +280,9 @@ export const DisplayQuestion: React.FC = ({ title, url, platform, - platformLabel, description, options, - qualityindicators, + qualityIndicators, timestamp, visualization, }, @@ -292,7 +291,7 @@ export const DisplayQuestion: React.FC = ({ showIdToggle, }) => { const displayTimestampAtBottom = - checkIfDisplayTimeStampAtBottom(qualityindicators); + checkIfDisplayTimeStampAtBottom(qualityIndicators); const yesNoOptions = options.length === 2 && @@ -349,13 +348,13 @@ export const DisplayQuestion: React.FC = ({
)} - {platform !== "guesstimate" && options.length < 3 && ( + {platform.id !== "guesstimate" && options.length < 3 && (
)} - {platform === "guesstimate" && ( + {platform.id === "guesstimate" && ( = ({
{ + const isFirst = React.useRef(true); + + if (isFirst.current) { + isFirst.current = false; + + return true; + } + + return isFirst.current; +}; diff --git a/src/web/platforms.ts b/src/web/platforms.ts deleted file mode 100644 index aa35a59..0000000 --- a/src/web/platforms.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PlatformConfig, Question } from "../backend/platforms"; - -export type FrontendQuestion = Question & { - platformLabel: string; - visualization?: any; -}; - -// ok on client side -export const addLabelsToQuestions = ( - questions: Question[], - platformsConfig: PlatformConfig[] -): FrontendQuestion[] => { - const platformNameToLabel = Object.fromEntries( - platformsConfig.map((platform) => [platform.name, platform.label]) - ); - - return questions.map((result) => ({ - ...result, - platformLabel: platformNameToLabel[result.platform] || result.platform, - })); -}; diff --git a/src/web/search/CommonDisplay.tsx b/src/web/search/CommonDisplay.tsx index 8c70378..1a7cbb8 100644 --- a/src/web/search/CommonDisplay.tsx +++ b/src/web/search/CommonDisplay.tsx @@ -1,14 +1,14 @@ import { useRouter } from "next/router"; -import React, { Fragment, useState } from "react"; +import React, { Fragment, useMemo, useState } from "react"; +import { useQuery } from "urql"; import { ButtonsForStars } from "../display/ButtonsForStars"; import { MultiSelectPlatform } from "../display/MultiSelectPlatform"; import { QueryForm } from "../display/QueryForm"; import { SliderElement } from "../display/SliderElement"; -import { useNoInitialEffect } from "../hooks"; -import { FrontendQuestion } from "../platforms"; -import searchAccordingToQueryData from "../worker/searchAccordingToQueryData"; +import { useIsFirstRender, useNoInitialEffect } from "../hooks"; import { Props as AnySearchPageProps, QueryParameters } from "./anySearchPage"; +import { QuestionFragment, SearchDocument } from "./queries.generated"; interface Props extends AnySearchPageProps { hasSearchbar: boolean; @@ -17,7 +17,7 @@ interface Props extends AnySearchPageProps { placeholder: string; displaySeeMoreHint: boolean; displayQuestionsWrapper: (opts: { - results: FrontendQuestion[]; + results: QuestionFragment[]; numDisplay: number; whichResultToDisplayAndCapture: number; showIdToggle: boolean; @@ -27,7 +27,6 @@ interface Props extends AnySearchPageProps { /* Body */ const CommonDisplay: React.FC = ({ defaultResults, - initialResults, initialQueryParameters, defaultQueryParameters, initialNumDisplay, @@ -40,8 +39,9 @@ const CommonDisplay: React.FC = ({ displaySeeMoreHint, displayQuestionsWrapper, }) => { - const router = useRouter(); /* States */ + const router = useRouter(); + const isFirstRender = useIsFirstRender(); const [queryParameters, setQueryParameters] = useState( initialQueryParameters @@ -52,52 +52,56 @@ const CommonDisplay: React.FC = ({ // used to distinguish numDisplay updates which force search and don't force search, see effects below const [forceSearch, setForceSearch] = useState(0); - const [results, setResults] = useState(initialResults); const [advancedOptions, showAdvancedOptions] = useState(false); const [whichResultToDisplayAndCapture, setWhichResultToDisplayAndCapture] = useState(0); const [showIdToggle, setShowIdToggle] = useState(false); - /* Functions which I want to have access to the Home namespace */ - // I don't want to create an "defaultResults" object for each search. - async function executeSearchOrAnswerWithDefaultResults() { - const queryData = { - ...queryParameters, - numDisplay, - }; + const [typing, setTyping] = useState(false); - const filterManually = ( - queryData: QueryParameters, - results: FrontendQuestion[] - ) => { - if ( - queryData.forecastingPlatforms && - queryData.forecastingPlatforms.length > 0 - ) { - results = results.filter((result) => - queryData.forecastingPlatforms.includes(result.platform) - ); - } - if (queryData.starsThreshold === 4) { - results = results.filter( - (result) => result.qualityindicators.stars >= 4 - ); - } - if (queryData.forecastsThreshold) { - // results = results.filter(result => (result.qualityindicators && result.qualityindicators.numforecasts > forecastsThreshold)) - } - return results; - }; + // must match the query from anySearchPage.ts getServerSideProps + const [queryResults, reexecuteQuery] = useQuery({ + query: SearchDocument, + variables: { + input: { + ...queryParameters, + limit: numDisplay, + }, + }, + pause: !isFirstRender, + }); - const queryIsEmpty = - !queryData || queryData.query == "" || queryData.query == undefined; + const queryIsEmpty = + queryParameters.query === undefined || queryParameters.query === ""; - const results = queryIsEmpty - ? filterManually(queryData, defaultResults) - : await searchAccordingToQueryData(queryData, numDisplay); + const results: QuestionFragment[] = useMemo(() => { + if (typing || queryResults.fetching) return []; // TODO - return results but show spinner or darken out all cards? - setResults(results); - } + if (queryIsEmpty) { + const filterManually = (results: QuestionFragment[]) => { + if ( + queryParameters.forecastingPlatforms && + queryParameters.forecastingPlatforms.length > 0 + ) { + results = results.filter((result) => + queryParameters.forecastingPlatforms.includes(result.platform.id) + ); + } + if (queryParameters.starsThreshold === 4) { + results = results.filter( + (result) => result.qualityIndicators.stars >= 4 + ); + } + if (queryParameters.forecastsThreshold) { + // TODO / FIXME / remove? + } + return results; + }; + return filterManually(defaultResults); + } else { + return queryResults.data?.result; + } + }, [queryResults.data, queryParameters]); // I don't want the component which display questions (DisplayQuestions) to change with a change in queryParameters. But I want it to have access to the queryParameters, and in particular access to queryParameters.numDisplay. Hence why this function lives inside Home. const getInfoToDisplayQuestionsFunction = () => { @@ -145,10 +149,13 @@ const CommonDisplay: React.FC = ({ useNoInitialEffect(updateRoute, [numDisplay]); useNoInitialEffect(() => { - setResults([]); - const newTimeoutId = setTimeout(() => { + setTyping(true); + const newTimeoutId = setTimeout(async () => { updateRoute(); - executeSearchOrAnswerWithDefaultResults(); + if (!queryIsEmpty) { + reexecuteQuery(); + } + setTyping(false); }, 500); // avoid sending results if user has not stopped typing. @@ -310,7 +317,7 @@ const CommonDisplay: React.FC = ({
{getInfoToDisplayQuestionsFunction()}
{displaySeeMoreHint && - (!results || (results.length != 0 && numDisplay < results.length)) ? ( + (!results || (results.length !== 0 && numDisplay < results.length)) ? (

{"Can't find what you were looking for?"} @@ -336,7 +343,7 @@ const CommonDisplay: React.FC = ({

) : null} -

+
); }; diff --git a/src/web/search/anySearchPage.tsx b/src/web/search/anySearchPage.tsx index aa3110a..03f61cd 100644 --- a/src/web/search/anySearchPage.tsx +++ b/src/web/search/anySearchPage.tsx @@ -1,9 +1,8 @@ import { GetServerSideProps } from "next"; -import { getFrontpage } from "../../backend/frontpage"; import { getPlatformsConfig, PlatformConfig, platforms } from "../../backend/platforms"; -import { addLabelsToQuestions, FrontendQuestion } from "../platforms"; -import searchAccordingToQueryData from "../worker/searchAccordingToQueryData"; +import { ssrUrql } from "../urql"; +import { FrontpageDocument, QuestionFragment, SearchDocument } from "./queries.generated"; /* Common code for / and /capture */ @@ -15,8 +14,7 @@ export interface QueryParameters { } export interface Props { - defaultResults: FrontendQuestion[]; - initialResults: FrontendQuestion[]; + defaultResults: QuestionFragment[]; initialQueryParameters: QueryParameters; defaultQueryParameters: QueryParameters; initialNumDisplay: number; @@ -27,6 +25,7 @@ export interface Props { export const getServerSideProps: GetServerSideProps = async ( context ) => { + const [ssrCache, client] = ssrUrql(); const urlQuery = context.query; const platformsConfig = getPlatformsConfig({ withGuesstimate: true }); @@ -61,28 +60,32 @@ export const getServerSideProps: GetServerSideProps = async ( const defaultNumDisplay = 21; const initialNumDisplay = Number(urlQuery.numDisplay) || defaultNumDisplay; - const defaultResults = addLabelsToQuestions( - await getFrontpage(), - platformsConfig - ); + const defaultResults = (await client.query(FrontpageDocument).toPromise()) + .data.result; - const initialResults = + if ( !!initialQueryParameters && initialQueryParameters.query != "" && initialQueryParameters.query != undefined - ? await searchAccordingToQueryData( - initialQueryParameters, - initialNumDisplay - ) - : defaultResults; + ) { + // must match the query from CommonDisplay + await client + .query(SearchDocument, { + input: { + ...initialQueryParameters, + limit: initialNumDisplay, + }, + }) + .toPromise(); + } return { props: { + urqlState: ssrCache.extractData(), initialQueryParameters, defaultQueryParameters, initialNumDisplay, defaultNumDisplay, - initialResults, defaultResults, platformsConfig, }, diff --git a/src/web/search/queries.generated.tsx b/src/web/search/queries.generated.tsx new file mode 100644 index 0000000..f6ed52f --- /dev/null +++ b/src/web/search/queries.generated.tsx @@ -0,0 +1,20 @@ +import * as Types from '../../graphql/types.generated'; + +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type QuestionFragment = { __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }; + +export type FrontpageQueryVariables = Types.Exact<{ [key: string]: never; }>; + + +export type FrontpageQuery = { __typename?: 'Query', result: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> }; + +export type SearchQueryVariables = Types.Exact<{ + input: Types.SearchInput; +}>; + + +export type SearchQuery = { __typename?: 'Query', result: Array<{ __typename?: 'Question', id: string, url: string, title: string, description: string, timestamp: any, visualization?: string | null, options: Array<{ __typename?: 'ProbabilityOption', name?: string | null, probability?: number | null }>, platform: { __typename?: 'Platform', id: string, label: string }, qualityIndicators: { __typename?: 'QualityIndicators', stars: number, numForecasts?: number | null } }> }; + +export const QuestionFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"Question"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"probability"}}]}},{"kind":"Field","name":{"kind":"Name","value":"platform"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"qualityIndicators"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stars"}},{"kind":"Field","name":{"kind":"Name","value":"numForecasts"}}]}},{"kind":"Field","name":{"kind":"Name","value":"visualization"}}]}}]} as unknown as DocumentNode; +export const FrontpageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Frontpage"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"result"},"name":{"kind":"Name","value":"frontpage"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Question"}}]}}]}},...QuestionFragmentDoc.definitions]} as unknown as DocumentNode; +export const SearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Search"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","alias":{"kind":"Name","value":"result"},"name":{"kind":"Name","value":"searchQuestions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Question"}}]}}]}},...QuestionFragmentDoc.definitions]} as unknown as DocumentNode; \ No newline at end of file diff --git a/src/web/search/queries.graphql b/src/web/search/queries.graphql new file mode 100644 index 0000000..2b2e7fe --- /dev/null +++ b/src/web/search/queries.graphql @@ -0,0 +1,32 @@ +fragment Question on Question { + id + url + title + description + timestamp + options { + name + probability + } + platform { + id + label + } + qualityIndicators { + stars + numForecasts + } + visualization +} + +query Frontpage { + result: frontpage { + ...Question + } +} + +query Search($input: SearchInput!) { + result: searchQuestions(input: $input) { + ...Question + } +} diff --git a/src/web/urql.ts b/src/web/urql.ts new file mode 100644 index 0000000..ab71d46 --- /dev/null +++ b/src/web/urql.ts @@ -0,0 +1,19 @@ +import { initUrqlClient } from "next-urql"; +import { cacheExchange, dedupExchange, fetchExchange, ssrExchange } from "urql"; + +import { getBasePath } from "./utils"; + +export const graphqlEndpoint = `${getBasePath()}/api/graphql`; + +// for getServerSideProps/getStaticProps only +export const ssrUrql = () => { + const ssrCache = ssrExchange({ isClient: false }); + const client = initUrqlClient( + { + url: graphqlEndpoint, + exchanges: [dedupExchange, cacheExchange, ssrCache, fetchExchange], + }, + false + ); + return [ssrCache, client] as const; +}; diff --git a/src/web/utils.ts b/src/web/utils.ts index ddee0c1..a588542 100644 --- a/src/web/utils.ts +++ b/src/web/utils.ts @@ -1,11 +1,12 @@ -import { IncomingMessage } from "http"; - -export const reqToBasePath = (req: IncomingMessage) => { +export const getBasePath = () => { if (process.env.NEXT_PUBLIC_VERCEL_URL) { - console.log(process.env.NEXT_PUBLIC_VERCEL_URL); return `https://${process.env.NEXT_PUBLIC_VERCEL_URL}`; } - // we could just hardcode http://localhost:3000 here, but then `next dev -p ` would break - return "http://" + req.headers.host; + // can be used for local development if you prefer non-default port + if (process.env.NEXT_PUBLIC_SITE_URL) { + return process.env.NEXT_PUBLIC_SITE_URL; + } + + return "http://localhost:3000"; }; diff --git a/src/web/worker/getDashboardQuestions.ts b/src/web/worker/getDashboardQuestions.ts index 73a7985..49ed1b6 100644 --- a/src/web/worker/getDashboardQuestions.ts +++ b/src/web/worker/getDashboardQuestions.ts @@ -1,53 +1,5 @@ import axios from "axios"; -import { DashboardItem } from "../../backend/dashboards"; -import { getPlatformsConfig, Question } from "../../backend/platforms"; -import { addLabelsToQuestions, FrontendQuestion } from "../platforms"; - -export async function getDashboardQuestionsByDashboardId({ - dashboardId, - basePath, -}: { - dashboardId: string; - basePath?: string; -}): Promise<{ - dashboardQuestions: FrontendQuestion[]; - dashboardItem: DashboardItem; -}> { - console.log("getDashboardQuestionsByDashboardId: "); - if (typeof window === undefined && !basePath) { - throw new Error("`basePath` option is required on server side"); - } - - let dashboardQuestions: Question[] = []; - let dashboardItem: DashboardItem | null = null; - try { - let { data } = await axios({ - url: `${basePath || ""}/api/dashboard-by-id`, - method: "post", - data: { - id: dashboardId, - }, - }); - console.log(data); - - dashboardQuestions = data.dashboardContents; - dashboardItem = data.dashboardItem as DashboardItem; - } catch (error) { - console.log(error); - } finally { - const labeledDashboardQuestions = addLabelsToQuestions( - dashboardQuestions, - getPlatformsConfig({ withGuesstimate: false }) - ); - - return { - dashboardQuestions: labeledDashboardQuestions, - dashboardItem, - }; - } -} - export async function createDashboard(payload) { let data = { dashboardId: null }; try { diff --git a/src/web/worker/searchAccordingToQueryData.ts b/src/web/worker/searchAccordingToQueryData.ts deleted file mode 100644 index 2f41182..0000000 --- a/src/web/worker/searchAccordingToQueryData.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { FrontendQuestion } from "../platforms"; -import { QueryParameters } from "../search/anySearchPage"; -import searchGuesstimate from "./searchGuesstimate"; -import searchWithAlgolia from "./searchWithAlgolia"; - -export default async function searchAccordingToQueryData( - queryData: QueryParameters, - limit: number -): Promise { - let results: FrontendQuestion[] = []; - - try { - // defs - let query = queryData.query == undefined ? "" : queryData.query; - if (query == "") return []; - let forecastsThreshold = queryData.forecastsThreshold; - let starsThreshold = queryData.starsThreshold; - let platformsIncludeGuesstimate = - queryData.forecastingPlatforms.includes("guesstimate") && - starsThreshold <= 1; - - // preparation - let unawaitedAlgoliaResponse = searchWithAlgolia({ - queryString: query, - hitsPerPage: limit + 50, - starsThreshold, - filterByPlatforms: queryData.forecastingPlatforms, - forecastsThreshold, - }); - - // consider the guesstimate and the non-guesstimate cases separately. - if (platformsIncludeGuesstimate) { - let responses = await Promise.all([ - unawaitedAlgoliaResponse, - searchGuesstimate(query), - ]); // faster than two separate requests - let responsesNotGuesstimate = responses[0]; - let responsesGuesstimate = responses[1]; - results = [...responsesNotGuesstimate, ...responsesGuesstimate]; - //results.sort((x,y)=> x.ranking < y.ranking ? -1: 1) - } else { - results = await unawaitedAlgoliaResponse; - } - - return results; - } catch (error) { - console.log(error); - } finally { - console.log(results); - return results; - } -} diff --git a/src/web/worker/searchGuesstimate.ts b/src/web/worker/searchGuesstimate.ts index d36c4d1..51a6eb1 100644 --- a/src/web/worker/searchGuesstimate.ts +++ b/src/web/worker/searchGuesstimate.ts @@ -1,18 +1,18 @@ /* Imports */ import axios from "axios"; -import { FrontendQuestion } from "../platforms"; +import { AlgoliaQuestion } from "../../backend/utils/algolia"; /* Definitions */ -let urlEndPoint = +const urlEndPoint = "https://m629r9ugsg-dsn.algolia.net/1/indexes/Space_production/query?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%203.32.1&x-algolia-application-id=M629R9UGSG&x-algolia-api-key=4e893740a2bd467a96c8bfcf95b2809c"; /* Body */ export default async function searchGuesstimate( query -): Promise { - let response = await axios({ +): Promise { + const response = await axios({ url: urlEndPoint, // credentials: "omit", headers: { @@ -21,8 +21,6 @@ export default async function searchGuesstimate( "Accept-Language": "en-US,en;q=0.5", "content-type": "application/x-www-form-urlencoded", }, - // referrer: - // "https://m629r9ugsg-dsn.algolia.net/1/indexes/Space_production/query?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%203.32.1&x-algolia-application-id=M629R9UGSG&x-algolia-api-key=4e893740a2bd467a96c8bfcf95b2809c", data: `{\"params\":\"query=${query.replace( / /g, "%20" @@ -31,25 +29,26 @@ export default async function searchGuesstimate( }); const models: any[] = response.data.hits; - const mappedModels: FrontendQuestion[] = models.map((model, index) => { - let description = model.description + const mappedModels: AlgoliaQuestion[] = models.map((model, index) => { + const description = model.description ? model.description.replace(/\n/g, " ").replace(/ /g, " ") : ""; - let stars = description.length > 250 ? 2 : 1; + const stars = description.length > 250 ? 2 : 1; return { id: `guesstimate-${model.id}`, title: model.name, url: `https://www.getguesstimate.com/models/${model.id}`, timestamp: model.created_at, // TODO - check that format matches platform: "guesstimate", - platformLabel: "Guesstimate", - description: description, + description, options: [], qualityindicators: { stars: stars, numforecasts: 1, numforecasters: 1, }, + stars, + extra: {}, visualization: model.big_screenshot, ranking: 10 * (index + 1) - 0.5, //(model._rankingInfo - 1*index)// hack }; @@ -57,7 +56,7 @@ export default async function searchGuesstimate( // filter for duplicates. Surprisingly common. let uniqueTitles = []; - let uniqueModels: FrontendQuestion[] = []; + let uniqueModels: AlgoliaQuestion[] = []; for (let model of mappedModels) { if (!uniqueTitles.includes(model.title) && !model.title.includes("copy")) { uniqueModels.push(model); diff --git a/src/web/worker/searchWithAlgolia.ts b/src/web/worker/searchWithAlgolia.ts index 48654c2..ce89420 100644 --- a/src/web/worker/searchWithAlgolia.ts +++ b/src/web/worker/searchWithAlgolia.ts @@ -1,6 +1,6 @@ import algoliasearch from "algoliasearch"; -import { FrontendQuestion } from "../platforms"; +import { AlgoliaQuestion } from "../../backend/utils/algolia"; const client = algoliasearch( process.env.NEXT_PUBLIC_ALGOLIA_APP_ID, @@ -13,22 +13,21 @@ let buildFilter = ({ filterByPlatforms, forecastsThreshold, }) => { - let starsFilter = starsThreshold + const starsFilter = starsThreshold ? `qualityindicators.stars >= ${starsThreshold}` : null; - let platformsFilter = filterByPlatforms + const platformsFilter = filterByPlatforms ? filterByPlatforms.map((platform) => `platform:"${platform}"`).join(" OR ") : null; - console.log(platformsFilter); - // let numForecastsFilter = forecastsThreshold ? `has_numforecasts:true AND qualityindicators.numforecasts >= ${forecastsThreshold}` : null - let numForecastsFilter = + const numForecastsFilter = forecastsThreshold > 0 ? `qualityindicators.numforecasts >= ${forecastsThreshold}` : null; - let finalFilter = [starsFilter, platformsFilter, numForecastsFilter] + const finalFilter = [starsFilter, platformsFilter, numForecastsFilter] .filter((f) => f != null) .map((f) => `( ${f} )`) .join(" AND "); + console.log( "searchWithAlgolia.js/searchWithAlgolia/buildFilter", finalFilter @@ -51,18 +50,6 @@ let buildFacetFilter = ({ filterByPlatforms }) => { return platformsFilter; }; -let normalizeArray = (array) => { - if (array.length == 0) { - return []; - } - let mean = array.reduce((a, b) => a + b) / array.length; - let sd = Math.sqrt( - array.map((x) => Math.pow(x - mean, 2)).reduce((a, b) => a + b) - ); - let normalizedArray = array.map((result) => (result - sd) / mean); - return normalizedArray; -}; - let noExactMatch = (queryString, result) => { queryString = queryString.toLowerCase(); let title = result.title.toLowerCase(); @@ -75,6 +62,14 @@ let noExactMatch = (queryString, result) => { ); }; +interface SearchOpts { + queryString: string; + hitsPerPage?: number; + starsThreshold: number; + filterByPlatforms: string[]; + forecastsThreshold: number; +} + // only query string export default async function searchWithAlgolia({ queryString, @@ -82,8 +77,8 @@ export default async function searchWithAlgolia({ starsThreshold, filterByPlatforms, forecastsThreshold, -}): Promise { - let response = await index.search(queryString, { +}: SearchOpts): Promise { + const response = await index.search(queryString, { hitsPerPage, filters: buildFilter({ starsThreshold, @@ -93,7 +88,7 @@ export default async function searchWithAlgolia({ //facetFilters: buildFacetFilter({filterByPlatforms}), getRankingInfo: true, }); - let results: FrontendQuestion[] = response.hits; + let results = response.hits; let recursionError = ["metaforecast", "metaforecasts", "metaforecasting"]; if ( @@ -103,10 +98,10 @@ export default async function searchWithAlgolia({ results = [ { id: "not-found", + objectID: "not-found", title: "No search results match your query", url: "https://metaforecast.org", platform: "metaforecast", - platformLabel: "Metaforecast", description: "Maybe try a broader query?", options: [ { @@ -121,24 +116,23 @@ export default async function searchWithAlgolia({ }, ], timestamp: `${new Date().toISOString().slice(0, 10)}`, + stars: 5, // legacy qualityindicators: { numforecasts: 1, numforecasters: 1, stars: 5, }, - // noExactSearchResults: true, - // optionsstringforsearch: "Yes, No", - // has_numforecasts: true, + extra: {}, }, ]; } else if (recursionError.includes(queryString.toLowerCase())) { results = [ { id: "recursion-error", + objectID: "recursion-error", title: `Did you mean: ${queryString}?`, url: "https://metaforecast.org/recursion?bypassEasterEgg=true", platform: "metaforecast", - platformLabel: "Metaforecast", description: "Fatal error: Too much recursion. Click to proceed anyways", options: [ @@ -154,14 +148,13 @@ export default async function searchWithAlgolia({ }, ], timestamp: `${new Date().toISOString().slice(0, 10)}`, + stars: 5, // legacy qualityindicators: { numforecasts: 1, numforecasters: 1, stars: 5, }, - // noExactSearchResults: true, - // optionsstringforsearch: "Yes, No", - // has_numforecasts: true, + extra: {}, }, ...results, ]; @@ -172,10 +165,10 @@ export default async function searchWithAlgolia({ ) { results.unshift({ id: "not-found-2", + objectID: "not-found-2", title: "No search results appear to match your query", url: "https://metaforecast.org", platform: "metaforecast", - platformLabel: "Metaforecast", description: "Maybe try a broader query? That said, we could be wrong.", options: [ { @@ -190,17 +183,14 @@ export default async function searchWithAlgolia({ }, ], timestamp: `${new Date().toISOString().slice(0, 10)}`, + stars: 1, // legacy qualityindicators: { numforecasts: 1, numforecasters: 1, stars: 1, }, - // noExactSearchResults: true, - // optionsstringforsearch: "Yes, No", - // has_numforecasts: true, + extra: {}, }); - } else { - // results[0].noExactSearchResults = false; } return results;