diff --git a/frontend/.storybook/preview.tsx b/frontend/.storybook/preview.tsx index 7d8e40c6..9c743a74 100644 --- a/frontend/.storybook/preview.tsx +++ b/frontend/.storybook/preview.tsx @@ -1,6 +1,5 @@ import { ArgTypes, Decorator, Parameters } from "@storybook/react"; import { useLayoutEffect } from "react"; -import { createMemoryRouter, RouterProvider } from "react-router-dom"; import "../src/index.css"; export const parameters: Parameters = { @@ -60,15 +59,4 @@ const withThemeProvider: Decorator = (Story, context) => { ); }; -const withRouter: Decorator = (Story, _context) => { - const router = createMemoryRouter([ - { - path: "/*", - element: , - }, - ]); - - return ; -}; - -export const decorators: Decorator[] = [withThemeProvider, withRouter]; +export const decorators: Decorator[] = [withThemeProvider]; diff --git a/frontend/codegen.ts b/frontend/codegen.ts new file mode 100644 index 00000000..481639ab --- /dev/null +++ b/frontend/codegen.ts @@ -0,0 +1,16 @@ +import { CodegenConfig } from "@graphql-codegen/cli"; + +const config: CodegenConfig = { + schema: "./schema.graphql", + documents: ["src/**/*.tsx", "!src/gql/**/*"], + ignoreNoDocuments: true, // for better experience with the watcher + generates: { + "./src/gql/": { + preset: "client", + plugins: [], + }, + }, + hooks: { afterAllFileWrite: ["eslint --fix"] }, +}; + +export default config; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 90055a27..fdbdeca4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,14 +8,18 @@ "name": "mas-frontend", "version": "0.0.0", "dependencies": { + "@urql/core": "^3.2.2", "date-fns": "^2.29.3", + "graphql": "^16.6.0", + "jotai": "^2.0.3", + "jotai-location": "^0.5.1", + "jotai-urql": "^0.5.0", "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-relay": "^15.0.0", - "react-router-dom": "^6.9.0", - "relay-runtime": "^15.0.0" + "react-dom": "^18.2.0" }, "devDependencies": { + "@graphql-codegen/cli": "^3.2.2", + "@graphql-codegen/client-preset": "^2.1.1", "@graphql-eslint/eslint-plugin": "^3.16.1", "@storybook/addon-actions": "^7.0.0-rc.3", "@storybook/addon-backgrounds": "^7.0.0-rc.3", @@ -31,11 +35,8 @@ "@types/node": "^18.15.3", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", - "@types/react-relay": "^14.1.3", "@types/react-test-renderer": "^18.0.0", - "@types/relay-runtime": "^14.1.9", - "@types/relay-test-utils": "^14.1.0", - "@vitejs/plugin-react": "^3.1.0", + "@vitejs/plugin-react-swc": "^3.2.0", "@vitest/coverage-c8": "^0.29.3", "autoprefixer": "^10.4.14", "eslint": "^8.36.0", @@ -45,14 +46,12 @@ "postcss": "^8.4.21", "prettier": "^2.8.4", "react-test-renderer": "^18.2.0", - "relay-compiler": "^15.0.0", - "relay-test-utils": "^15.0.0", "storybook": "^7.0.0-rc.3", "tailwindcss": "^3.2.7", "typescript": "^5.0.2", "vite": "^4.2.0", "vite-plugin-eslint": "^1.8.1", - "vite-plugin-relay-lite": "^0.4.3", + "vite-plugin-graphql-codegen": "^3.1.0", "vitest": "^0.29.3" } }, @@ -69,6 +68,195 @@ "node": ">=6.0.0" } }, + "node_modules/@ardatan/relay-compiler": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", + "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.14.0", + "@babel/generator": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/runtime": "^7.0.0", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.4.0", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "fbjs": "^3.0.0", + "glob": "^7.1.1", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "relay-runtime": "12.0.0", + "signedsource": "^1.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "relay-compiler": "bin/relay-compiler" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/cliui": { + "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", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/find-up": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/relay-runtime": { + "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", + "invariant": "^2.2.4" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/wrap-ansi": { + "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", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/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 + }, + "node_modules/@ardatan/relay-compiler/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", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/yargs-parser": { + "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" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@ardatan/sync-fetch": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz", @@ -2146,6 +2334,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -2701,6 +2890,267 @@ "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", "dev": true }, + "node_modules/@graphql-codegen/add": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-4.0.1.tgz", + "integrity": "sha512-A7k+9eRfrKyyNfhWEN/0eKz09R5cp4XXxUuNLQAVm/aohmVI2xdMV4lM02rTlM6Pyou3cU/v0iZnhgo6IRpqeg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "tslib": "~2.5.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": "3.2.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.2.2.tgz", + "integrity": "sha512-u+dm/SW1heLnUL4Tyf5Uv0AxOFhTCmUPHKwRLq2yE8MPhv7+Ti4vxxUP/XGoaMNRuHlN37wLI7tpFLV1Hhm22Q==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/core": "^3.1.0", + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-tools/apollo-engine-loader": "^7.3.6", + "@graphql-tools/code-file-loader": "^7.3.17", + "@graphql-tools/git-loader": "^7.2.13", + "@graphql-tools/github-loader": "^7.3.20", + "@graphql-tools/graphql-file-loader": "^7.5.0", + "@graphql-tools/json-file-loader": "^7.4.1", + "@graphql-tools/load": "^7.8.0", + "@graphql-tools/prisma-loader": "^7.2.49", + "@graphql-tools/url-loader": "^7.13.2", + "@graphql-tools/utils": "^9.0.0", + "@parcel/watcher": "^2.1.0", + "@whatwg-node/fetch": "^0.8.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^4.5.0", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^1.10.0", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "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/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-2.1.1.tgz", + "integrity": "sha512-yDFiO2CimwjkH/YE5nwRcLkXoAVz31NC+WWvFQdyrR1UKQqe2tqV/bKLUifnSbBGS238ajHJ6AEzVlzIvI8OYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^4.0.1", + "@graphql-codegen/gql-tag-operations": "2.0.2", + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-codegen/typed-document-node": "^3.0.2", + "@graphql-codegen/typescript": "^3.0.2", + "@graphql-codegen/typescript-operations": "^3.0.2", + "@graphql-codegen/visitor-plugin-common": "^3.0.2", + "@graphql-tools/documents": "^0.1.0", + "@graphql-tools/utils": "^9.0.0", + "@graphql-typed-document-node/core": "3.1.2", + "tslib": "~2.5.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/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-3.1.0.tgz", + "integrity": "sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-tools/schema": "^9.0.0", + "@graphql-tools/utils": "^9.1.1", + "tslib": "~2.5.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/gql-tag-operations": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-2.0.2.tgz", + "integrity": "sha512-FB4/Q0xP/lIjwnlxdeGAfGFAiL7AhzIJB9keNrosd4Xe9r8V8NuZ0+0/hGc7KdzHhojYF/ycmJD7V2JLWaf23Q==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-codegen/visitor-plugin-common": "3.0.2", + "@graphql-tools/utils": "^9.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.5.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": "4.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.1.0.tgz", + "integrity": "sha512-xvSHJb9OGb5CODIls0AI1rCenLz+FuiaNPCsfHMCNsLDjOZK2u0jAQ9zUBdc/Wb+21YXZujBCc0Vm1QX+Zz0nw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.5.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/schema-ast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-3.0.1.tgz", + "integrity": "sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-tools/utils": "^9.0.0", + "tslib": "~2.5.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/typed-document-node": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-3.0.2.tgz", + "integrity": "sha512-RqX46y0GoMAcCfXjkUabOWpeSQ7tazpS5WyzWJNakpzXxNACx8NACaghU8zTEM+gjqtIp6YbFY/S92HQ34HbRQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-codegen/visitor-plugin-common": "3.0.2", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.5.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": "3.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-3.0.2.tgz", + "integrity": "sha512-qD6QkTB+2eJmIaZ6Tihv6HRz7daWWLz9uw5vwCmPeZN6XL2RINZGLkR7D8BQzLDlNGMrpQ4SeSM9o3ZALSCIuQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-codegen/schema-ast": "^3.0.1", + "@graphql-codegen/visitor-plugin-common": "3.0.2", + "auto-bind": "~4.0.0", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.2.tgz", + "integrity": "sha512-FYi5QcOsBZZvBKlzBQ+jpBCUxMo9g3fTYa2v1+rqooG6SiW/lQyk2CNL5tsYAt6TLmH3rws8rzSUil0DWNsflQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-codegen/typescript": "^3.0.2", + "@graphql-codegen/visitor-plugin-common": "3.0.2", + "auto-bind": "~4.0.0", + "tslib": "~2.5.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/visitor-plugin-common": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.0.2.tgz", + "integrity": "sha512-dKblRFrB0Fdl3+nPlzlLBka+TN/EGwr/q09mwry0H58z3j6gXkMbsdPr+dc8MhgOV7w/8egRvSPIvd7m6eFCnw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-tools/optimize": "^1.3.0", + "@graphql-tools/relay-operation-optimizer": "^6.5.0", + "@graphql-tools/utils": "^9.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.5.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-eslint/eslint-plugin": { "version": "3.16.1", "resolved": "https://registry.npmjs.org/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.16.1.tgz", @@ -2723,6 +3173,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-tools/apollo-engine-loader": { + "version": "7.3.26", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.26.tgz", + "integrity": "sha512-h1vfhdJFjnCYn9b5EY1Z91JTF0KB3hHVJNQIsiUV2mpQXZdeOXQoaWeYEKaiI5R6kwBw5PP9B0fv3jfUIG8LyQ==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/utils": "^9.2.1", + "@whatwg-node/fetch": "^0.8.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/batch-execute": { "version": "8.5.18", "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.18.tgz", @@ -2772,6 +3237,19 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/documents": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-0.1.0.tgz", + "integrity": "sha512-1WQeovHv5S1M3xMzQxbSrG3yl6QOnsq2JUBnlg5/0aMM5R4GNMx6Ms+ROByez/dnuA81kstRuSK+2qpe+GaRIw==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/executor": { "version": "0.0.15", "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.15.tgz", @@ -2883,6 +3361,39 @@ } } }, + "node_modules/@graphql-tools/git-loader": { + "version": "7.2.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-7.2.20.tgz", + "integrity": "sha512-D/3uwTzlXxG50HI8BEixqirT4xiUp6AesTdfotRXAs2d4CT9wC6yuIWOHkSBqgI1cwKWZb6KXZr467YPS5ob1w==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "7.5.0", + "@graphql-tools/utils": "9.2.1", + "is-glob": "4.0.3", + "micromatch": "^4.0.4", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "7.3.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-7.3.27.tgz", + "integrity": "sha512-fFFC35qenyhjb8pfcYXKknAt0CXP5CkQYtLfJXgTXSgBjIsfAVMrqxQ/Y0ejeM19XNF/C3VWJ7rE308yOX6ywA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/graphql-tag-pluck": "^7.4.6", + "@graphql-tools/utils": "^9.2.1", + "@whatwg-node/fetch": "^0.8.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/graphql-file-loader": { "version": "7.5.16", "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.16.tgz", @@ -2973,6 +3484,79 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/optimize": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.3.1.tgz", + "integrity": "sha512-5j5CZSRGWVobt4bgRRg7zhjPiSimk+/zIuColih8E8DxuFOaJ+t0qu7eZS5KXWBkjcd4BPNuhUPpNlEmHPqVRQ==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader": { + "version": "7.2.65", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-7.2.65.tgz", + "integrity": "sha512-MuX4XrJEuOE6qYbjR9WhSInPX8iji07wA6K72hVgkvG2UBXBUAcVC/1H6iOFbs1d7rLLU2r6aWsYnD6zwzw+eA==", + "dev": true, + "dependencies": { + "@graphql-tools/url-loader": "7.17.14", + "@graphql-tools/utils": "9.2.1", + "@types/js-yaml": "^4.0.0", + "@types/json-stable-stringify": "^1.0.32", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^5.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "isomorphic-fetch": "^3.0.0", + "jose": "^4.11.4", + "js-yaml": "^4.0.0", + "json-stable-stringify": "^1.0.1", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "6.5.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.17.tgz", + "integrity": "sha512-hHPEX6ccRF3+9kfVz0A3In//Dej7QrHOLGZEokBmPDMDqn9CS7qUjpjyGzclbOX0tRBtLfuFUZ68ABSac3P1nA==", + "dev": true, + "dependencies": { + "@ardatan/relay-compiler": "12.0.0", + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-tools/schema": { "version": "9.0.17", "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.17.tgz", @@ -3438,6 +4022,26 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.1.0.tgz", + "integrity": "sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@peculiar/asn1-schema": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", @@ -3477,14 +4081,6 @@ "node": ">=10.12.0" } }, - "node_modules/@remix-run/router": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.4.0.tgz", - "integrity": "sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==", - "engines": { - "node": ">=14" - } - }, "node_modules/@repeaterjs/repeater": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", @@ -4703,6 +5299,201 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@swc/core": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.41.tgz", + "integrity": "sha512-v6P2dfqJDpZ/7RXPvWge9oI6YgolDM0jtNhQZ2qdXrLBzaWQdDoBGBTJ8KN/nTgGhX3IkNvSB1fafXQ+nVnqAQ==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.41", + "@swc/core-darwin-x64": "1.3.41", + "@swc/core-linux-arm-gnueabihf": "1.3.41", + "@swc/core-linux-arm64-gnu": "1.3.41", + "@swc/core-linux-arm64-musl": "1.3.41", + "@swc/core-linux-x64-gnu": "1.3.41", + "@swc/core-linux-x64-musl": "1.3.41", + "@swc/core-win32-arm64-msvc": "1.3.41", + "@swc/core-win32-ia32-msvc": "1.3.41", + "@swc/core-win32-x64-msvc": "1.3.41" + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.41.tgz", + "integrity": "sha512-D4fybODToO/BvuP35bionDUrSuTVVr8eW+mApr1unOqb3mfiqOrVv0VP2fpWNRYiA+xMq+oBCB6KcGpL60HKWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.41.tgz", + "integrity": "sha512-0RoVyiPCnylf3TG77C3S86PRSmaq+SaYB4VDLJFz3qcEHz1pfP0LhyskhgX4wjQV1mveDzFEn1BVAuo0eOMwZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.41.tgz", + "integrity": "sha512-mZW7GeY7Uw1nkKoWpx898ou20oCSt8MR+jAVuAhMjX+G4Zr0WWXYSigWNiRymhR6Q9KhyvoFpMckguSvYWmXsw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.41.tgz", + "integrity": "sha512-e91LGn+6KuLFw3sWk5swwGc/dP4tXs0mg3HrhjImRoofU02Bb9aHcj5zgrSO8ZByvDtm/Knn16h1ojxIMOFaxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.41.tgz", + "integrity": "sha512-Q7hmrniLWsQ7zjtImGcjx1tl5/Qxpel+fC+OXTnGvAyyoGssSftIBlXMnqVLteL78zhxIPAzi+gizWAe5RGqrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.41.tgz", + "integrity": "sha512-h4sv1sCfZQgRIwmykz8WPqVpbvHb13Qm3SsrbOudhAp2MuzpWzsgMP5hAEpdCP/nWreiCz3aoM6L8JeakRDq0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.41.tgz", + "integrity": "sha512-Z7c26i38378d0NT/dcz8qPSAXm41lqhNzykdhKhI+95mA9m4pskP18T/0I45rmyx1ywifypu+Ip+SXmKeVSPgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.41.tgz", + "integrity": "sha512-I0CYnPc+ZGc912YeN0TykIOf/Q7yJQHRwDuhewwD6RkbiSEaVfSux5pAmmdoKw2aGMSq+cwLmgPe9HYLRNz+4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.41.tgz", + "integrity": "sha512-EygN4CVDWF29/U2T5fXGfWyLvRbMd2hiUgkciAl7zHuyJ6nKl+kpodqV2A0Wd4sFtSNedU0gQEBEXEe7cqvmsA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.41.tgz", + "integrity": "sha512-Mfp8qD1hNwWWRy0ISdwQJu1g0UYoVTtuQlO0z3aGbXqL51ew9e56+8j3M1U9i95lXFyWkARgjDCcKkQi+WezyA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/babel__core": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", @@ -4890,12 +5681,24 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/json-stable-stringify": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz", + "integrity": "sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -5010,16 +5813,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-relay": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/@types/react-relay/-/react-relay-14.1.3.tgz", - "integrity": "sha512-tsu+3jN0zeOYKV485fwUy3yMEZWkDVzC2JG0tJgEH6p9tcPQkBAUoXqEZFwSBtHtNo1etfa1Eityg3fC55qDvQ==", - "dev": true, - "dependencies": { - "@types/react": "*", - "@types/relay-runtime": "*" - } - }, "node_modules/@types/react-test-renderer": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz", @@ -5029,23 +5822,6 @@ "@types/react": "*" } }, - "node_modules/@types/relay-runtime": { - "version": "14.1.9", - "resolved": "https://registry.npmjs.org/@types/relay-runtime/-/relay-runtime-14.1.9.tgz", - "integrity": "sha512-zMZnZPPawAC15zHygMk6lfHhT11xgkx2jLhXqJpgFKpV86MnQcMEs/dVTADKuUIBLBzf6Og6wK4n5PMsJ0OjVw==", - "dev": true - }, - "node_modules/@types/relay-test-utils": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@types/relay-test-utils/-/relay-test-utils-14.1.0.tgz", - "integrity": "sha512-qwt9JDaNFa3VNTYC5FKvDE38a3Blz8Pav95xvqhY2g2ECoz47G6oocVR6qySTNQ/1kp2rFvhGG4TtyThlQBh5A==", - "dev": true, - "dependencies": { - "@types/react": "*", - "@types/react-relay": "*", - "@types/relay-runtime": "*" - } - }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -5426,6 +6202,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@urql/core": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-3.2.2.tgz", + "integrity": "sha512-i046Cz8cZ4xIzGMTyHZrbdgzcFMcKD7+yhCAH5FwWBRjcKrc+RjEOuR9X5AMuBvr8c6IAaE92xAqa4wmlGfWTQ==", + "dependencies": { + "wonka": "^6.1.2" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", @@ -5445,6 +6232,18 @@ "vite": "^4.1.0-beta.0" } }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.2.0.tgz", + "integrity": "sha512-IcBoXL/mcH7JdQr/nfDlDwTdIaH8Rg7LpfQDF4nAht+juHWIuv6WhpKPCSfY4+zztAaB07qdBoFz1XCZsgo3pQ==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.35" + }, + "peerDependencies": { + "vite": "^4" + } + }, "node_modules/@vitest/coverage-c8": { "version": "0.29.3", "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.29.3.tgz", @@ -5695,6 +6494,33 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5889,7 +6715,8 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true }, "node_modules/asn1js": { "version": "3.0.5", @@ -5944,6 +6771,15 @@ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -5962,6 +6798,18 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -6104,12 +6952,56 @@ "@babel/core": "^7.0.0-0" } }, + "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 + }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", "dev": true }, + "node_modules/babel-preset-fbjs": { + "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", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/babel-preset-react-app": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", @@ -6520,6 +7412,16 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "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" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -6554,6 +7456,17 @@ } ] }, + "node_modules/capital-case": { + "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", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -6588,6 +7501,50 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "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", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "node_modules/check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -6681,6 +7638,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-table3": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", @@ -6756,6 +7737,15 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -6767,6 +7757,15 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -6844,6 +7843,15 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/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, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -6979,6 +7987,17 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, + "node_modules/constant-case": { + "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", + "upper-case": "^2.0.2" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -7060,6 +8079,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, "dependencies": { "node-fetch": "2.6.7" } @@ -7068,6 +8088,7 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7148,6 +8169,12 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -7165,6 +8192,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -7227,6 +8263,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -7313,6 +8361,15 @@ "node": ">= 0.8" } }, + "node_modules/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, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -7429,6 +8486,16 @@ "node": ">=6.0.0" } }, + "node_modules/dot-case": { + "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" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -8476,6 +9543,20 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/extract-files": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-11.0.0.tgz", @@ -8616,6 +9697,7 @@ "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", @@ -8629,7 +9711,8 @@ "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==" + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true }, "node_modules/fd-slicer": { "version": "1.1.0", @@ -8646,6 +9729,30 @@ "integrity": "sha512-LXcdgpdcVedccGg0AZqg+S8lX/FCdwXD92WNZ5k5qsb0irRhSFsBOpcJt7oevyqT2/C2nEE0zSFNdBEpj3YOSw==", "dev": true }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -9330,8 +10437,6 @@ "version": "16.6.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", - "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -9427,6 +10532,48 @@ "graphql": "*" } }, + "node_modules/graphql-request": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.2.0.tgz", + "integrity": "sha512-pLhKIvnMyBERL0dtFI3medKqWOz/RhHdcgbZ+hMMIb32mEPa5MJSzS4AuXxfI4sRAu6JVVk5tvXuGfCWl9JYWQ==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-fetch": "^3.1.5", + "extract-files": "^9.0.0", + "form-data": "^3.0.0" + }, + "peerDependencies": { + "graphql": "14 - 16" + } + }, + "node_modules/graphql-request/node_modules/extract-files": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", + "dev": true, + "engines": { + "node": "^10.17.0 || ^12.0.0 || >= 13.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/jaydenseric" + } + }, + "node_modules/graphql-tag": { + "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" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^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-ws": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.12.0.tgz", @@ -9564,6 +10711,16 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/header-case": { + "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" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -9604,6 +10761,20 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -9692,6 +10863,18 @@ "node": ">=4" } }, + "node_modules/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, + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -9726,6 +10909,32 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -9753,6 +10962,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "dependencies": { "loose-envify": "^1.0.0" } @@ -9772,6 +10982,19 @@ "node": ">= 0.10" } }, + "node_modules/is-absolute": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -9971,6 +11194,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lower-case": { + "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" + } + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -10075,6 +11316,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-relative": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-set": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", @@ -10157,6 +11410,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unc-path": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "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" + } + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -10191,6 +11477,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -10224,6 +11519,16 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, "node_modules/isomorphic-unfetch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", @@ -10403,6 +11708,48 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", + "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/jotai": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.0.3.tgz", + "integrity": "sha512-MMjhSPAL3RoeZD9WbObufRT2quThEAEknHHridf2ma8Ml7ZVQmUiHk0ssdbR3F0h3kcwhYqSGJ59OjhPge7RRg==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "react": ">=17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/jotai-location": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/jotai-location/-/jotai-location-0.5.1.tgz", + "integrity": "sha512-6b34X6PpUaXmHCcyxdMFUHgRLUEp+SFHq9UxHbg5HxHC1LddVyVZbPJI+P15+SOQJcUTH3KrsIeKmeLko+Vw/A==", + "peerDependencies": { + "jotai": ">=1.11.0" + } + }, + "node_modules/jotai-urql": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jotai-urql/-/jotai-urql-0.5.0.tgz", + "integrity": "sha512-5oQJy1QbNsAxb4YpOROx/ez/xDqP1LfL0SC138XXmWs/jxTYUztBBnzVAEBpHSdqac0oBHoMW0gwIcdioPTXOQ==", + "peerDependencies": { + "@urql/core": "*", + "jotai": ">=1.11.0" + } + }, "node_modules/js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", @@ -10526,12 +11873,37 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dev": true, + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10562,6 +11934,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -10659,6 +12040,63 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -10710,6 +12148,77 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "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", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -10730,6 +12239,24 @@ "get-func-name": "^2.0.0" } }, + "node_modules/lower-case": { + "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" + } + }, + "node_modules/lower-case-first": { + "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" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10775,6 +12302,15 @@ "tmpl": "1.0.5" } }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", @@ -11063,6 +12599,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -11102,6 +12644,22 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, "node_modules/node-dir": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", @@ -11140,6 +12698,17 @@ "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==", "dev": true }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11218,12 +12787,14 @@ "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==" + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11463,6 +13034,38 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -11523,6 +13126,16 @@ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "dev": true }, + "node_modules/param-case": { + "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" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -11535,6 +13148,20 @@ "node": ">=6" } }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -11562,6 +13189,26 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "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" + } + }, + "node_modules/path-case": { + "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" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11595,6 +13242,27 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -11945,6 +13613,7 @@ "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" } @@ -12335,51 +14004,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-relay": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/react-relay/-/react-relay-15.0.0.tgz", - "integrity": "sha512-KWdeMMKMJanOL9LsGZYkyAekayYIi+Y4mbDM8VYbHVPgTWJWAQP6yJKS+V4D17qIMo1L84QJQjGaQWEG139p9Q==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.2", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "relay-runtime": "15.0.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17 || ^18" - } - }, - "node_modules/react-router": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.9.0.tgz", - "integrity": "sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==", - "dependencies": { - "@remix-run/router": "1.4.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.9.0.tgz", - "integrity": "sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==", - "dependencies": { - "@remix-run/router": "1.4.0", - "react-router": "6.9.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, "node_modules/react-shallow-renderer": { "version": "16.15.0", "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", @@ -12611,7 +14235,8 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.1", @@ -12677,37 +14302,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/relay-compiler": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-15.0.0.tgz", - "integrity": "sha512-19gIIdrVe/lk7Dkz/hqxpBd54bBDWAKG+kR5ael+xznJPdjlr/rlAmh5Tqi6Mgf/wiEQGdtKiZqeNdOW2/wVRw==", - "dev": true, - "bin": { - "relay-compiler": "cli.js" - } - }, - "node_modules/relay-runtime": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-15.0.0.tgz", - "integrity": "sha512-7AXkXLQo6gpJNBhk4Kii5b+Yat62HSDD1TgJBi021iSjT1muI8iYd4UZG4f/If209LmaVjkZt2HTNAlk6xtslw==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.2", - "invariant": "^2.2.4" - } - }, - "node_modules/relay-test-utils": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/relay-test-utils/-/relay-test-utils-15.0.0.tgz", - "integrity": "sha512-0e0hLdH7YbPhsEBNgx2FGvWz/MROHiDhz6TH79QcuylNnVHS/M9rpPQt2EpxfGTu0yUfvW62B3UuFHo6I0QnCA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.2", - "invariant": "^2.2.4", - "relay-runtime": "15.0.0" - } - }, "node_modules/remark-external-links": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", @@ -12740,12 +14334,27 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz", + "integrity": "sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12755,6 +14364,12 @@ "node": ">=0.10.0" } }, + "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 + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -12781,6 +14396,19 @@ "node": ">=8" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -12791,6 +14419,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -12842,6 +14476,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12865,6 +14508,15 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12913,6 +14565,12 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz", + "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", + "dev": true + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -12967,6 +14625,17 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/sentence-case": { + "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", + "upper-case-first": "^2.0.2" + } + }, "node_modules/serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", @@ -13019,7 +14688,8 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -13060,6 +14730,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -13123,6 +14802,12 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", + "dev": true + }, "node_modules/simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", @@ -13199,6 +14884,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/snake-case": { + "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" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13269,6 +14964,15 @@ "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, + "node_modules/sponge-case": { + "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" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -13553,6 +15257,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swap-case": { + "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" + } + }, "node_modules/synchronous-promise": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", @@ -13802,6 +15515,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -13872,6 +15591,27 @@ "node": ">=14.0.0" } }, + "node_modules/title-case": { + "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" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -13911,7 +15651,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/ts-dedent": { "version": "2.2.0", @@ -13922,6 +15663,12 @@ "node": ">=6.10" } }, + "node_modules/ts-log": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.5.tgz", + "integrity": "sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==", + "dev": true + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -14056,6 +15803,7 @@ "version": "0.7.34", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.34.tgz", "integrity": "sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -14104,6 +15852,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -14302,6 +16059,24 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "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" + } + }, + "node_modules/upper-case-first": { + "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" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -14520,66 +16295,15 @@ "fsevents": "~2.3.2" } }, - "node_modules/vite-plugin-relay-lite": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vite-plugin-relay-lite/-/vite-plugin-relay-lite-0.4.3.tgz", - "integrity": "sha512-kpDiy8wn7qYl+K35PEttQzZmTm4ihCGJWKWtUWm6cgYQBs4DBWN7jqm4rp9jkMzZL615J/eW0D0tAh1vCbE81Q==", + "node_modules/vite-plugin-graphql-codegen": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-graphql-codegen/-/vite-plugin-graphql-codegen-3.1.0.tgz", + "integrity": "sha512-X3rUGe8SLD0Kg1NOspmxg/1/eEa7vc+mVhUGAsqti9gNWNRXE8VJYJgSTAkvruTsIsrAplyXPN4lb5SilFn/lg==", "dev": true, - "dependencies": { - "cosmiconfig": "^8.0.0", - "kleur": "^4.1.5" - }, - "engines": { - "node": ">= 14.0.0" - }, "peerDependencies": { - "graphql": "^15.0.0 || ^16.0.0", - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/vite-plugin-relay-lite/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/vite-plugin-relay-lite/node_modules/cosmiconfig": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", - "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/vite-plugin-relay-lite/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/vite-plugin-relay-lite/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" + "@graphql-codegen/cli": "^1.0.0 || ^2.0.0 || ^3.0.0", + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0", + "vite": "^2.7.0 || ^3.0.0 || ^4.0.0" } }, "node_modules/vite/node_modules/@esbuild/android-arm": { @@ -15079,6 +16803,15 @@ "node": ">=10.13.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -15104,7 +16837,8 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack-sources": { "version": "3.2.3", @@ -15121,10 +16855,17 @@ "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", "dev": true }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "dev": true + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -15176,6 +16917,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -15233,6 +16980,11 @@ "node": ">=8" } }, + "node_modules/wonka": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.2.5.tgz", + "integrity": "sha512-adhGYKm5xWIZYXRkzEqHbRbRl2gXHqOudjQJMXpRgSyboFmaKOjGm3RIThBk4tZdiZx1DXuKK0H9wKBgXHhzZg==" + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -15338,6 +17090,12 @@ "node": ">= 6" } }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 2de2df0f..54bd9cfa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,9 +5,8 @@ "type": "module", "scripts": { "dev": "vite", - "generate": "relay-compiler && eslint --fix .", - "lint": "relay-compiler --validate && eslint . && tsc", - "relay": "relay-compiler", + "generate": "graphql-codegen && eslint --fix .", + "lint": "graphql-codegen && eslint . && tsc", "build": "npm run lint && vite build --base=./ && npm run build:templates", "build:templates": "tailwindcss --postcss --minify --config ./tailwind.templates.config.cjs -o dist/tailwind.css", "preview": "vite preview", @@ -17,14 +16,18 @@ "build-storybook": "storybook build" }, "dependencies": { + "@urql/core": "^3.2.2", "date-fns": "^2.29.3", + "graphql": "^16.6.0", + "jotai": "^2.0.3", + "jotai-location": "^0.5.1", + "jotai-urql": "^0.5.0", "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-relay": "^15.0.0", - "react-router-dom": "^6.9.0", - "relay-runtime": "^15.0.0" + "react-dom": "^18.2.0" }, "devDependencies": { + "@graphql-codegen/cli": "^3.2.2", + "@graphql-codegen/client-preset": "^2.1.1", "@graphql-eslint/eslint-plugin": "^3.16.1", "@storybook/addon-actions": "^7.0.0-rc.3", "@storybook/addon-backgrounds": "^7.0.0-rc.3", @@ -40,10 +43,7 @@ "@types/node": "^18.15.3", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", - "@types/react-relay": "^14.1.3", "@types/react-test-renderer": "^18.0.0", - "@types/relay-runtime": "^14.1.9", - "@types/relay-test-utils": "^14.1.0", "@vitejs/plugin-react": "^3.1.0", "@vitest/coverage-c8": "^0.29.3", "autoprefixer": "^10.4.14", @@ -54,14 +54,12 @@ "postcss": "^8.4.21", "prettier": "^2.8.4", "react-test-renderer": "^18.2.0", - "relay-compiler": "^15.0.0", - "relay-test-utils": "^15.0.0", "storybook": "^7.0.0-rc.3", "tailwindcss": "^3.2.7", "typescript": "^5.0.2", "vite": "^4.2.0", - "vitest": "^0.29.3", "vite-plugin-eslint": "^1.8.1", - "vite-plugin-relay-lite": "^0.4.3" + "vite-plugin-graphql-codegen": "^3.1.0", + "vitest": "^0.29.3" } } diff --git a/frontend/relay.config.json b/frontend/relay.config.json deleted file mode 100644 index bf3cae28..00000000 --- a/frontend/relay.config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "src": "./src", - "schema": "./schema.graphql", - "language": "typescript", - "eagerEsModules": true, - "exclude": [ - "**/node_modules/**", - "**/__mocks__/**", - "**/__generated__/**" - ] -} diff --git a/frontend/src/RelayEnvironment.ts b/frontend/src/RelayEnvironment.ts deleted file mode 100644 index 0cd25923..00000000 --- a/frontend/src/RelayEnvironment.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2022 The Matrix.org Foundation C.I.C. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { - Environment, - Network, - RecordSource, - Store, - Variables, - RequestParameters, - CacheConfig, -} from "relay-runtime"; - -async function fetchRelay( - params: RequestParameters, - variables: Variables, - _cacheConfig: CacheConfig -) { - const response = await fetch("/graphql", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - query: params.text, - variables, - }), - }); - - // Get the response as JSON - const json = await response.json(); - - // GraphQL returns exceptions (for example, a missing required variable) in the "errors" - // property of the response. If any exceptions occurred when processing the request, - // throw an error to indicate to the developer what went wrong. - if (Array.isArray(json.errors)) { - console.log(json.errors); - throw new Error( - `Error fetching GraphQL query '${ - params.name - }' with variables '${JSON.stringify(variables)}': ${JSON.stringify( - json.errors - )}` - ); - } - - // Otherwise, return the full payload. - return json; -} - -// Export a singleton instance of Relay Environment configured with our network layer: -const environment = new Environment({ - network: Network.create(fetchRelay), - store: new Store(new RecordSource(), { - // This property tells Relay to not immediately clear its cache when the user - // navigates around the app. Relay will hold onto the specified number of - // query results, allowing the user to return to recently visited pages - // and reusing cached data if its available/fresh. - gcReleaseBufferSize: 10, - }), -}); - -export default environment; diff --git a/frontend/src/Router.tsx b/frontend/src/Router.tsx index c92fae80..c199cd5f 100644 --- a/frontend/src/Router.tsx +++ b/frontend/src/Router.tsx @@ -12,52 +12,153 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { lazy, Suspense } from "react"; -import { createBrowserRouter, Outlet, RouterProvider } from "react-router-dom"; +import { lazy, Suspense, useTransition } from "react"; +import { atomWithLocation } from "jotai-location"; +import { atom, useAtomValue, useSetAtom } from "jotai"; import Layout from "./components/Layout"; import LoadingSpinner from "./components/LoadingSpinner"; +type Location = { + pathname?: string; + searchParams?: URLSearchParams; +}; + +type HomeRoute = { type: "home" }; +type DumbRoute = { type: "dumb" }; +type OAuth2ClientRoute = { type: "client"; id: string }; +type BrowserSessionRoute = { type: "session"; id: string }; +type UnknownRoute = { type: "unknown"; segments: string[] }; + +export type Route = + | HomeRoute + | DumbRoute + | OAuth2ClientRoute + | BrowserSessionRoute + | UnknownRoute; + +const routeToSegments = (route: Route): string[] => { + switch (route.type) { + case "home": + return []; + case "dumb": + return ["dumb"]; + case "client": + return ["client", route.id]; + case "session": + return ["session", route.id]; + case "unknown": + return route.segments; + } +}; + +const segmentsToRoute = (segments: string[]): Route => { + if (segments.length === 0 || (segments.length === 1 && segments[0] === "")) { + return { type: "home" }; + } + + if (segments.length === 1 && segments[0] === "dumb") { + return { type: "dumb" }; + } + + if (segments.length === 2 && segments[0] === "client") { + return { type: "client", id: segments[1] }; + } + + if (segments.length === 2 && segments[0] === "session") { + return { type: "session", id: segments[1] }; + } + + return { type: "unknown", segments }; +}; + +const routeToPath = (route: Route): string => + routeToSegments(route) + .map((part) => encodeURIComponent(part)) + .join("/"); + +const pathToRoute = (path: string): Route => { + const segments = path.split("/").map(decodeURIComponent); + return segmentsToRoute(segments); +}; + +const locationToRoute = (location: Location): Route => { + if ( + !location.pathname || + !location.pathname.startsWith(window.APP_CONFIG.root) + ) { + throw new Error("Invalid location"); + } + + const path = location.pathname.slice(window.APP_CONFIG.root.length); + return pathToRoute(path); +}; + +const locationAtom = atomWithLocation(); +export const routeAtom = atom( + (get) => locationToRoute(get(locationAtom)), + (_get, set, value: Route) => { + set(locationAtom, { + pathname: window.APP_CONFIG.root + routeToPath(value), + }); + } +); + const Home = lazy(() => import("./pages/Home")); const OAuth2Client = lazy(() => import("./pages/OAuth2Client")); const BrowserSession = lazy(() => import("./pages/BrowserSession")); -export const router = createBrowserRouter( - [ - { - path: "/", - element: ( - - }> - - - - ), - children: [ - { - index: true, - element: , - }, - { - path: "dumb", - element: <>Hello from another dumb page., - }, - { - path: "client/:id", - element: , - }, - { - path: "session/:id", - element: , - }, - ], - }, - ], - { - basename: window.APP_CONFIG.root, +const InnerRouter: React.FC = () => { + const route = useAtomValue(routeAtom); + + switch (route.type) { + case "home": + return ; + case "client": + return ; + case "session": + return ; + case "dumb": + return <>Dumb route.; + case "unknown": + return <>Unknown route {JSON.stringify(route.segments)}; } +}; + +const Router = () => ( + + }> + + + ); -const Router = () => ; +export const Link: React.FC< + { + route: Route; + children: React.ReactNode; + } & React.HTMLProps +> = ({ route, children, ...props }) => { + const path = routeToPath(route); + const setRoute = useSetAtom(routeAtom); + + // TODO: we should probably have more user control over this + const [isPending, startTransition] = useTransition(); + + return ( + { + e.preventDefault(); + startTransition(() => { + setRoute(route); + }); + }} + {...props} + > + {isPending ? "Loading..." : children} + + ); +}; export default Router; diff --git a/frontend/src/atoms.ts b/frontend/src/atoms.ts new file mode 100644 index 00000000..96e0d8e8 --- /dev/null +++ b/frontend/src/atoms.ts @@ -0,0 +1,24 @@ +// Copyright 2023 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import type { ReactElement } from "react"; +import { useHydrateAtoms } from "jotai/utils"; +import { clientAtom } from "jotai-urql"; + +import { client } from "./graphql"; + +export const HydrateAtoms = ({ children }: { children: ReactElement }) => { + useHydrateAtoms([[clientAtom, client]]); + return children; +}; diff --git a/frontend/src/components/BrowserSession.tsx b/frontend/src/components/BrowserSession.tsx index f6c55cad..cee9983b 100644 --- a/frontend/src/components/BrowserSession.tsx +++ b/frontend/src/components/BrowserSession.tsx @@ -12,33 +12,30 @@ // See the License for the specific language governing permissions and // limitations under the License. -import type { BrowserSession_session$key } from "./__generated__/BrowserSession_session.graphql"; -import { graphql, useFragment } from "react-relay"; - import Block from "./Block"; import { Body, Subtitle } from "./Typography"; import DateTime from "./DateTime"; -import { Link } from "react-router-dom"; +import { Link } from "../Router"; +import { FragmentType, graphql, useFragment } from "../gql"; + +const FRAGMENT = graphql(/* GraphQL */ ` + fragment BrowserSession_session on BrowserSession { + id + createdAt + lastAuthentication { + id + createdAt + } + } +`); type Props = { - session: BrowserSession_session$key; + session: FragmentType; isCurrent: boolean; }; const BrowserSession: React.FC = ({ session, isCurrent }) => { - const data = useFragment( - graphql` - fragment BrowserSession_session on BrowserSession { - id - createdAt - lastAuthentication { - id - createdAt - } - } - `, - session - ); + const data = useFragment(FRAGMENT, session); const lastAuthentication = data.lastAuthentication?.createdAt; const createdAt = data.createdAt; @@ -48,7 +45,7 @@ const BrowserSession: React.FC = ({ session, isCurrent }) => { {isCurrent && Current session} Started: diff --git a/frontend/src/components/BrowserSessionList.tsx b/frontend/src/components/BrowserSessionList.tsx index ec4d8bec..82a4e668 100644 --- a/frontend/src/components/BrowserSessionList.tsx +++ b/frontend/src/components/BrowserSessionList.tsx @@ -12,38 +12,32 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { graphql, usePaginationFragment } from "react-relay"; import BlockList from "./BlockList"; import BrowserSession from "./BrowserSession"; -import Button from "./Button"; import { Title } from "./Typography"; +import { FragmentType, graphql, useFragment } from "../gql"; -import { BrowserSessionList_user$key } from "./__generated__/BrowserSessionList_user.graphql"; +const FRAGMENT = graphql(/* GraphQL */ ` + fragment BrowserSessionList_user on User { + browserSessions(first: $count, after: $cursor) { + edges { + cursor + node { + id + ...BrowserSession_session + } + } + } + } +`); type Props = { - user: BrowserSessionList_user$key; + user: FragmentType; currentSessionId: string; }; const BrowserSessionList: React.FC = ({ user, currentSessionId }) => { - const { data, loadNext, hasNext } = usePaginationFragment( - graphql` - fragment BrowserSessionList_user on User - @refetchable(queryName: "BrowserSessionListQuery") { - browserSessions(first: $count, after: $cursor) - @connection(key: "BrowserSessionList_user_browserSessions") { - edges { - cursor - node { - id - ...BrowserSession_session - } - } - } - } - `, - user - ); + const data = useFragment(FRAGMENT, user); return ( @@ -55,7 +49,6 @@ const BrowserSessionList: React.FC = ({ user, currentSessionId }) => { isCurrent={n.node.id === currentSessionId} /> ))} - {hasNext && } ); }; diff --git a/frontend/src/components/CompatSsoLogin.tsx b/frontend/src/components/CompatSsoLogin.tsx index 0ca8e25e..5ca70e6a 100644 --- a/frontend/src/components/CompatSsoLogin.tsx +++ b/frontend/src/components/CompatSsoLogin.tsx @@ -12,33 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -import type { CompatSsoLogin_login$key } from "./__generated__/CompatSsoLogin_login.graphql"; -import { graphql, useFragment } from "react-relay"; import Block from "./Block"; import { Body, Bold, Code } from "./Typography"; import DateTime from "./DateTime"; +import { FragmentType, graphql, useFragment } from "../gql"; + +const FRAGMENT = graphql(/* GraphQL */ ` + fragment CompatSsoLogin_login on CompatSsoLogin { + id + redirectUri + createdAt + session { + id + createdAt + deviceId + finishedAt + } + } +`); type Props = { - login: CompatSsoLogin_login$key; + login: FragmentType; }; const CompatSsoLogin: React.FC = ({ login }) => { - const data = useFragment( - graphql` - fragment CompatSsoLogin_login on CompatSsoLogin { - id - redirectUri - createdAt - session { - id - createdAt - deviceId - finishedAt - } - } - `, - login - ); + const data = useFragment(FRAGMENT, login); let info = null; if (data.session) { diff --git a/frontend/src/components/CompatSsoLoginList.tsx b/frontend/src/components/CompatSsoLoginList.tsx index 50c96ee2..683f62ef 100644 --- a/frontend/src/components/CompatSsoLoginList.tsx +++ b/frontend/src/components/CompatSsoLoginList.tsx @@ -12,35 +12,30 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { graphql, usePaginationFragment } from "react-relay"; import BlockList from "./BlockList"; -import Button from "./Button"; import CompatSsoLogin from "./CompatSsoLogin"; import { Title } from "./Typography"; -import { CompatSsoLoginList_user$key } from "./__generated__/CompatSsoLoginList_user.graphql"; +import { FragmentType, graphql, useFragment } from "../gql"; + +const FRAGMENT = graphql(/* GraphQL */ ` + fragment CompatSsoLoginList_user on User { + compatSsoLogins(first: $count, after: $cursor) { + edges { + node { + id + ...CompatSsoLogin_login + } + } + } + } +`); type Props = { - user: CompatSsoLoginList_user$key; + user: FragmentType; }; const CompatSsoLoginList: React.FC = ({ user }) => { - const { data, loadNext, hasNext } = usePaginationFragment( - graphql` - fragment CompatSsoLoginList_user on User - @refetchable(queryName: "CompatSsoLoginListQuery") { - compatSsoLogins(first: $count, after: $cursor) - @connection(key: "CompatSsoLoginList_user_compatSsoLogins") { - edges { - node { - id - ...CompatSsoLogin_login - } - } - } - } - `, - user - ); + const data = useFragment(FRAGMENT, user); return ( @@ -48,7 +43,6 @@ const CompatSsoLoginList: React.FC = ({ user }) => { {data.compatSsoLogins.edges.map((n) => ( ))} - {hasNext && } ); }; diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index 467fb380..face1375 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -19,8 +19,8 @@ const Layout: React.FC<{ children?: React.ReactNode }> = ({ children }) => { return (
- Home - Dumb + Home + Dumb
{children}
diff --git a/frontend/src/components/NavItem.tsx b/frontend/src/components/NavItem.tsx index 7d2b4491..b85bbafa 100644 --- a/frontend/src/components/NavItem.tsx +++ b/frontend/src/components/NavItem.tsx @@ -12,25 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { NavLink, To } from "react-router-dom"; +import { useAtomValue } from "jotai"; +import { Link, Route, routeAtom } from "../Router"; -const NavItem: React.FC<{ to: To; children: React.ReactNode }> = ({ - to, +const NavItem: React.FC<{ route: Route; children: React.ReactNode }> = ({ + route, children, -}) => ( -
  • - - (isActive - ? "bg-accent text-white" - : "hover:bg-grey-100 dark:hover:bg-grey-450 opacity-80 hover:opacity-100") + - " p-2 rounded block uppercase font-medium" - } - > - {children} - -
  • -); +}) => { + const currentRoute = useAtomValue(routeAtom); + return ( +
  • + + {children} + +
  • + ); +}; export default NavItem; diff --git a/frontend/src/components/OAuth2Session.stories.tsx b/frontend/src/components/OAuth2Session.stories.tsx deleted file mode 100644 index 03601fff..00000000 --- a/frontend/src/components/OAuth2Session.stories.tsx +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2022 The Matrix.org Foundation C.I.C. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import type { Meta, StoryObj } from "@storybook/react"; -import { - graphql, - RelayEnvironmentProvider, - useLazyLoadQuery, -} from "react-relay"; -import { createMockEnvironment, MockPayloadGenerator } from "relay-test-utils"; - -import OAuth2Session from "./OAuth2Session"; -import { OAuth2SessionStoriesQuery } from "./__generated__/OAuth2SessionStoriesQuery.graphql"; - -type TemplateProps = { - scope: string; - clientId: string; - clientName: string; - clientUri: string; -}; - -const Template: React.FC = ({ - scope, - clientId, - clientName, - clientUri, -}) => { - const environment = createMockEnvironment(); - environment.mock.queueOperationResolver((operation) => - MockPayloadGenerator.generate(operation, { - Oauth2Session() { - return { - scope, - }; - }, - - Oauth2Client() { - return { - clientId, - clientName, - clientUri, - }; - }, - }) - ); - - const Render = () => { - const data = useLazyLoadQuery( - graphql` - query OAuth2SessionStoriesQuery @relay_test_operation { - session: node(id: "test-id") { - ...OAuth2Session_session - } - } - `, - {} - ); - - return ; - }; - - return ( - - - - ); -}; - -const meta = { - title: "Components/OAuth 2.0 Session", - component: Template, - tags: ["autodocs"], - args: { - scope: "openid", - clientId: "aaabbbcccdddeee", - clientName: "My client", - clientUri: "https://example.com/", - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/frontend/src/components/OAuth2Session.tsx b/frontend/src/components/OAuth2Session.tsx index 8b7377a1..d20b5612 100644 --- a/frontend/src/components/OAuth2Session.tsx +++ b/frontend/src/components/OAuth2Session.tsx @@ -12,38 +12,36 @@ // See the License for the specific language governing permissions and // limitations under the License. -import type { OAuth2Session_session$key } from "./__generated__/OAuth2Session_session.graphql"; -import { graphql, useFragment } from "react-relay"; import { Body, Bold, Code } from "./Typography"; import Block from "./Block"; -import { Link } from "react-router-dom"; +import { Link } from "../Router"; +import { FragmentType, graphql, useFragment } from "../gql"; + +const FRAGMENT = graphql(/* GraphQL */ ` + fragment OAuth2Session_session on Oauth2Session { + id + scope + client { + id + clientId + clientName + clientUri + } + } +`); type Props = { - session: OAuth2Session_session$key; + session: FragmentType; }; const OAuth2Session: React.FC = ({ session }) => { - const data = useFragment( - graphql` - fragment OAuth2Session_session on Oauth2Session { - id - scope - client { - id - clientId - clientName - clientUri - } - } - `, - session - ); + const data = useFragment(FRAGMENT, session); return ( Client ID: {data.client.clientId} diff --git a/frontend/src/components/OAuth2SessionList.tsx b/frontend/src/components/OAuth2SessionList.tsx index 0943db7b..8389f6d6 100644 --- a/frontend/src/components/OAuth2SessionList.tsx +++ b/frontend/src/components/OAuth2SessionList.tsx @@ -12,37 +12,32 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { graphql, usePaginationFragment } from "react-relay"; import BlockList from "./BlockList"; -import Button from "./Button"; import OAuth2Session from "./OAuth2Session"; import { Title } from "./Typography"; -import { OAuth2SessionList_user$key } from "./__generated__/OAuth2SessionList_user.graphql"; +import { FragmentType, graphql, useFragment } from "../gql"; + +const FRAGMENT = graphql(/* GraphQL */ ` + fragment OAuth2SessionList_user on User { + oauth2Sessions(first: $count, after: $cursor) { + edges { + cursor + node { + id + ...OAuth2Session_session + } + } + } + } +`); type Props = { - user: OAuth2SessionList_user$key; + user: FragmentType; }; const OAuth2SessionList: React.FC = ({ user }) => { - const { data, loadNext, hasNext } = usePaginationFragment( - graphql` - fragment OAuth2SessionList_user on User - @refetchable(queryName: "OAuth2SessionListQuery") { - oauth2Sessions(first: $count, after: $cursor) - @connection(key: "OAuth2SessionList_user_oauth2Sessions") { - edges { - cursor - node { - id - ...OAuth2Session_session - } - } - } - } - `, - user - ); + const data = useFragment(FRAGMENT, user); return ( @@ -50,7 +45,6 @@ const OAuth2SessionList: React.FC = ({ user }) => { {data.oauth2Sessions.edges.map((n) => ( ))} - {hasNext && } ); }; diff --git a/frontend/src/components/__generated__/BrowserSessionListQuery.graphql.ts b/frontend/src/components/__generated__/BrowserSessionListQuery.graphql.ts deleted file mode 100644 index 9d42eb97..00000000 --- a/frontend/src/components/__generated__/BrowserSessionListQuery.graphql.ts +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @generated SignedSource<<2e2beb7aa6522ccc21b080d150de618a>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type BrowserSessionListQuery$variables = { - count?: number | null; - cursor?: string | null; - id: string; -}; -export type BrowserSessionListQuery$data = { - readonly node: { - readonly " $fragmentSpreads": FragmentRefs<"BrowserSessionList_user">; - } | null; -}; -export type BrowserSessionListQuery = { - response: BrowserSessionListQuery$data; - variables: BrowserSessionListQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "count" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "cursor" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "id" - } -], -v1 = [ - { - "kind": "Variable", - "name": "id", - "variableName": "id" - } -], -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null -}, -v3 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v4 = [ - { - "kind": "Variable", - "name": "after", - "variableName": "cursor" - }, - { - "kind": "Variable", - "name": "first", - "variableName": "count" - } -], -v5 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null -}; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "BrowserSessionListQuery", - "selections": [ - { - "alias": null, - "args": (v1/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - { - "args": null, - "kind": "FragmentSpread", - "name": "BrowserSessionList_user" - } - ], - "storageKey": null - } - ], - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "BrowserSessionListQuery", - "selections": [ - { - "alias": null, - "args": (v1/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - (v3/*: any*/), - { - "kind": "InlineFragment", - "selections": [ - { - "alias": null, - "args": (v4/*: any*/), - "concreteType": "BrowserSessionConnection", - "kind": "LinkedField", - "name": "browserSessions", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "BrowserSessionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "BrowserSession", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - (v5/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Authentication", - "kind": "LinkedField", - "name": "lastAuthentication", - "plural": false, - "selections": [ - (v3/*: any*/), - (v5/*: any*/) - ], - "storageKey": null - }, - (v2/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": (v4/*: any*/), - "filters": null, - "handle": "connection", - "key": "BrowserSessionList_user_browserSessions", - "kind": "LinkedHandle", - "name": "browserSessions" - } - ], - "type": "User", - "abstractKey": null - } - ], - "storageKey": null - } - ] - }, - "params": { - "cacheID": "c05f614c382cae0bed080006b43f14f3", - "id": null, - "metadata": {}, - "name": "BrowserSessionListQuery", - "operationKind": "query", - "text": "query BrowserSessionListQuery(\n $count: Int\n $cursor: String\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...BrowserSessionList_user\n id\n }\n}\n\nfragment BrowserSessionList_user on User {\n browserSessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...BrowserSession_session\n __typename\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment BrowserSession_session on BrowserSession {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n}\n" - } -}; -})(); - -(node as any).hash = "5f21c429aa98b854c17d3f9eb83b81d8"; - -export default node; diff --git a/frontend/src/components/__generated__/BrowserSessionList_user.graphql.ts b/frontend/src/components/__generated__/BrowserSessionList_user.graphql.ts deleted file mode 100644 index c060f4d5..00000000 --- a/frontend/src/components/__generated__/BrowserSessionList_user.graphql.ts +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @generated SignedSource<<3b7505958556a142e2d9926ae631f0e0>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ReaderFragment, RefetchableFragment } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type BrowserSessionList_user$data = { - readonly browserSessions: { - readonly edges: ReadonlyArray<{ - readonly cursor: string; - readonly node: { - readonly id: string; - readonly " $fragmentSpreads": FragmentRefs<"BrowserSession_session">; - }; - }>; - }; - readonly id: string; - readonly " $fragmentType": "BrowserSessionList_user"; -}; -export type BrowserSessionList_user$key = { - readonly " $data"?: BrowserSessionList_user$data; - readonly " $fragmentSpreads": FragmentRefs<"BrowserSessionList_user">; -}; - -import BrowserSessionListQuery_graphql from './BrowserSessionListQuery.graphql'; - -const node: ReaderFragment = (function(){ -var v0 = [ - "browserSessions" -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}; -return { - "argumentDefinitions": [ - { - "kind": "RootArgument", - "name": "count" - }, - { - "kind": "RootArgument", - "name": "cursor" - } - ], - "kind": "Fragment", - "metadata": { - "connection": [ - { - "count": "count", - "cursor": "cursor", - "direction": "forward", - "path": (v0/*: any*/) - } - ], - "refetch": { - "connection": { - "forward": { - "count": "count", - "cursor": "cursor" - }, - "backward": null, - "path": (v0/*: any*/) - }, - "fragmentPathInResult": [ - "node" - ], - "operation": BrowserSessionListQuery_graphql, - "identifierField": "id" - } - }, - "name": "BrowserSessionList_user", - "selections": [ - { - "alias": "browserSessions", - "args": null, - "concreteType": "BrowserSessionConnection", - "kind": "LinkedField", - "name": "__BrowserSessionList_user_browserSessions_connection", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "BrowserSessionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "BrowserSession", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "args": null, - "kind": "FragmentSpread", - "name": "BrowserSession_session" - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - (v1/*: any*/) - ], - "type": "User", - "abstractKey": null -}; -})(); - -(node as any).hash = "5f21c429aa98b854c17d3f9eb83b81d8"; - -export default node; diff --git a/frontend/src/components/__generated__/BrowserSession_session.graphql.ts b/frontend/src/components/__generated__/BrowserSession_session.graphql.ts deleted file mode 100644 index ecfacc69..00000000 --- a/frontend/src/components/__generated__/BrowserSession_session.graphql.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { Fragment, ReaderFragment } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type BrowserSession_session$data = { - readonly createdAt: any; - readonly id: string; - readonly lastAuthentication: { - readonly createdAt: any; - readonly id: string; - } | null; - readonly " $fragmentType": "BrowserSession_session"; -}; -export type BrowserSession_session$key = { - readonly " $data"?: BrowserSession_session$data; - readonly " $fragmentSpreads": FragmentRefs<"BrowserSession_session">; -}; - -const node: ReaderFragment = (function(){ -var v0 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null -}; -return { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "BrowserSession_session", - "selections": [ - (v0/*: any*/), - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Authentication", - "kind": "LinkedField", - "name": "lastAuthentication", - "plural": false, - "selections": [ - (v0/*: any*/), - (v1/*: any*/) - ], - "storageKey": null - } - ], - "type": "BrowserSession", - "abstractKey": null -}; -})(); - -(node as any).hash = "04d6adf0b2a1bf2098938ef30f195c4a"; - -export default node; diff --git a/frontend/src/components/__generated__/CompatSsoLoginListQuery.graphql.ts b/frontend/src/components/__generated__/CompatSsoLoginListQuery.graphql.ts deleted file mode 100644 index 13d8e643..00000000 --- a/frontend/src/components/__generated__/CompatSsoLoginListQuery.graphql.ts +++ /dev/null @@ -1,265 +0,0 @@ -/** - * @generated SignedSource<<3e111db0c30af3251a88326deea5562c>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type CompatSsoLoginListQuery$variables = { - count?: number | null; - cursor?: string | null; - id: string; -}; -export type CompatSsoLoginListQuery$data = { - readonly node: { - readonly " $fragmentSpreads": FragmentRefs<"CompatSsoLoginList_user">; - } | null; -}; -export type CompatSsoLoginListQuery = { - response: CompatSsoLoginListQuery$data; - variables: CompatSsoLoginListQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "count" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "cursor" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "id" - } -], -v1 = [ - { - "kind": "Variable", - "name": "id", - "variableName": "id" - } -], -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null -}, -v3 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v4 = [ - { - "kind": "Variable", - "name": "after", - "variableName": "cursor" - }, - { - "kind": "Variable", - "name": "first", - "variableName": "count" - } -], -v5 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null -}; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "CompatSsoLoginListQuery", - "selections": [ - { - "alias": null, - "args": (v1/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - { - "args": null, - "kind": "FragmentSpread", - "name": "CompatSsoLoginList_user" - } - ], - "storageKey": null - } - ], - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "CompatSsoLoginListQuery", - "selections": [ - { - "alias": null, - "args": (v1/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - (v3/*: any*/), - { - "kind": "InlineFragment", - "selections": [ - { - "alias": null, - "args": (v4/*: any*/), - "concreteType": "CompatSsoLoginConnection", - "kind": "LinkedField", - "name": "compatSsoLogins", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "CompatSsoLoginEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "CompatSsoLogin", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "redirectUri", - "storageKey": null - }, - (v5/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "CompatSession", - "kind": "LinkedField", - "name": "session", - "plural": false, - "selections": [ - (v3/*: any*/), - (v5/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "deviceId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "finishedAt", - "storageKey": null - } - ], - "storageKey": null - }, - (v2/*: any*/) - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": (v4/*: any*/), - "filters": null, - "handle": "connection", - "key": "CompatSsoLoginList_user_compatSsoLogins", - "kind": "LinkedHandle", - "name": "compatSsoLogins" - } - ], - "type": "User", - "abstractKey": null - } - ], - "storageKey": null - } - ] - }, - "params": { - "cacheID": "45c6342d3a53a3e3b2b18617796cf654", - "id": null, - "metadata": {}, - "name": "CompatSsoLoginListQuery", - "operationKind": "query", - "text": "query CompatSsoLoginListQuery(\n $count: Int\n $cursor: String\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...CompatSsoLoginList_user\n id\n }\n}\n\nfragment CompatSsoLoginList_user on User {\n compatSsoLogins(first: $count, after: $cursor) {\n edges {\n node {\n id\n ...CompatSsoLogin_login\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment CompatSsoLogin_login on CompatSsoLogin {\n id\n redirectUri\n createdAt\n session {\n id\n createdAt\n deviceId\n finishedAt\n }\n}\n" - } -}; -})(); - -(node as any).hash = "cafc795d1bf9643ac6155c017e66c858"; - -export default node; diff --git a/frontend/src/components/__generated__/CompatSsoLoginList_user.graphql.ts b/frontend/src/components/__generated__/CompatSsoLoginList_user.graphql.ts deleted file mode 100644 index 2f89c607..00000000 --- a/frontend/src/components/__generated__/CompatSsoLoginList_user.graphql.ts +++ /dev/null @@ -1,169 +0,0 @@ -/** - * @generated SignedSource<<4ace8ea8668e3dc638df21400c690bd8>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ReaderFragment, RefetchableFragment } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type CompatSsoLoginList_user$data = { - readonly compatSsoLogins: { - readonly edges: ReadonlyArray<{ - readonly node: { - readonly id: string; - readonly " $fragmentSpreads": FragmentRefs<"CompatSsoLogin_login">; - }; - }>; - }; - readonly id: string; - readonly " $fragmentType": "CompatSsoLoginList_user"; -}; -export type CompatSsoLoginList_user$key = { - readonly " $data"?: CompatSsoLoginList_user$data; - readonly " $fragmentSpreads": FragmentRefs<"CompatSsoLoginList_user">; -}; - -import CompatSsoLoginListQuery_graphql from './CompatSsoLoginListQuery.graphql'; - -const node: ReaderFragment = (function(){ -var v0 = [ - "compatSsoLogins" -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}; -return { - "argumentDefinitions": [ - { - "kind": "RootArgument", - "name": "count" - }, - { - "kind": "RootArgument", - "name": "cursor" - } - ], - "kind": "Fragment", - "metadata": { - "connection": [ - { - "count": "count", - "cursor": "cursor", - "direction": "forward", - "path": (v0/*: any*/) - } - ], - "refetch": { - "connection": { - "forward": { - "count": "count", - "cursor": "cursor" - }, - "backward": null, - "path": (v0/*: any*/) - }, - "fragmentPathInResult": [ - "node" - ], - "operation": CompatSsoLoginListQuery_graphql, - "identifierField": "id" - } - }, - "name": "CompatSsoLoginList_user", - "selections": [ - { - "alias": "compatSsoLogins", - "args": null, - "concreteType": "CompatSsoLoginConnection", - "kind": "LinkedField", - "name": "__CompatSsoLoginList_user_compatSsoLogins_connection", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "CompatSsoLoginEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "CompatSsoLogin", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "args": null, - "kind": "FragmentSpread", - "name": "CompatSsoLogin_login" - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - (v1/*: any*/) - ], - "type": "User", - "abstractKey": null -}; -})(); - -(node as any).hash = "cafc795d1bf9643ac6155c017e66c858"; - -export default node; diff --git a/frontend/src/components/__generated__/CompatSsoLogin_login.graphql.ts b/frontend/src/components/__generated__/CompatSsoLogin_login.graphql.ts deleted file mode 100644 index a89d86d8..00000000 --- a/frontend/src/components/__generated__/CompatSsoLogin_login.graphql.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @generated SignedSource<<20e2b233e5154ea60632046abc2aa29a>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { Fragment, ReaderFragment } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type CompatSsoLogin_login$data = { - readonly createdAt: any; - readonly id: string; - readonly redirectUri: any; - readonly session: { - readonly createdAt: any; - readonly deviceId: string; - readonly finishedAt: any | null; - readonly id: string; - } | null; - readonly " $fragmentType": "CompatSsoLogin_login"; -}; -export type CompatSsoLogin_login$key = { - readonly " $data"?: CompatSsoLogin_login$data; - readonly " $fragmentSpreads": FragmentRefs<"CompatSsoLogin_login">; -}; - -const node: ReaderFragment = (function(){ -var v0 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null -}; -return { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "CompatSsoLogin_login", - "selections": [ - (v0/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "redirectUri", - "storageKey": null - }, - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "CompatSession", - "kind": "LinkedField", - "name": "session", - "plural": false, - "selections": [ - (v0/*: any*/), - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "deviceId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "finishedAt", - "storageKey": null - } - ], - "storageKey": null - } - ], - "type": "CompatSsoLogin", - "abstractKey": null -}; -})(); - -(node as any).hash = "7be3b416b1023cea0de7a87b9738e5d5"; - -export default node; diff --git a/frontend/src/components/__generated__/OAuth2SessionListQuery.graphql.ts b/frontend/src/components/__generated__/OAuth2SessionListQuery.graphql.ts deleted file mode 100644 index 8b9292f1..00000000 --- a/frontend/src/components/__generated__/OAuth2SessionListQuery.graphql.ts +++ /dev/null @@ -1,263 +0,0 @@ -/** - * @generated SignedSource<<816340b05858a7b5a61aca0a72c21c46>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type OAuth2SessionListQuery$variables = { - count?: number | null; - cursor?: string | null; - id: string; -}; -export type OAuth2SessionListQuery$data = { - readonly node: { - readonly " $fragmentSpreads": FragmentRefs<"OAuth2SessionList_user">; - } | null; -}; -export type OAuth2SessionListQuery = { - response: OAuth2SessionListQuery$data; - variables: OAuth2SessionListQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "count" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "cursor" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "id" - } -], -v1 = [ - { - "kind": "Variable", - "name": "id", - "variableName": "id" - } -], -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null -}, -v3 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v4 = [ - { - "kind": "Variable", - "name": "after", - "variableName": "cursor" - }, - { - "kind": "Variable", - "name": "first", - "variableName": "count" - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "OAuth2SessionListQuery", - "selections": [ - { - "alias": null, - "args": (v1/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - { - "args": null, - "kind": "FragmentSpread", - "name": "OAuth2SessionList_user" - } - ], - "storageKey": null - } - ], - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "OAuth2SessionListQuery", - "selections": [ - { - "alias": null, - "args": (v1/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - (v3/*: any*/), - { - "kind": "InlineFragment", - "selections": [ - { - "alias": null, - "args": (v4/*: any*/), - "concreteType": "Oauth2SessionConnection", - "kind": "LinkedField", - "name": "oauth2Sessions", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Oauth2SessionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Oauth2Session", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "scope", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Oauth2Client", - "kind": "LinkedField", - "name": "client", - "plural": false, - "selections": [ - (v3/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientUri", - "storageKey": null - } - ], - "storageKey": null - }, - (v2/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": (v4/*: any*/), - "filters": null, - "handle": "connection", - "key": "OAuth2SessionList_user_oauth2Sessions", - "kind": "LinkedHandle", - "name": "oauth2Sessions" - } - ], - "type": "User", - "abstractKey": null - } - ], - "storageKey": null - } - ] - }, - "params": { - "cacheID": "26d1b723940d396f1af608f36ff05ce6", - "id": null, - "metadata": {}, - "name": "OAuth2SessionListQuery", - "operationKind": "query", - "text": "query OAuth2SessionListQuery(\n $count: Int\n $cursor: String\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...OAuth2SessionList_user\n id\n }\n}\n\nfragment OAuth2SessionList_user on User {\n oauth2Sessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...OAuth2Session_session\n __typename\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment OAuth2Session_session on Oauth2Session {\n id\n scope\n client {\n id\n clientId\n clientName\n clientUri\n }\n}\n" - } -}; -})(); - -(node as any).hash = "17ef23458a73705550aa33e7f73e41cf"; - -export default node; diff --git a/frontend/src/components/__generated__/OAuth2SessionList_user.graphql.ts b/frontend/src/components/__generated__/OAuth2SessionList_user.graphql.ts deleted file mode 100644 index 8f1d15ba..00000000 --- a/frontend/src/components/__generated__/OAuth2SessionList_user.graphql.ts +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @generated SignedSource<<8cb936a8cc1a9ab2a877a4ea92622c88>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ReaderFragment, RefetchableFragment } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type OAuth2SessionList_user$data = { - readonly id: string; - readonly oauth2Sessions: { - readonly edges: ReadonlyArray<{ - readonly cursor: string; - readonly node: { - readonly id: string; - readonly " $fragmentSpreads": FragmentRefs<"OAuth2Session_session">; - }; - }>; - }; - readonly " $fragmentType": "OAuth2SessionList_user"; -}; -export type OAuth2SessionList_user$key = { - readonly " $data"?: OAuth2SessionList_user$data; - readonly " $fragmentSpreads": FragmentRefs<"OAuth2SessionList_user">; -}; - -import OAuth2SessionListQuery_graphql from './OAuth2SessionListQuery.graphql'; - -const node: ReaderFragment = (function(){ -var v0 = [ - "oauth2Sessions" -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}; -return { - "argumentDefinitions": [ - { - "kind": "RootArgument", - "name": "count" - }, - { - "kind": "RootArgument", - "name": "cursor" - } - ], - "kind": "Fragment", - "metadata": { - "connection": [ - { - "count": "count", - "cursor": "cursor", - "direction": "forward", - "path": (v0/*: any*/) - } - ], - "refetch": { - "connection": { - "forward": { - "count": "count", - "cursor": "cursor" - }, - "backward": null, - "path": (v0/*: any*/) - }, - "fragmentPathInResult": [ - "node" - ], - "operation": OAuth2SessionListQuery_graphql, - "identifierField": "id" - } - }, - "name": "OAuth2SessionList_user", - "selections": [ - { - "alias": "oauth2Sessions", - "args": null, - "concreteType": "Oauth2SessionConnection", - "kind": "LinkedField", - "name": "__OAuth2SessionList_user_oauth2Sessions_connection", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Oauth2SessionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Oauth2Session", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "args": null, - "kind": "FragmentSpread", - "name": "OAuth2Session_session" - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - (v1/*: any*/) - ], - "type": "User", - "abstractKey": null -}; -})(); - -(node as any).hash = "17ef23458a73705550aa33e7f73e41cf"; - -export default node; diff --git a/frontend/src/components/__generated__/OAuth2SessionStoriesQuery.graphql.ts b/frontend/src/components/__generated__/OAuth2SessionStoriesQuery.graphql.ts deleted file mode 100644 index 537ef58f..00000000 --- a/frontend/src/components/__generated__/OAuth2SessionStoriesQuery.graphql.ts +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @generated SignedSource<<82179715f61e6a03437d696941ceaf16>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type OAuth2SessionStoriesQuery$variables = {}; -export type OAuth2SessionStoriesQuery$data = { - readonly session: { - readonly " $fragmentSpreads": FragmentRefs<"OAuth2Session_session">; - } | null; -}; -export type OAuth2SessionStoriesQuery = { - response: OAuth2SessionStoriesQuery$data; - variables: OAuth2SessionStoriesQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "kind": "Literal", - "name": "id", - "value": "test-id" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v2 = { - "enumValues": null, - "nullable": false, - "plural": false, - "type": "String" -}, -v3 = { - "enumValues": null, - "nullable": false, - "plural": false, - "type": "ID" -}; -return { - "fragment": { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "OAuth2SessionStoriesQuery", - "selections": [ - { - "alias": "session", - "args": (v0/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - { - "args": null, - "kind": "FragmentSpread", - "name": "OAuth2Session_session" - } - ], - "storageKey": "node(id:\"test-id\")" - } - ], - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [], - "kind": "Operation", - "name": "OAuth2SessionStoriesQuery", - "selections": [ - { - "alias": "session", - "args": (v0/*: any*/), - "concreteType": null, - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null - }, - (v1/*: any*/), - { - "kind": "InlineFragment", - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "scope", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Oauth2Client", - "kind": "LinkedField", - "name": "client", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientUri", - "storageKey": null - } - ], - "storageKey": null - } - ], - "type": "Oauth2Session", - "abstractKey": null - } - ], - "storageKey": "node(id:\"test-id\")" - } - ] - }, - "params": { - "cacheID": "2b2911cfb421c557245313732f0813e0", - "id": null, - "metadata": { - "relayTestingSelectionTypeInfo": { - "session": { - "enumValues": null, - "nullable": true, - "plural": false, - "type": "Node" - }, - "session.__typename": (v2/*: any*/), - "session.client": { - "enumValues": null, - "nullable": false, - "plural": false, - "type": "Oauth2Client" - }, - "session.client.clientId": (v2/*: any*/), - "session.client.clientName": { - "enumValues": null, - "nullable": true, - "plural": false, - "type": "String" - }, - "session.client.clientUri": { - "enumValues": null, - "nullable": true, - "plural": false, - "type": "Url" - }, - "session.client.id": (v3/*: any*/), - "session.id": (v3/*: any*/), - "session.scope": (v2/*: any*/) - } - }, - "name": "OAuth2SessionStoriesQuery", - "operationKind": "query", - "text": "query OAuth2SessionStoriesQuery {\n session: node(id: \"test-id\") {\n __typename\n ...OAuth2Session_session\n id\n }\n}\n\nfragment OAuth2Session_session on Oauth2Session {\n id\n scope\n client {\n id\n clientId\n clientName\n clientUri\n }\n}\n" - } -}; -})(); - -(node as any).hash = "d60f8f0abfc0b70236d89328bc5c0e85"; - -export default node; diff --git a/frontend/src/components/__generated__/OAuth2Session_session.graphql.ts b/frontend/src/components/__generated__/OAuth2Session_session.graphql.ts deleted file mode 100644 index efc5daae..00000000 --- a/frontend/src/components/__generated__/OAuth2Session_session.graphql.ts +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @generated SignedSource<<599452efb8ce96e81a5e9500668ff055>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { Fragment, ReaderFragment } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type OAuth2Session_session$data = { - readonly client: { - readonly clientId: string; - readonly clientName: string | null; - readonly clientUri: any | null; - readonly id: string; - }; - readonly id: string; - readonly scope: string; - readonly " $fragmentType": "OAuth2Session_session"; -}; -export type OAuth2Session_session$key = { - readonly " $data"?: OAuth2Session_session$data; - readonly " $fragmentSpreads": FragmentRefs<"OAuth2Session_session">; -}; - -const node: ReaderFragment = (function(){ -var v0 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}; -return { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "OAuth2Session_session", - "selections": [ - (v0/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "scope", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Oauth2Client", - "kind": "LinkedField", - "name": "client", - "plural": false, - "selections": [ - (v0/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientUri", - "storageKey": null - } - ], - "storageKey": null - } - ], - "type": "Oauth2Session", - "abstractKey": null -}; -})(); - -(node as any).hash = "d9fa36c7f93b7cef4d5a038d19f768b1"; - -export default node; diff --git a/frontend/src/gql/fragment-masking.ts b/frontend/src/gql/fragment-masking.ts new file mode 100644 index 00000000..b3459581 --- /dev/null +++ b/frontend/src/gql/fragment-masking.ts @@ -0,0 +1,54 @@ +import { + ResultOf, + TypedDocumentNode as DocumentNode, +} from "@graphql-typed-document-node/core"; + +export type FragmentType> = + TDocumentType extends DocumentNode + ? TType extends { " $fragmentName"?: infer TKey } + ? TKey extends string + ? { " $fragmentRefs"?: { [key in TKey]: TType } } + : never + : never + : never; + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: FragmentType> +): TType; +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: FragmentType> | null | undefined +): TType | null | undefined; +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: ReadonlyArray>> +): ReadonlyArray; +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: + | ReadonlyArray>> + | null + | undefined +): ReadonlyArray | null | undefined; +export function useFragment( + _documentNode: DocumentNode, + fragmentType: + | FragmentType> + | ReadonlyArray>> + | null + | undefined +): TType | ReadonlyArray | null | undefined { + return fragmentType as any; +} + +export function makeFragmentData< + F extends DocumentNode, + FT extends ResultOf +>(data: FT, _fragment: F): FragmentType { + return data as FragmentType; +} diff --git a/frontend/src/gql/gql.ts b/frontend/src/gql/gql.ts new file mode 100644 index 00000000..1e40efa4 --- /dev/null +++ b/frontend/src/gql/gql.ts @@ -0,0 +1,82 @@ +/* eslint-disable */ +import * as types from './graphql'; +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; + +/** + * Map of all GraphQL operations in the project. + * + * This map has several performance disadvantages: + * 1. It is not tree-shakeable, so it will include all operations in the project. + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. + * 3. It does not support dead code elimination, so it will add unused operations. + * + * Therefore it is highly recommended to use the babel or swc plugin for production. + */ +const documents = { + "\n fragment BrowserSession_session on BrowserSession {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n }\n": types.BrowserSession_SessionFragmentDoc, + "\n fragment BrowserSessionList_user on User {\n browserSessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...BrowserSession_session\n }\n }\n }\n }\n": types.BrowserSessionList_UserFragmentDoc, + "\n fragment CompatSsoLogin_login on CompatSsoLogin {\n id\n redirectUri\n createdAt\n session {\n id\n createdAt\n deviceId\n finishedAt\n }\n }\n": types.CompatSsoLogin_LoginFragmentDoc, + "\n fragment CompatSsoLoginList_user on User {\n compatSsoLogins(first: $count, after: $cursor) {\n edges {\n node {\n id\n ...CompatSsoLogin_login\n }\n }\n }\n }\n": types.CompatSsoLoginList_UserFragmentDoc, + "\n fragment OAuth2Session_session on Oauth2Session {\n id\n scope\n client {\n id\n clientId\n clientName\n clientUri\n }\n }\n": types.OAuth2Session_SessionFragmentDoc, + "\n fragment OAuth2SessionList_user on User {\n oauth2Sessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...OAuth2Session_session\n }\n }\n }\n }\n": types.OAuth2SessionList_UserFragmentDoc, + "\n query BrowserSessionQuery($id: ID!) {\n browserSession(id: $id) {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n user {\n id\n username\n }\n }\n }\n": types.BrowserSessionQueryDocument, + "\n query HomeQuery($count: Int!, $cursor: String) {\n currentBrowserSession {\n id\n user {\n id\n username\n\n ...CompatSsoLoginList_user\n ...BrowserSessionList_user\n ...OAuth2SessionList_user\n }\n }\n }\n": types.HomeQueryDocument, + "\n query OAuth2ClientQuery($id: ID!) {\n oauth2Client(id: $id) {\n id\n clientId\n clientName\n clientUri\n tosUri\n policyUri\n redirectUris\n }\n }\n": types.OAuth2ClientQueryDocument, +}; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + * + * + * @example + * ```ts + * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`); + * ``` + * + * The query argument is unknown! + * Please regenerate the types. + */ +export function graphql(source: string): unknown; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment BrowserSession_session on BrowserSession {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n }\n"): (typeof documents)["\n fragment BrowserSession_session on BrowserSession {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment BrowserSessionList_user on User {\n browserSessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...BrowserSession_session\n }\n }\n }\n }\n"): (typeof documents)["\n fragment BrowserSessionList_user on User {\n browserSessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...BrowserSession_session\n }\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment CompatSsoLogin_login on CompatSsoLogin {\n id\n redirectUri\n createdAt\n session {\n id\n createdAt\n deviceId\n finishedAt\n }\n }\n"): (typeof documents)["\n fragment CompatSsoLogin_login on CompatSsoLogin {\n id\n redirectUri\n createdAt\n session {\n id\n createdAt\n deviceId\n finishedAt\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment CompatSsoLoginList_user on User {\n compatSsoLogins(first: $count, after: $cursor) {\n edges {\n node {\n id\n ...CompatSsoLogin_login\n }\n }\n }\n }\n"): (typeof documents)["\n fragment CompatSsoLoginList_user on User {\n compatSsoLogins(first: $count, after: $cursor) {\n edges {\n node {\n id\n ...CompatSsoLogin_login\n }\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment OAuth2Session_session on Oauth2Session {\n id\n scope\n client {\n id\n clientId\n clientName\n clientUri\n }\n }\n"): (typeof documents)["\n fragment OAuth2Session_session on Oauth2Session {\n id\n scope\n client {\n id\n clientId\n clientName\n clientUri\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment OAuth2SessionList_user on User {\n oauth2Sessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...OAuth2Session_session\n }\n }\n }\n }\n"): (typeof documents)["\n fragment OAuth2SessionList_user on User {\n oauth2Sessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...OAuth2Session_session\n }\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query BrowserSessionQuery($id: ID!) {\n browserSession(id: $id) {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n user {\n id\n username\n }\n }\n }\n"): (typeof documents)["\n query BrowserSessionQuery($id: ID!) {\n browserSession(id: $id) {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n user {\n id\n username\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query HomeQuery($count: Int!, $cursor: String) {\n currentBrowserSession {\n id\n user {\n id\n username\n\n ...CompatSsoLoginList_user\n ...BrowserSessionList_user\n ...OAuth2SessionList_user\n }\n }\n }\n"): (typeof documents)["\n query HomeQuery($count: Int!, $cursor: String) {\n currentBrowserSession {\n id\n user {\n id\n username\n\n ...CompatSsoLoginList_user\n ...BrowserSessionList_user\n ...OAuth2SessionList_user\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query OAuth2ClientQuery($id: ID!) {\n oauth2Client(id: $id) {\n id\n clientId\n clientName\n clientUri\n tosUri\n policyUri\n redirectUris\n }\n }\n"): (typeof documents)["\n query OAuth2ClientQuery($id: ID!) {\n oauth2Client(id: $id) {\n id\n clientId\n clientName\n clientUri\n tosUri\n policyUri\n redirectUris\n }\n }\n"]; + +export function graphql(source: string) { + return (documents as any)[source] ?? {}; +} + +export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/frontend/src/gql/graphql.ts b/frontend/src/gql/graphql.ts new file mode 100644 index 00000000..4a01808e --- /dev/null +++ b/frontend/src/gql/graphql.ts @@ -0,0 +1,507 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +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; + /** + * Implement the DateTime scalar + * + * The input/output is a string in RFC3339 format. + */ + DateTime: any; + /** URL is a String implementing the [URL Standard](http://url.spec.whatwg.org/) */ + Url: any; +}; + +/** + * An authentication records when a user enter their credential in a browser + * session. + */ +export type Authentication = CreationEvent & Node & { + __typename?: 'Authentication'; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** ID of the object. */ + id: Scalars['ID']; +}; + +/** A browser session represents a logged in user in a browser. */ +export type BrowserSession = CreationEvent & Node & { + __typename?: 'BrowserSession'; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** ID of the object. */ + id: Scalars['ID']; + /** The most recent authentication of this session. */ + lastAuthentication?: Maybe; + /** The user logged in this session. */ + user: User; +}; + +export type BrowserSessionConnection = { + __typename?: 'BrowserSessionConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type BrowserSessionEdge = { + __typename?: 'BrowserSessionEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']; + /** The item at the end of the edge */ + node: BrowserSession; +}; + +/** + * A compat session represents a client session which used the legacy Matrix + * login API. + */ +export type CompatSession = CreationEvent & Node & { + __typename?: 'CompatSession'; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** The Matrix Device ID of this session. */ + deviceId: Scalars['String']; + /** When the session ended. */ + finishedAt?: Maybe; + /** ID of the object. */ + id: Scalars['ID']; + /** The user authorized for this session. */ + user: User; +}; + +/** + * A compat SSO login represents a login done through the legacy Matrix login + * API, via the `m.login.sso` login method. + */ +export type CompatSsoLogin = Node & { + __typename?: 'CompatSsoLogin'; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** When the client exchanged the login token sent during the redirection. */ + exchangedAt?: Maybe; + /** + * When the login was fulfilled, and the user was redirected back to the + * client. + */ + fulfilledAt?: Maybe; + /** ID of the object. */ + id: Scalars['ID']; + /** The redirect URI used during the login. */ + redirectUri: Scalars['Url']; + /** The compat session which was started by this login. */ + session?: Maybe; +}; + +export type CompatSsoLoginConnection = { + __typename?: 'CompatSsoLoginConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type CompatSsoLoginEdge = { + __typename?: 'CompatSsoLoginEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']; + /** The item at the end of the edge */ + node: CompatSsoLogin; +}; + +/** An object with a creation date. */ +export type CreationEvent = { + /** When the object was created. */ + createdAt: Scalars['DateTime']; +}; + +/** An object with an ID. */ +export type Node = { + /** ID of the object. */ + id: Scalars['ID']; +}; + +/** An OAuth 2.0 client */ +export type Oauth2Client = Node & { + __typename?: 'Oauth2Client'; + /** OAuth 2.0 client ID */ + clientId: Scalars['String']; + /** Client name advertised by the client. */ + clientName?: Maybe; + /** Client URI advertised by the client. */ + clientUri?: Maybe; + /** ID of the object. */ + id: Scalars['ID']; + /** Privacy policy URI advertised by the client. */ + policyUri?: Maybe; + /** List of redirect URIs used for authorization grants by the client. */ + redirectUris: Array; + /** Terms of services URI advertised by the client. */ + tosUri?: Maybe; +}; + +/** + * An OAuth 2.0 session represents a client session which used the OAuth APIs + * to login. + */ +export type Oauth2Session = Node & { + __typename?: 'Oauth2Session'; + /** The browser session which started this OAuth 2.0 session. */ + browserSession: BrowserSession; + /** OAuth 2.0 client used by this session. */ + client: Oauth2Client; + /** ID of the object. */ + id: Scalars['ID']; + /** Scope granted for this session. */ + scope: Scalars['String']; + /** User authorized for this session. */ + user: User; +}; + +export type Oauth2SessionConnection = { + __typename?: 'Oauth2SessionConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type Oauth2SessionEdge = { + __typename?: 'Oauth2SessionEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']; + /** The item at the end of the edge */ + node: Oauth2Session; +}; + +/** Information about pagination in a connection */ +export type PageInfo = { + __typename?: 'PageInfo'; + /** When paginating forwards, the cursor to continue. */ + endCursor?: Maybe; + /** When paginating forwards, are there more items? */ + hasNextPage: Scalars['Boolean']; + /** When paginating backwards, are there more items? */ + hasPreviousPage: Scalars['Boolean']; + /** When paginating backwards, the cursor to continue. */ + startCursor?: Maybe; +}; + +/** The query root of the GraphQL interface. */ +export type RootQuery = { + __typename?: 'RootQuery'; + /** Fetch a browser session by its ID. */ + browserSession?: Maybe; + /** Get the current logged in browser session */ + currentBrowserSession?: Maybe; + /** Get the current logged in user */ + currentUser?: Maybe; + /** Fetches an object given its ID. */ + node?: Maybe; + /** Fetch an OAuth 2.0 client by its ID. */ + oauth2Client?: Maybe; + /** Fetch an upstream OAuth 2.0 link by its ID. */ + upstreamOauth2Link?: Maybe; + /** Fetch an upstream OAuth 2.0 provider by its ID. */ + upstreamOauth2Provider?: Maybe; + /** Get a list of upstream OAuth 2.0 providers. */ + upstreamOauth2Providers: UpstreamOAuth2ProviderConnection; + /** Fetch a user by its ID. */ + user?: Maybe; + /** Fetch a user email by its ID. */ + userEmail?: Maybe; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryBrowserSessionArgs = { + id: Scalars['ID']; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryNodeArgs = { + id: Scalars['ID']; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryOauth2ClientArgs = { + id: Scalars['ID']; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryUpstreamOauth2LinkArgs = { + id: Scalars['ID']; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryUpstreamOauth2ProviderArgs = { + id: Scalars['ID']; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryUpstreamOauth2ProvidersArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryUserArgs = { + id: Scalars['ID']; +}; + + +/** The query root of the GraphQL interface. */ +export type RootQueryUserEmailArgs = { + id: Scalars['ID']; +}; + +export type UpstreamOAuth2Link = CreationEvent & Node & { + __typename?: 'UpstreamOAuth2Link'; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** ID of the object. */ + id: Scalars['ID']; + /** The provider for which this link is. */ + provider: UpstreamOAuth2Provider; + /** Subject used for linking */ + subject: Scalars['String']; + /** The user to which this link is associated. */ + user?: Maybe; +}; + +export type UpstreamOAuth2LinkConnection = { + __typename?: 'UpstreamOAuth2LinkConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type UpstreamOAuth2LinkEdge = { + __typename?: 'UpstreamOAuth2LinkEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']; + /** The item at the end of the edge */ + node: UpstreamOAuth2Link; +}; + +export type UpstreamOAuth2Provider = CreationEvent & Node & { + __typename?: 'UpstreamOAuth2Provider'; + /** Client ID used for this provider. */ + clientId: Scalars['String']; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** ID of the object. */ + id: Scalars['ID']; + /** OpenID Connect issuer URL. */ + issuer: Scalars['String']; +}; + +export type UpstreamOAuth2ProviderConnection = { + __typename?: 'UpstreamOAuth2ProviderConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type UpstreamOAuth2ProviderEdge = { + __typename?: 'UpstreamOAuth2ProviderEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']; + /** The item at the end of the edge */ + node: UpstreamOAuth2Provider; +}; + +/** A user is an individual's account. */ +export type User = Node & { + __typename?: 'User'; + /** Get the list of active browser sessions, chronologically sorted */ + browserSessions: BrowserSessionConnection; + /** Get the list of compatibility SSO logins, chronologically sorted */ + compatSsoLogins: CompatSsoLoginConnection; + /** Get the list of emails, chronologically sorted */ + emails: UserEmailConnection; + /** ID of the object. */ + id: Scalars['ID']; + /** Get the list of OAuth 2.0 sessions, chronologically sorted */ + oauth2Sessions: Oauth2SessionConnection; + /** Primary email address of the user. */ + primaryEmail?: Maybe; + /** Get the list of upstream OAuth 2.0 links */ + upstreamOauth2Links: UpstreamOAuth2LinkConnection; + /** Username chosen by the user. */ + username: Scalars['String']; +}; + + +/** A user is an individual's account. */ +export type UserBrowserSessionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A user is an individual's account. */ +export type UserCompatSsoLoginsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A user is an individual's account. */ +export type UserEmailsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A user is an individual's account. */ +export type UserOauth2SessionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A user is an individual's account. */ +export type UserUpstreamOauth2LinksArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** A user email address */ +export type UserEmail = CreationEvent & Node & { + __typename?: 'UserEmail'; + /** + * When the email address was confirmed. Is `null` if the email was never + * verified by the user. + */ + confirmedAt?: Maybe; + /** When the object was created. */ + createdAt: Scalars['DateTime']; + /** Email address */ + email: Scalars['String']; + /** ID of the object. */ + id: Scalars['ID']; +}; + +export type UserEmailConnection = { + __typename?: 'UserEmailConnection'; + /** A list of edges. */ + edges: Array; + /** A list of nodes. */ + nodes: Array; + /** Information to aid in pagination. */ + pageInfo: PageInfo; + /** Identifies the total count of items in the connection. */ + totalCount: Scalars['Int']; +}; + +/** An edge in a connection. */ +export type UserEmailEdge = { + __typename?: 'UserEmailEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']; + /** The item at the end of the edge */ + node: UserEmail; +}; + +export type BrowserSession_SessionFragment = { __typename?: 'BrowserSession', id: string, createdAt: any, lastAuthentication?: { __typename?: 'Authentication', id: string, createdAt: any } | null } & { ' $fragmentName'?: 'BrowserSession_SessionFragment' }; + +export type BrowserSessionList_UserFragment = { __typename?: 'User', browserSessions: { __typename?: 'BrowserSessionConnection', edges: Array<{ __typename?: 'BrowserSessionEdge', cursor: string, node: ( + { __typename?: 'BrowserSession', id: string } + & { ' $fragmentRefs'?: { 'BrowserSession_SessionFragment': BrowserSession_SessionFragment } } + ) }> } } & { ' $fragmentName'?: 'BrowserSessionList_UserFragment' }; + +export type CompatSsoLogin_LoginFragment = { __typename?: 'CompatSsoLogin', id: string, redirectUri: any, createdAt: any, session?: { __typename?: 'CompatSession', id: string, createdAt: any, deviceId: string, finishedAt?: any | null } | null } & { ' $fragmentName'?: 'CompatSsoLogin_LoginFragment' }; + +export type CompatSsoLoginList_UserFragment = { __typename?: 'User', compatSsoLogins: { __typename?: 'CompatSsoLoginConnection', edges: Array<{ __typename?: 'CompatSsoLoginEdge', node: ( + { __typename?: 'CompatSsoLogin', id: string } + & { ' $fragmentRefs'?: { 'CompatSsoLogin_LoginFragment': CompatSsoLogin_LoginFragment } } + ) }> } } & { ' $fragmentName'?: 'CompatSsoLoginList_UserFragment' }; + +export type OAuth2Session_SessionFragment = { __typename?: 'Oauth2Session', id: string, scope: string, client: { __typename?: 'Oauth2Client', id: string, clientId: string, clientName?: string | null, clientUri?: any | null } } & { ' $fragmentName'?: 'OAuth2Session_SessionFragment' }; + +export type OAuth2SessionList_UserFragment = { __typename?: 'User', oauth2Sessions: { __typename?: 'Oauth2SessionConnection', edges: Array<{ __typename?: 'Oauth2SessionEdge', cursor: string, node: ( + { __typename?: 'Oauth2Session', id: string } + & { ' $fragmentRefs'?: { 'OAuth2Session_SessionFragment': OAuth2Session_SessionFragment } } + ) }> } } & { ' $fragmentName'?: 'OAuth2SessionList_UserFragment' }; + +export type BrowserSessionQueryQueryVariables = Exact<{ + id: Scalars['ID']; +}>; + + +export type BrowserSessionQueryQuery = { __typename?: 'RootQuery', browserSession?: { __typename?: 'BrowserSession', id: string, createdAt: any, lastAuthentication?: { __typename?: 'Authentication', id: string, createdAt: any } | null, user: { __typename?: 'User', id: string, username: string } } | null }; + +export type HomeQueryQueryVariables = Exact<{ + count: Scalars['Int']; + cursor?: InputMaybe; +}>; + + +export type HomeQueryQuery = { __typename?: 'RootQuery', currentBrowserSession?: { __typename?: 'BrowserSession', id: string, user: ( + { __typename?: 'User', id: string, username: string } + & { ' $fragmentRefs'?: { 'CompatSsoLoginList_UserFragment': CompatSsoLoginList_UserFragment;'BrowserSessionList_UserFragment': BrowserSessionList_UserFragment;'OAuth2SessionList_UserFragment': OAuth2SessionList_UserFragment } } + ) } | null }; + +export type OAuth2ClientQueryQueryVariables = Exact<{ + id: Scalars['ID']; +}>; + + +export type OAuth2ClientQueryQuery = { __typename?: 'RootQuery', oauth2Client?: { __typename?: 'Oauth2Client', id: string, clientId: string, clientName?: string | null, clientUri?: any | null, tosUri?: any | null, policyUri?: any | null, redirectUris: Array } | null }; + +export const BrowserSession_SessionFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BrowserSession_session"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BrowserSession"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastAuthentication"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]}}]} as unknown as DocumentNode; +export const BrowserSessionList_UserFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BrowserSessionList_user"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"browserSessions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"count"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"BrowserSession_session"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BrowserSession_session"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BrowserSession"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastAuthentication"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]}}]} as unknown as DocumentNode; +export const CompatSsoLogin_LoginFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CompatSsoLogin_login"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CompatSsoLogin"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"redirectUri"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"session"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"deviceId"}},{"kind":"Field","name":{"kind":"Name","value":"finishedAt"}}]}}]}}]} as unknown as DocumentNode; +export const CompatSsoLoginList_UserFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CompatSsoLoginList_user"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"compatSsoLogins"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"count"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CompatSsoLogin_login"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CompatSsoLogin_login"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CompatSsoLogin"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"redirectUri"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"session"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"deviceId"}},{"kind":"Field","name":{"kind":"Name","value":"finishedAt"}}]}}]}}]} as unknown as DocumentNode; +export const OAuth2Session_SessionFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"OAuth2Session_session"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Oauth2Session"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"scope"}},{"kind":"Field","name":{"kind":"Name","value":"client"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"clientId"}},{"kind":"Field","name":{"kind":"Name","value":"clientName"}},{"kind":"Field","name":{"kind":"Name","value":"clientUri"}}]}}]}}]} as unknown as DocumentNode; +export const OAuth2SessionList_UserFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"OAuth2SessionList_user"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"oauth2Sessions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"count"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"OAuth2Session_session"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"OAuth2Session_session"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Oauth2Session"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"scope"}},{"kind":"Field","name":{"kind":"Name","value":"client"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"clientId"}},{"kind":"Field","name":{"kind":"Name","value":"clientName"}},{"kind":"Field","name":{"kind":"Name","value":"clientUri"}}]}}]}}]} as unknown as DocumentNode; +export const BrowserSessionQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"BrowserSessionQuery"},"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","name":{"kind":"Name","value":"browserSession"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastAuthentication"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}}]}}]}}]}}]} as unknown as DocumentNode; +export const HomeQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"HomeQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"count"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentBrowserSession"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"username"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CompatSsoLoginList_user"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"BrowserSessionList_user"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"OAuth2SessionList_user"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CompatSsoLogin_login"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CompatSsoLogin"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"redirectUri"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"session"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"deviceId"}},{"kind":"Field","name":{"kind":"Name","value":"finishedAt"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BrowserSession_session"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BrowserSession"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"lastAuthentication"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"OAuth2Session_session"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Oauth2Session"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"scope"}},{"kind":"Field","name":{"kind":"Name","value":"client"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"clientId"}},{"kind":"Field","name":{"kind":"Name","value":"clientName"}},{"kind":"Field","name":{"kind":"Name","value":"clientUri"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CompatSsoLoginList_user"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"compatSsoLogins"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"count"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CompatSsoLogin_login"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BrowserSessionList_user"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"browserSessions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"count"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"BrowserSession_session"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"OAuth2SessionList_user"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"oauth2Sessions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"count"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"OAuth2Session_session"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const OAuth2ClientQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"OAuth2ClientQuery"},"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","name":{"kind":"Name","value":"oauth2Client"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"clientId"}},{"kind":"Field","name":{"kind":"Name","value":"clientName"}},{"kind":"Field","name":{"kind":"Name","value":"clientUri"}},{"kind":"Field","name":{"kind":"Name","value":"tosUri"}},{"kind":"Field","name":{"kind":"Name","value":"policyUri"}},{"kind":"Field","name":{"kind":"Name","value":"redirectUris"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/frontend/src/gql/index.ts b/frontend/src/gql/index.ts new file mode 100644 index 00000000..0ea4a91c --- /dev/null +++ b/frontend/src/gql/index.ts @@ -0,0 +1,2 @@ +export * from "./fragment-masking"; +export * from "./gql"; diff --git a/frontend/src/graphql.ts b/frontend/src/graphql.ts new file mode 100644 index 00000000..4606c674 --- /dev/null +++ b/frontend/src/graphql.ts @@ -0,0 +1,25 @@ +// Copyright 2023 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { + createClient, + dedupExchange, + cacheExchange, + fetchExchange, +} from "@urql/core"; + +export const client = createClient({ + url: "/graphql", + exchanges: [dedupExchange, cacheExchange, fetchExchange], +}); diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index a1e3c8ec..d1445a97 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -14,18 +14,20 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import { RelayEnvironmentProvider } from "react-relay"; +import { Provider } from "jotai"; import LoadingScreen from "./components/LoadingScreen"; -import RelayEnvironment from "./RelayEnvironment"; import Router from "./Router"; +import { HydrateAtoms } from "./atoms"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - }> - - - + + + }> + + + + ); diff --git a/frontend/src/pages/BrowserSession.tsx b/frontend/src/pages/BrowserSession.tsx index e9535964..106eca21 100644 --- a/frontend/src/pages/BrowserSession.tsx +++ b/frontend/src/pages/BrowserSession.tsx @@ -12,35 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { graphql, useLazyLoadQuery } from "react-relay"; -import { useParams } from "react-router-dom"; +import { useAtomValue } from "jotai"; +import { atomsWithQuery } from "jotai-urql"; +import { useMemo } from "react"; +import { graphql } from "../gql"; -import type { BrowserSessionQuery } from "./__generated__/BrowserSessionQuery.graphql"; - -const BrowserSession: React.FC = () => { - const { id } = useParams(); - if (!id) { - throw new Error("Missing parameter"); - } - - const data = useLazyLoadQuery( - graphql` - query BrowserSessionQuery($id: ID!) { - browserSession(id: $id) { - id - createdAt - lastAuthentication { - id - createdAt - } - user { - id - username - } - } +const QUERY = graphql(/* GraphQL */ ` + query BrowserSessionQuery($id: ID!) { + browserSession(id: $id) { + id + createdAt + lastAuthentication { + id + createdAt } - `, - { id } + user { + id + username + } + } + } +`); + +const BrowserSession: React.FC<{ id: string }> = ({ id }) => { + const data = useAtomValue( + useMemo(() => atomsWithQuery(QUERY, () => ({ id })), [id])[0] ); return ( diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 08c85cb1..c687d10e 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -12,33 +12,35 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { graphql, useLazyLoadQuery } from "react-relay"; -import BrowserSessionList from "../components/BrowserSessionList"; +import { useAtomValue } from "jotai"; +import { atomsWithQuery } from "jotai-urql"; +import BrowserSessionList from "../components/BrowserSessionList"; import CompatSsoLoginList from "../components/CompatSsoLoginList"; import OAuth2SessionList from "../components/OAuth2SessionList"; import Typography from "../components/Typography"; -import type { HomeQuery } from "./__generated__/HomeQuery.graphql"; +import { graphql } from "../gql"; + +const QUERY = graphql(/* GraphQL */ ` + query HomeQuery($count: Int!, $cursor: String) { + currentBrowserSession { + id + user { + id + username + + ...CompatSsoLoginList_user + ...BrowserSessionList_user + ...OAuth2SessionList_user + } + } + } +`); + +const [homeDataAtom] = atomsWithQuery(QUERY, () => ({ count: 10 })); const Home: React.FC = () => { - const data = useLazyLoadQuery( - graphql` - query HomeQuery($count: Int!, $cursor: String) { - currentBrowserSession { - id - user { - id - username - - ...CompatSsoLoginList_user - ...BrowserSessionList_user - ...OAuth2SessionList_user - } - } - } - `, - { count: 2 } - ); + const data = useAtomValue(homeDataAtom); if (data.currentBrowserSession) { const session = data.currentBrowserSession; diff --git a/frontend/src/pages/OAuth2Client.tsx b/frontend/src/pages/OAuth2Client.tsx index d353b4d2..6e4483a8 100644 --- a/frontend/src/pages/OAuth2Client.tsx +++ b/frontend/src/pages/OAuth2Client.tsx @@ -12,32 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { graphql, useLazyLoadQuery } from "react-relay"; -import { useParams } from "react-router-dom"; +import { useAtomValue } from "jotai"; +import { useMemo } from "react"; +import { atomsWithQuery } from "jotai-urql"; +import { graphql } from "../gql"; -import type { OAuth2ClientQuery } from "./__generated__/OAuth2ClientQuery.graphql"; - -const OAuth2Client: React.FC = () => { - const { id } = useParams(); - if (!id) { - throw new Error("Missing parameter"); +const QUERY = graphql(/* GraphQL */ ` + query OAuth2ClientQuery($id: ID!) { + oauth2Client(id: $id) { + id + clientId + clientName + clientUri + tosUri + policyUri + redirectUris + } } +`); - const data = useLazyLoadQuery( - graphql` - query OAuth2ClientQuery($id: ID!) { - oauth2Client(id: $id) { - id - clientId - clientName - clientUri - tosUri - policyUri - redirectUris - } - } - `, - { id } +const OAuth2Client: React.FC<{ id: string }> = ({ id }) => { + const data = useAtomValue( + useMemo(() => atomsWithQuery(QUERY, () => ({ id })), [id])[0] ); return ( diff --git a/frontend/src/pages/__generated__/BrowserSessionQuery.graphql.ts b/frontend/src/pages/__generated__/BrowserSessionQuery.graphql.ts deleted file mode 100644 index dc06d026..00000000 --- a/frontend/src/pages/__generated__/BrowserSessionQuery.graphql.ts +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -export type BrowserSessionQuery$variables = { - id: string; -}; -export type BrowserSessionQuery$data = { - readonly browserSession: { - readonly createdAt: any; - readonly id: string; - readonly lastAuthentication: { - readonly createdAt: any; - readonly id: string; - } | null; - readonly user: { - readonly id: string; - readonly username: string; - }; - } | null; -}; -export type BrowserSessionQuery = { - response: BrowserSessionQuery$data; - variables: BrowserSessionQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "id" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null -}, -v3 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "id", - "variableName": "id" - } - ], - "concreteType": "BrowserSession", - "kind": "LinkedField", - "name": "browserSession", - "plural": false, - "selections": [ - (v1/*: any*/), - (v2/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Authentication", - "kind": "LinkedField", - "name": "lastAuthentication", - "plural": false, - "selections": [ - (v1/*: any*/), - (v2/*: any*/) - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "User", - "kind": "LinkedField", - "name": "user", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "username", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "BrowserSessionQuery", - "selections": (v3/*: any*/), - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "BrowserSessionQuery", - "selections": (v3/*: any*/) - }, - "params": { - "cacheID": "5374afccfa4da28a64cdce6585ac1907", - "id": null, - "metadata": {}, - "name": "BrowserSessionQuery", - "operationKind": "query", - "text": "query BrowserSessionQuery(\n $id: ID!\n) {\n browserSession(id: $id) {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n user {\n id\n username\n }\n }\n}\n" - } -}; -})(); - -(node as any).hash = "c73293a99a0214448861bed340594304"; - -export default node; diff --git a/frontend/src/pages/__generated__/HomeQuery.graphql.ts b/frontend/src/pages/__generated__/HomeQuery.graphql.ts deleted file mode 100644 index e9a07024..00000000 --- a/frontend/src/pages/__generated__/HomeQuery.graphql.ts +++ /dev/null @@ -1,441 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type HomeQuery$variables = { - count: number; - cursor?: string | null; -}; -export type HomeQuery$data = { - readonly currentBrowserSession: { - readonly id: string; - readonly user: { - readonly id: string; - readonly username: string; - readonly " $fragmentSpreads": FragmentRefs<"BrowserSessionList_user" | "CompatSsoLoginList_user" | "OAuth2SessionList_user">; - }; - } | null; -}; -export type HomeQuery = { - response: HomeQuery$data; - variables: HomeQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "count" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "cursor" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "username", - "storageKey": null -}, -v3 = [ - { - "kind": "Variable", - "name": "after", - "variableName": "cursor" - }, - { - "kind": "Variable", - "name": "first", - "variableName": "count" - } -], -v4 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null -}, -v5 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__typename", - "storageKey": null -}, -v6 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null -}, -v7 = { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - } - ], - "storageKey": null -}; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "HomeQuery", - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "BrowserSession", - "kind": "LinkedField", - "name": "currentBrowserSession", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "User", - "kind": "LinkedField", - "name": "user", - "plural": false, - "selections": [ - (v1/*: any*/), - (v2/*: any*/), - { - "args": null, - "kind": "FragmentSpread", - "name": "CompatSsoLoginList_user" - }, - { - "args": null, - "kind": "FragmentSpread", - "name": "BrowserSessionList_user" - }, - { - "args": null, - "kind": "FragmentSpread", - "name": "OAuth2SessionList_user" - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "HomeQuery", - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "BrowserSession", - "kind": "LinkedField", - "name": "currentBrowserSession", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "User", - "kind": "LinkedField", - "name": "user", - "plural": false, - "selections": [ - (v1/*: any*/), - (v2/*: any*/), - { - "alias": null, - "args": (v3/*: any*/), - "concreteType": "CompatSsoLoginConnection", - "kind": "LinkedField", - "name": "compatSsoLogins", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "CompatSsoLoginEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "CompatSsoLogin", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "redirectUri", - "storageKey": null - }, - (v4/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "CompatSession", - "kind": "LinkedField", - "name": "session", - "plural": false, - "selections": [ - (v1/*: any*/), - (v4/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "deviceId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "finishedAt", - "storageKey": null - } - ], - "storageKey": null - }, - (v5/*: any*/) - ], - "storageKey": null - }, - (v6/*: any*/) - ], - "storageKey": null - }, - (v7/*: any*/) - ], - "storageKey": null - }, - { - "alias": null, - "args": (v3/*: any*/), - "filters": null, - "handle": "connection", - "key": "CompatSsoLoginList_user_compatSsoLogins", - "kind": "LinkedHandle", - "name": "compatSsoLogins" - }, - { - "alias": null, - "args": (v3/*: any*/), - "concreteType": "BrowserSessionConnection", - "kind": "LinkedField", - "name": "browserSessions", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "BrowserSessionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - (v6/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "BrowserSession", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v1/*: any*/), - (v4/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Authentication", - "kind": "LinkedField", - "name": "lastAuthentication", - "plural": false, - "selections": [ - (v1/*: any*/), - (v4/*: any*/) - ], - "storageKey": null - }, - (v5/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - }, - (v7/*: any*/) - ], - "storageKey": null - }, - { - "alias": null, - "args": (v3/*: any*/), - "filters": null, - "handle": "connection", - "key": "BrowserSessionList_user_browserSessions", - "kind": "LinkedHandle", - "name": "browserSessions" - }, - { - "alias": null, - "args": (v3/*: any*/), - "concreteType": "Oauth2SessionConnection", - "kind": "LinkedField", - "name": "oauth2Sessions", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Oauth2SessionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - (v6/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Oauth2Session", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "scope", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Oauth2Client", - "kind": "LinkedField", - "name": "client", - "plural": false, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientUri", - "storageKey": null - } - ], - "storageKey": null - }, - (v5/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - }, - (v7/*: any*/) - ], - "storageKey": null - }, - { - "alias": null, - "args": (v3/*: any*/), - "filters": null, - "handle": "connection", - "key": "OAuth2SessionList_user_oauth2Sessions", - "kind": "LinkedHandle", - "name": "oauth2Sessions" - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ] - }, - "params": { - "cacheID": "c2c8afebb1acbce26f8d164d911c5833", - "id": null, - "metadata": {}, - "name": "HomeQuery", - "operationKind": "query", - "text": "query HomeQuery(\n $count: Int!\n $cursor: String\n) {\n currentBrowserSession {\n id\n user {\n id\n username\n ...CompatSsoLoginList_user\n ...BrowserSessionList_user\n ...OAuth2SessionList_user\n }\n }\n}\n\nfragment BrowserSessionList_user on User {\n browserSessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...BrowserSession_session\n __typename\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment BrowserSession_session on BrowserSession {\n id\n createdAt\n lastAuthentication {\n id\n createdAt\n }\n}\n\nfragment CompatSsoLoginList_user on User {\n compatSsoLogins(first: $count, after: $cursor) {\n edges {\n node {\n id\n ...CompatSsoLogin_login\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment CompatSsoLogin_login on CompatSsoLogin {\n id\n redirectUri\n createdAt\n session {\n id\n createdAt\n deviceId\n finishedAt\n }\n}\n\nfragment OAuth2SessionList_user on User {\n oauth2Sessions(first: $count, after: $cursor) {\n edges {\n cursor\n node {\n id\n ...OAuth2Session_session\n __typename\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment OAuth2Session_session on Oauth2Session {\n id\n scope\n client {\n id\n clientId\n clientName\n clientUri\n }\n}\n" - } -}; -})(); - -(node as any).hash = "f26e9c3756edccc8584de5f359fd96bd"; - -export default node; diff --git a/frontend/src/pages/__generated__/OAuth2ClientQuery.graphql.ts b/frontend/src/pages/__generated__/OAuth2ClientQuery.graphql.ts deleted file mode 100644 index ad9bcca3..00000000 --- a/frontend/src/pages/__generated__/OAuth2ClientQuery.graphql.ts +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest, Query } from 'relay-runtime'; -export type OAuth2ClientQuery$variables = { - id: string; -}; -export type OAuth2ClientQuery$data = { - readonly oauth2Client: { - readonly clientId: string; - readonly clientName: string | null; - readonly clientUri: any | null; - readonly id: string; - readonly policyUri: any | null; - readonly redirectUris: ReadonlyArray; - readonly tosUri: any | null; - } | null; -}; -export type OAuth2ClientQuery = { - response: OAuth2ClientQuery$data; - variables: OAuth2ClientQuery$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "id" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "id", - "variableName": "id" - } - ], - "concreteType": "Oauth2Client", - "kind": "LinkedField", - "name": "oauth2Client", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientId", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "clientUri", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "tosUri", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "policyUri", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "redirectUris", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "OAuth2ClientQuery", - "selections": (v1/*: any*/), - "type": "RootQuery", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "OAuth2ClientQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "49e24d5c368a8c2c148643b971fe179c", - "id": null, - "metadata": {}, - "name": "OAuth2ClientQuery", - "operationKind": "query", - "text": "query OAuth2ClientQuery(\n $id: ID!\n) {\n oauth2Client(id: $id) {\n id\n clientId\n clientName\n clientUri\n tosUri\n policyUri\n redirectUris\n }\n}\n" - } -}; -})(); - -(node as any).hash = "31b4804eb435b5822480ff57775d13a4"; - -export default node; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 5a19c0eb..ffc003bb 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -16,7 +16,7 @@ import { defineConfig } from "vite"; import eslint from "vite-plugin-eslint"; import react from "@vitejs/plugin-react"; -import relay from "vite-plugin-relay-lite"; +import codegen from "vite-plugin-graphql-codegen"; export default defineConfig({ base: "/app/", @@ -26,12 +26,12 @@ export default defineConfig({ sourcemap: true, }, plugins: [ + codegen(), react(), eslint({ // Explicitly set the config file, else storybook gets confused overrideConfigFile: "./.eslintrc.cjs", }), - relay(), ], server: { proxy: { @@ -44,7 +44,7 @@ export default defineConfig({ coverage: { provider: "c8", src: ["./src/"], - exclude: ["**/__generated__/**", "**/*.d.ts", "**/*.stories.*"], + exclude: ["**/gql/**", "**/*.d.ts", "**/*.stories.*"], all: true, }, },