diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..37ef122c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.graphql.ts auto eol=lf diff --git a/package.json b/package.json index 87f362f1..33d0a515 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "tgstation-server-webpanel", "private": true, "version": "7.0.0", + "tgs_api_version": "10.10.0", "homepage": "https://tgstation.github.io/tgstation-server-webpanel", "repository": { "type": "git", @@ -24,12 +25,13 @@ "scripts": { "dev": "concurrently --kill-others \"npm:dev-server\" \"npm:storybook\"", "dev-server": "vite", - "build": "tsc -b && vite build", + "build": "relay-compiler --validate && tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", - "chromatic": "npx chromatic" + "chromatic": "npx chromatic", + "relay": "relay-compiler" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.6.0", @@ -45,10 +47,14 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "concurrently": "^9.0.1", + "graphql": "15.x", + "graphql-sse": "^2.5.3", "lucide-react": "^0.446.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-intl": "^6.7.0", + "react-relay": "^18.0.0", + "relay-runtime": "^18.0.0", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7" }, @@ -66,8 +72,11 @@ "@types/node": "^22.7.3", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/react-relay": "^16.0.6", + "@types/relay-runtime": "^17.0.4", "@vitejs/plugin-react": "^4.3.1", "autoprefixer": "^10.4.20", + "babel-plugin-relay": "^18.0.0", "chromatic": "^11.10.4", "eslint": "^9.9.0", "eslint-plugin-react-hooks": "^5.1.0-rc.0", @@ -75,11 +84,13 @@ "eslint-plugin-storybook": "^0.9.0", "globals": "^15.9.0", "postcss": "^8.4.47", + "relay-compiler": "^18.0.0", "storybook": "^8.3.4", "tailwindcss": "^3.4.13", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^5.4.1" + "vite": "^5.4.1", + "vite-plugin-relay": "^2.1.0" }, "packageManager": "yarn@4.3.1", "eslintConfig": { diff --git a/relay.config.json b/relay.config.json new file mode 100644 index 00000000..c55386e4 --- /dev/null +++ b/relay.config.json @@ -0,0 +1,11 @@ +{ + "src": "./src", + "language": "typescript", + "schema": "./src/schema.graphql", + "exclude": [ + "**/node_modules/**", + "**/__mocks__/**", + "**/__generated__/**" + ], + "eagerEsModules": true +} \ No newline at end of file diff --git a/src/RelayEnvironment.ts b/src/RelayEnvironment.ts new file mode 100644 index 00000000..2a193869 --- /dev/null +++ b/src/RelayEnvironment.ts @@ -0,0 +1,92 @@ +import Pkg from "./../package.json"; + +import { + Environment, + Network, + RecordSource, + Store, + Observable, + FetchFunction, + SubscribeFunction, + GraphQLResponse, +} from "relay-runtime"; +import { createClient, Sink } from "graphql-sse"; +import { ExecutionResult } from "graphql"; + +const CreateRelayEnvironment = ( + serverUrl: string, + bearerProvider: () => string | null +) => { + const graphQLEndpoint = `${serverUrl}/api/graphql`; + + const createAuthHeader = () => { + const bearer = bearerProvider(); + return bearer ? `Bearer ${bearer}` : ""; + }; + + const fetchFn: FetchFunction = async (request, variables) => { + const resp = await fetch(graphQLEndpoint, { + method: "POST", + headers: { + Accept: "application/graphql-response+json; charset=utf-8, application/json; charset=utf-8", + "Content-Type": "application/json", + Api: `Tgstation.Server.Api/${Pkg.tgs_api_version}`, + Authorization: + request.name === "Login" ? "" : createAuthHeader(), // login should always be unauthed + }, + body: JSON.stringify({ + query: request.text, // <-- The GraphQL document composed by Relay + variables, + }), + }); + + return await resp.json(); + }; + + // We only want to setup subscriptions if we are on the client. + const subscriptionsClient = createClient({ + url: graphQLEndpoint, + headers: (): Record => { + return { + Api: `Tgstation.Server.Api/${Pkg.tgs_api_version}`, + Authorization: createAuthHeader(), + }; + }, + }); + + const subscribeFn: SubscribeFunction = (operation, variables) => { + const gqlSseRelaySinkAdapter = ( + relaySink: Sink + ): Sink> => { + return { + error: (error: unknown) => relaySink.error(error), + complete: () => relaySink.complete(), + next: (value: ExecutionResult) => { + throw new Error("TODO"); + }, + }; + }; + + return Observable.create((sink) => { + if (!operation.text) { + return sink.error(new Error("Operation text cannot be empty")); + } + return subscriptionsClient.subscribe( + { + operationName: operation.name, + query: operation.text, + variables, + }, + gqlSseRelaySinkAdapter(sink) + ); + }); + }; + + console.log("Creating relay environment..."); + return new Environment({ + network: Network.create(fetchFn, subscribeFn), + store: new Store(new RecordSource()), + }); +}; + +export default CreateRelayEnvironment; diff --git a/src/components/core/Meta/Meta.tsx b/src/components/core/Meta/Meta.tsx index 5875ef3c..3769caaa 100644 --- a/src/components/core/Meta/Meta.tsx +++ b/src/components/core/Meta/Meta.tsx @@ -2,7 +2,10 @@ import Loading from "@/components/utils/Loading/Loading"; import { useIntl } from "react-intl"; import Pkg from "../../../../package.json"; -import { useEffect } from "react"; +import { useContext, useEffect, useState } from "react"; +import { RelayEnvironmentProvider } from "react-relay"; +import CreateRelayEnvironment from "@/RelayEnvironment"; +import ConfigContext from "@/context/config/Context"; const Layout = () => { const version = Pkg.version; @@ -12,9 +15,16 @@ const Layout = () => { useEffect(() => { document.title = intl.formatMessage({ id: "title" }, { version }); }); + + const config = useContext(ConfigContext); + + const [relayEnviroment] = useState(CreateRelayEnvironment(config.ApiPath)); + return ( <> - + + + ); }; diff --git a/src/schema.graphql b/src/schema.graphql new file mode 100644 index 00000000..d139106f --- /dev/null +++ b/src/schema.graphql @@ -0,0 +1,4 @@ +# Replace this with your own GraphQL schema file! +type Query { + field: String +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 886aed51..f39dfd33 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,13 +1,14 @@ -import path from "path" -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import relay from "vite-plugin-relay"; +import path from "path"; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [relay, react()], resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, }, -}) +}); diff --git a/yarn.lock b/yarn.lock index f3719623..44298468 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,7 +29,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.24.7": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" dependencies: @@ -46,7 +46,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.18.9, @babel/core@npm:^7.24.5": +"@babel/core@npm:^7.18.9, @babel/core@npm:^7.23.5, @babel/core@npm:^7.24.5": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -211,7 +211,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.8": +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.7.2": version: 7.25.6 resolution: "@babel/runtime@npm:7.25.6" dependencies: @@ -2403,6 +2403,13 @@ __metadata: languageName: node linkType: hard +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 + languageName: node + linkType: hard + "@types/prop-types@npm:*": version: 15.7.13 resolution: "@types/prop-types@npm:15.7.13" @@ -2433,6 +2440,16 @@ __metadata: languageName: node linkType: hard +"@types/react-relay@npm:^16.0.6": + version: 16.0.6 + resolution: "@types/react-relay@npm:16.0.6" + dependencies: + "@types/react": "npm:*" + "@types/relay-runtime": "npm:*" + checksum: 10c0/91a7b2e3e95610dc5ba4a994e847dd250cb6b95c5757a15662d36ab601abaddef970dd09f104333c43416b5ef0901101b55d0507fd999af60873ed849c4e9d76 + languageName: node + linkType: hard + "@types/react@npm:*, @types/react@npm:^18.3.3": version: 18.3.8 resolution: "@types/react@npm:18.3.8" @@ -2453,6 +2470,13 @@ __metadata: languageName: node linkType: hard +"@types/relay-runtime@npm:*, @types/relay-runtime@npm:^17.0.4": + version: 17.0.4 + resolution: "@types/relay-runtime@npm:17.0.4" + checksum: 10c0/d784d49413d4e9da90274bcf8949d8f522e94f4663569c4eb915ccd69581f5035114b27d17ccd347243aa97315774b30c127c8c0692860a116293ecf2376430a + languageName: node + linkType: hard + "@types/resolve@npm:^1.20.2": version: 1.20.6 resolution: "@types/resolve@npm:1.20.6" @@ -2917,6 +2941,15 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -2963,6 +2996,13 @@ __metadata: languageName: node linkType: hard +"asap@npm:~2.0.3": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + "assertion-error@npm:^2.0.1": version: 2.0.1 resolution: "assertion-error@npm:2.0.1" @@ -3006,6 +3046,28 @@ __metadata: languageName: node linkType: hard +"babel-plugin-macros@npm:^2.0.0": + version: 2.8.0 + resolution: "babel-plugin-macros@npm:2.8.0" + dependencies: + "@babel/runtime": "npm:^7.7.2" + cosmiconfig: "npm:^6.0.0" + resolve: "npm:^1.12.0" + checksum: 10c0/9a101e2844a800e65662b2a8d0758bdbbe500ae02d68ef6f3466ead7eaa1350e3872b97014b20bf6f3a1a46b3c9613dfac7578af6f6ae6d4eccbd68ad7b6f228 + languageName: node + linkType: hard + +"babel-plugin-relay@npm:^18.0.0": + version: 18.0.0 + resolution: "babel-plugin-relay@npm:18.0.0" + dependencies: + babel-plugin-macros: "npm:^2.0.0" + cosmiconfig: "npm:^5.0.5" + graphql: "npm:15.3.0" + checksum: 10c0/d514165007a403bd72a3ed75730465cc13da162ac8a83ff8f8b18f8206aad2a149e1b49fec5d7dca3297906ad632451e2be89c317c0e05aff00881221c93cfca + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -3152,6 +3214,31 @@ __metadata: languageName: node linkType: hard +"caller-callsite@npm:^2.0.0": + version: 2.0.0 + resolution: "caller-callsite@npm:2.0.0" + dependencies: + callsites: "npm:^2.0.0" + checksum: 10c0/a00ca91280e10ee2321de21dda6c168e427df7a63aeaca027ea45e3e466ac5e1a5054199f6547ba1d5a513d3b6b5933457266daaa47f8857fb532a343ee6b5e1 + languageName: node + linkType: hard + +"caller-path@npm:^2.0.0": + version: 2.0.0 + resolution: "caller-path@npm:2.0.0" + dependencies: + caller-callsite: "npm:^2.0.0" + checksum: 10c0/029b5b2c557d831216305c3218e9ff30fa668be31d58dd08088f74c8eabc8362c303e0908b3a93abb25ba10e3a5bfc9cff5eb7fab6ab9cf820e3b160ccb67581 + languageName: node + linkType: hard + +"callsites@npm:^2.0.0": + version: 2.0.0 + resolution: "callsites@npm:2.0.0" + checksum: 10c0/13bff4fee946e6020b37e76284e95e24aa239c9e34ac4f3451e4c5330fca6f2f962e1d1ab69e4da7940e1fce135107a2b2b98c01d62ea33144350fc89dc5494e + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -3425,6 +3512,40 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^5.0.5": + version: 5.2.1 + resolution: "cosmiconfig@npm:5.2.1" + dependencies: + import-fresh: "npm:^2.0.0" + is-directory: "npm:^0.3.1" + js-yaml: "npm:^3.13.1" + parse-json: "npm:^4.0.0" + checksum: 10c0/ae9ba309cdbb42d0c9d63dad5c1dfa1c56bb8f818cb8633eea14fd2dbdc9f33393b77658ba96fdabda497bc943afed8c3371d1222afe613c518ba676fa624645 + languageName: node + linkType: hard + +"cosmiconfig@npm:^6.0.0": + version: 6.0.0 + resolution: "cosmiconfig@npm:6.0.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.1.0" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.7.2" + checksum: 10c0/666ed8732d0bf7d7fe6f8516c8ee6041e0622032e8fa26201577b883d2767ad105d03f38b34b93d1f02f26b22a89e7bab4443b9d2e7f931f48d0e944ffa038b5 + languageName: node + linkType: hard + +"cross-fetch@npm:^3.1.5": + version: 3.1.8 + resolution: "cross-fetch@npm:3.1.8" + dependencies: + node-fetch: "npm:^2.6.12" + checksum: 10c0/4c5e022ffe6abdf380faa6e2373c0c4ed7ef75e105c95c972b6f627c3f083170b6886f19fb488a7fa93971f4f69dcc890f122b0d97f0bf5f41ca1d9a8f58c8af + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -3665,6 +3786,15 @@ __metadata: languageName: node linkType: hard +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0": version: 1.0.0 resolution: "es-define-property@npm:1.0.0" @@ -4034,7 +4164,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.1, esprima@npm:~4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -4195,6 +4325,28 @@ __metadata: languageName: node linkType: hard +"fbjs-css-vars@npm:^1.0.0": + version: 1.0.2 + resolution: "fbjs-css-vars@npm:1.0.2" + checksum: 10c0/dfb64116b125a64abecca9e31477b5edb9a2332c5ffe74326fe36e0a72eef7fc8a49b86adf36c2c293078d79f4524f35e80f5e62546395f53fb7c9e69821f54f + languageName: node + linkType: hard + +"fbjs@npm:^3.0.2": + version: 3.0.5 + resolution: "fbjs@npm:3.0.5" + dependencies: + cross-fetch: "npm:^3.1.5" + fbjs-css-vars: "npm:^1.0.0" + loose-envify: "npm:^1.0.0" + object-assign: "npm:^4.1.0" + promise: "npm:^7.1.1" + setimmediate: "npm:^1.0.5" + ua-parser-js: "npm:^1.0.35" + checksum: 10c0/66d0a2fc9a774f9066e35ac2ac4bf1245931d27f3ac287c7d47e6aa1fc152b243c2109743eb8f65341e025621fb51a12038fadb9fd8fda2e3ddae04ebab06f91 + languageName: node + linkType: hard + "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -4550,6 +4702,29 @@ __metadata: languageName: node linkType: hard +"graphql-sse@npm:^2.5.3": + version: 2.5.3 + resolution: "graphql-sse@npm:2.5.3" + peerDependencies: + graphql: ">=0.11 <=16" + checksum: 10c0/b556564aaddd8dfcc4e7fd25da37cfe95dbf5e100fca287b1b15ab6874a772fda96088b66e7d02739076fb769d60279c17afe54d5ab196eeca67972247c6c73e + languageName: node + linkType: hard + +"graphql@npm:15.3.0": + version: 15.3.0 + resolution: "graphql@npm:15.3.0" + checksum: 10c0/b75622aad9aa5436154d5c6b7a082cf3266654d779fb4f7ba3919f1b96626bf89426307e682cb9b88a0427c13cfd0d10ac0e12315719703e431297184fdd67aa + languageName: node + linkType: hard + +"graphql@npm:15.x": + version: 15.9.0 + resolution: "graphql@npm:15.9.0" + checksum: 10c0/0e93f7138daae07dcb0713ce5e2ae7f8039e911b6180f0170c4929664ec32ab8e690a9ea12be2dc4ab18544f9898989765122f30d2d07d38b0ce2a4c839d29bc + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -4713,7 +4888,17 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.2.1": +"import-fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "import-fresh@npm:2.0.0" + dependencies: + caller-path: "npm:^2.0.0" + resolve-from: "npm:^3.0.0" + checksum: 10c0/116c55ee5215a7839062285b60df85dbedde084c02111dc58c1b9d03ff7876627059f4beb16cdc090a3db21fea9022003402aa782139dc8d6302589038030504 + languageName: node + linkType: hard + +"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -4809,6 +4994,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -4834,6 +5026,13 @@ __metadata: languageName: node linkType: hard +"is-directory@npm:^0.3.1": + version: 0.3.1 + resolution: "is-directory@npm:0.3.1" + checksum: 10c0/1c39c7d1753b04e9483b89fb88908b8137ab4743b6f481947e97ccf93ecb384a814c8d3f0b95b082b149c5aa19c3e9e4464e2791d95174bce95998c26bb1974b + languageName: node + linkType: hard + "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -4964,6 +5163,18 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -5005,6 +5216,20 @@ __metadata: languageName: node linkType: hard +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -5475,6 +5700,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.12": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.2.0 resolution: "node-gyp@npm:10.2.0" @@ -5527,7 +5766,14 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"nullthrows@npm:^1.1.1": + version: 1.1.1 + resolution: "nullthrows@npm:1.1.1" + checksum: 10c0/56f34bd7c3dcb3bd23481a277fa22918120459d3e9d95ca72976c72e9cac33a97483f0b95fc420e2eb546b9fe6db398273aba9a938650cdb8c98ee8f159dcb30 + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -5659,6 +5905,28 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -5901,6 +6169,15 @@ __metadata: languageName: node linkType: hard +"promise@npm:^7.1.1": + version: 7.3.1 + resolution: "promise@npm:7.3.1" + dependencies: + asap: "npm:~2.0.3" + checksum: 10c0/742e5c0cc646af1f0746963b8776299701ad561ce2c70b49365d62c8db8ea3681b0a1bf0d4e2fe07910bf72f02d39e51e8e73dc8d7503c3501206ac908be107f + languageName: node + linkType: hard + "prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -6090,6 +6367,21 @@ __metadata: languageName: node linkType: hard +"react-relay@npm:^18.0.0": + version: 18.0.0 + resolution: "react-relay@npm:18.0.0" + dependencies: + "@babel/runtime": "npm:^7.25.0" + fbjs: "npm:^3.0.2" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + relay-runtime: "npm:18.0.0" + peerDependencies: + react: ^16.9.0 || ^17 || ^18 + checksum: 10c0/613bd11f26eceb934a13dbf644ac9a670ee436e8785285611c3670c3ea9b16b37b61a0e12b0703a8fecc19f2d6b57be65e01bba4631f2ec1e81a2a90262ec98d + languageName: node + linkType: hard + "react-remove-scroll-bar@npm:^2.3.4": version: 2.3.6 resolution: "react-remove-scroll-bar@npm:2.3.6" @@ -6226,6 +6518,26 @@ __metadata: languageName: node linkType: hard +"relay-compiler@npm:^18.0.0": + version: 18.0.0 + resolution: "relay-compiler@npm:18.0.0" + bin: + relay-compiler: cli.js + checksum: 10c0/b72bc4eb4b91ebb65850bcb0dc6e9ed281f2a34d64f8eaceac061568f259fbd9b4e3c7e64402b369afa0bae7a2143af3972423c8a4d86c7ddaf7d00ff7ddfedd + languageName: node + linkType: hard + +"relay-runtime@npm:18.0.0, relay-runtime@npm:^18.0.0": + version: 18.0.0 + resolution: "relay-runtime@npm:18.0.0" + dependencies: + "@babel/runtime": "npm:^7.25.0" + fbjs: "npm:^3.0.2" + invariant: "npm:^2.2.4" + checksum: 10c0/5ba3829e1b063961ec6c9e862cf7f6821fa32b584a41f8137d8446ac6e9be74f6bd9d090967e849b18da86341122aa5737b61b5c34f76c7ffda914afdf36ea3f + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -6240,6 +6552,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-from@npm:3.0.0" + checksum: 10c0/24affcf8e81f4c62f0dcabc774afe0e19c1f38e34e43daac0ddb409d79435fc3037f612b0cc129178b8c220442c3babd673e88e870d27215c99454566e770ebc + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -6247,7 +6566,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8": +"resolve@npm:^1.1.7, resolve@npm:^1.12.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -6260,7 +6579,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -6456,6 +6775,13 @@ __metadata: languageName: node linkType: hard +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -6568,6 +6894,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + "ssri@npm:^10.0.0": version: 10.0.6 resolution: "ssri@npm:10.0.6" @@ -6827,8 +7160,11 @@ __metadata: "@types/node": "npm:^22.7.3" "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.3.0" + "@types/react-relay": "npm:^16.0.6" + "@types/relay-runtime": "npm:^17.0.4" "@vitejs/plugin-react": "npm:^4.3.1" autoprefixer: "npm:^10.4.20" + babel-plugin-relay: "npm:^18.0.0" chromatic: "npm:^11.10.4" class-variance-authority: "npm:^0.7.0" clsx: "npm:^2.1.1" @@ -6838,11 +7174,16 @@ __metadata: eslint-plugin-react-refresh: "npm:^0.4.9" eslint-plugin-storybook: "npm:^0.9.0" globals: "npm:^15.9.0" + graphql: "npm:15.x" + graphql-sse: "npm:^2.5.3" lucide-react: "npm:^0.446.0" postcss: "npm:^8.4.47" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-intl: "npm:^6.7.0" + react-relay: "npm:^18.0.0" + relay-compiler: "npm:^18.0.0" + relay-runtime: "npm:^18.0.0" storybook: "npm:^8.3.4" tailwind-merge: "npm:^2.5.2" tailwindcss: "npm:^3.4.13" @@ -6850,6 +7191,7 @@ __metadata: typescript: "npm:^5.5.3" typescript-eslint: "npm:^8.0.1" vite: "npm:^5.4.1" + vite-plugin-relay: "npm:^2.1.0" languageName: unknown linkType: soft @@ -6915,6 +7257,13 @@ __metadata: languageName: node linkType: hard +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -7050,6 +7399,15 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^1.0.35": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 10c0/c6452b0c683000f10975cb0a7e74cb1119ea95d4522ae85f396fa53b0b17884358a24ffdd86a66030c6b2981bdc502109a618c79fdaa217ee9032c9e46fcc78a + languageName: node + linkType: hard + "undici-types@npm:~6.19.2": version: 6.19.8 resolution: "undici-types@npm:6.19.8" @@ -7231,6 +7589,18 @@ __metadata: languageName: node linkType: hard +"vite-plugin-relay@npm:^2.1.0": + version: 2.1.0 + resolution: "vite-plugin-relay@npm:2.1.0" + dependencies: + "@babel/core": "npm:^7.23.5" + peerDependencies: + babel-plugin-relay: ">=14.1.0" + vite: ">=2.0.0" + checksum: 10c0/33022bb9c3387d87dc6e022a4b3a138e9e74b234deb262a48ac3dbd9b9903e9968b54a33ba4ecd8b78abaf1e28335f6471b26376915814b6028a5dfd8f5af0ad + languageName: node + linkType: hard + "vite@npm:^5.4.1": version: 5.4.7 resolution: "vite@npm:5.4.7" @@ -7274,6 +7644,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + "webpack-virtual-modules@npm:^0.6.2": version: 0.6.2 resolution: "webpack-virtual-modules@npm:0.6.2" @@ -7281,6 +7658,16 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.2": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" @@ -7388,6 +7775,13 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^1.7.2": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + "yaml@npm:^2.3.4": version: 2.5.1 resolution: "yaml@npm:2.5.1"