- 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 && loadNext(2)}>Load more }
);
};
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,
},
},