diff --git a/Makefile b/Makefile index 2da4168b..ed35b683 100644 --- a/Makefile +++ b/Makefile @@ -4,3 +4,6 @@ check-code: # 16 is exit code for critical https://classic.yarnpkg.com/lang/en/docs/cli/audit audit: bash -c 'yarn audit --level critical; [[ $$? -ge 16 ]] && exit 1 || exit 0' + +codegen: + yarn codegen \ No newline at end of file diff --git a/README.md b/README.md index 5b4d0e64..1a3da748 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,15 @@ Galoy-Pay uses query, mutation, and subscription operations from the Galoy's gra In the project directory, create a file name `.env.local` and fill it with +``` +NEXT_PUBLIC_GRAPHQL_HOSTNAME='localhost:4002' +NEXT_PUBLIC_GRAPHQL_WEBSOCKET_URL='FIXME' +``` + +for staging, use + ``` NEXT_PUBLIC_GRAPHQL_HOSTNAME='api.staging.galoy.io' -NEXT_PUBLIC_GRAPHQL_HOSTNAME_INTERNAL='api.staging.galoy.io' -NEXT_PUBLIC_GRAPHQL_URI_INTERNAL='api.staging.galoy.io' NEXT_PUBLIC_GRAPHQL_WEBSOCKET_URL='wss://ws.staging.galoy.io/graphql' ``` @@ -28,8 +33,6 @@ yarn install yarn dev ``` -This will run the app in the development mode. - Open [http://localhost:3000](http://localhost:3000) to view it in the browser. The page will automatically reload when you make edits. @@ -65,4 +68,17 @@ yarn build This will build the app for production under a `build` folder. It will bundle React in production mode and optimize the build for the best performance. The build will be minified, and the bundled files will include unique hashes in their names. -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. +## Test lnurlp + +``` +GRAPHQL_HOSTNAME_INTERNAL="api.galoy-staging-galoy.svc.cluster.local" +``` + +or +``` +GRAPHQL_HOSTNAME_INTERNAL="localhost:4002" +``` + +This environment variable is needed for getting the lnurlp endpoint working. + +curl localhost:3000/.well-known/lnurlp/alice diff --git a/app/lnurlp/[username]/route.ts b/app/lnurlp/[username]/route.ts new file mode 100644 index 00000000..9ab15533 --- /dev/null +++ b/app/lnurlp/[username]/route.ts @@ -0,0 +1,223 @@ +import { NextResponse } from "next/server" +import { URL } from "url" + +import crypto from "crypto" +import { + ApolloClient, + ApolloLink, + concat, + gql, + HttpLink, + InMemoryCache, +} from "@apollo/client" +import Redis from "ioredis" + +import { GRAPHQL_URI_INTERNAL, NOSTR_PUBKEY } from "../../../lib/config" +import { + AccountDefaultWalletDocument, + AccountDefaultWalletQuery, + LnInvoiceCreateOnBehalfOfRecipientDocument, + LnInvoiceCreateOnBehalfOfRecipientMutation, +} from "../../../lib/graphql/generated" + +const ipForwardingMiddleware = new ApolloLink((operation, forward) => { + operation.setContext(({ headers = {} }) => ({ + headers: { + ...headers, + "x-real-ip": operation.getContext()["x-real-ip"], + "x-forwarded-for": operation.getContext()["x-forwarded-for"], + }, + })) + + return forward(operation) +}) + +const client = new ApolloClient({ + link: concat( + ipForwardingMiddleware, + new HttpLink({ + uri: GRAPHQL_URI_INTERNAL, + }), + ), + cache: new InMemoryCache(), +}) + +gql` + query accountDefaultWallet($username: Username!, $walletCurrency: WalletCurrency!) { + accountDefaultWallet(username: $username, walletCurrency: $walletCurrency) { + __typename + id + walletCurrency + } + } + + mutation lnInvoiceCreateOnBehalfOfRecipient( + $walletId: WalletId! + $amount: SatAmount! + $descriptionHash: Hex32Bytes! + ) { + mutationData: lnInvoiceCreateOnBehalfOfRecipient( + input: { + recipientWalletId: $walletId + amount: $amount + descriptionHash: $descriptionHash + } + ) { + errors { + message + } + invoice { + paymentRequest + paymentHash + } + } + } +` + +const nostrEnabled = !!NOSTR_PUBKEY + +let redis: Redis | null = null + +if (nostrEnabled) { + const connectionObj = { + sentinelPassword: process.env.REDIS_PASSWORD, + sentinels: [ + { + host: `${process.env.REDIS_0_DNS}`, + port: 26379, + }, + { + host: `${process.env.REDIS_1_DNS}`, + port: 26379, + }, + { + host: `${process.env.REDIS_2_DNS}`, + port: 26379, + }, + ], + name: process.env.REDIS_MASTER_NAME ?? "mymaster", + password: process.env.REDIS_PASSWORD, + } + + redis = new Redis(connectionObj) + + redis.on("error", (err) => console.log({ err }, "Redis error")) +} + +export async function GET( + request: Request, + { params }: { params: { username: string } }, +) { + console.log(NOSTR_PUBKEY) + + const { searchParams, hostname } = new URL(request.url) + + const username = params.username + const amount = searchParams.get("amount") + const nostr = searchParams.get("nostr") + + const accountUsername = username ? username.toString() : "" + + let walletId: string | null = null + + try { + const { data } = await client.query({ + query: AccountDefaultWalletDocument, + variables: { username: accountUsername, walletCurrency: "BTC" }, + context: { + "x-real-ip": request.headers.get("x-real-ip"), + "x-forwarded-for": request.headers.get("x-forwarded-for"), + }, + }) + walletId = data?.accountDefaultWallet?.id + } catch (err: unknown) { + console.log(err) + } + + if (!walletId) { + return NextResponse.json({ + status: "ERROR", + reason: `Couldn't find user '${username}'.`, + }) + } + + const metadata = JSON.stringify([ + ["text/plain", `Payment to ${accountUsername}`], + ["text/identifier", `${accountUsername}@${hostname}`], + ]) + + // lnurl options call + if (!amount) { + return NextResponse.json({ + callback: request.url, + minSendable: 1000, + maxSendable: 100000000000, + metadata, + tag: "payRequest", + ...(nostrEnabled + ? { + allowsNostr: true, + nostrPubkey: NOSTR_PUBKEY, + } + : {}), + }) + } + + // lnurl generate invoice + try { + if (Array.isArray(amount) || Array.isArray(nostr)) { + throw new Error("Invalid request") + } + + const amountSats = Math.round(parseInt(amount, 10) / 1000) + if ((amountSats * 1000).toString() !== amount) { + return NextResponse.json({ + status: "ERROR", + reason: "Millisatoshi amount is not supported, please send a value in full sats.", + }) + } + + let descriptionHash: string + + if (nostrEnabled && nostr) { + descriptionHash = crypto.createHash("sha256").update(nostr).digest("hex") + } else { + descriptionHash = crypto.createHash("sha256").update(metadata).digest("hex") + } + + const result = await client.mutate({ + mutation: LnInvoiceCreateOnBehalfOfRecipientDocument, + variables: { + walletId, + amount: amountSats, + descriptionHash, + }, + }) + + const errors = result.errors + const invoice = result.data?.mutationData?.invoice + + if ((errors && errors.length) || !invoice) { + console.log("error getting invoice", errors) + return NextResponse.json({ + status: "ERROR", + reason: `Failed to get invoice: ${errors ? errors[0].message : "unknown error"}`, + }) + } + + if (nostrEnabled && nostr && redis) { + redis.set(`nostrInvoice:${invoice.paymentHash}`, nostr, "EX", 1440) + } + + return NextResponse.json({ + pr: invoice.paymentRequest, + routes: [], + }) + } catch (err: unknown) { + console.log("unexpected error getting invoice", err) + NextResponse.json({ + status: "ERROR", + reason: err instanceof Error ? err.message : "unexpected error", + }) + } +} diff --git a/codegen.yml b/codegen.yml index 7dfb0a1e..dfbe546c 100644 --- a/codegen.yml +++ b/codegen.yml @@ -1,5 +1,5 @@ overwrite: true -schema: "https://raw.githubusercontent.com/GaloyMoney/galoy/main/src/graphql/main/schema.graphql" +schema: "https://raw.githubusercontent.com/GaloyMoney/galoy/main/src/graphql/public/schema.graphql" documents: - "components/**/*.ts" - "components/**/*.tsx" @@ -11,7 +11,6 @@ documents: - "hooks/**/*.tsx" generates: lib/graphql/generated.ts: - schema: "lib/graphql/local-schema.gql" plugins: - typescript - typescript-operations @@ -26,6 +25,7 @@ generates: immutableTypes: true strictScalars: true nonOptionalTypename: true + federation: true scalars: AccountApiKeyLabel: "string" AuthToken: "string" @@ -53,5 +53,14 @@ generates: DisplayCurrency: "string" SignedDisplayMajorAmount: "string" CountryCode: "string" + EmailRegistrationId: "string" + TotpRegistrationId: "string" + EmailAddress: "string" + TotpSecret: "string" + TotpCode: "string" Feedback: "string" Minutes: "string" + LeaderboardName: "string" + join__FieldSet: "string" + link__Import: "string" + _FieldSet: "string" diff --git a/components/Layouts/AppLayout.tsx b/components/Layouts/AppLayout.tsx index aea0a524..62ea9666 100644 --- a/components/Layouts/AppLayout.tsx +++ b/components/Layouts/AppLayout.tsx @@ -50,18 +50,18 @@ const AppLayout = ({ children, username }: Props) => {
  • {`Ways to pay ${username ?? "user"} `}
  • - + <> Cash Register App - +
  • - + <> Printable Paycode - +
  • diff --git a/lib/config.ts b/lib/config.ts index 946c7648..40e7c37d 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -29,7 +29,7 @@ if (!GRAPHQL_HOSTNAME) { } } -const GRAPHQL_URI = `https://${GRAPHQL_HOSTNAME}/graphql` +const GRAPHQL_URI = `http://${GRAPHQL_HOSTNAME}/graphql` const GRAPHQL_SUBSCRIPTION_URI = GRAPHQL_WEBSOCKET_URL const NOSTR_PUBKEY = process.env.NOSTR_PUBKEY as string diff --git a/lib/graphql/generated.ts b/lib/graphql/generated.ts index ede55aaf..2a180168 100644 --- a/lib/graphql/generated.ts +++ b/lib/graphql/generated.ts @@ -29,6 +29,10 @@ export type Scalars = { CountryCode: string /** Display currency of an account */ DisplayCurrency: string + /** Email address */ + EmailAddress: string + /** An id to be passed between registrationInitiate and registrationValidate for confirming email */ + EmailRegistrationId: string /** Feedback shared with our user */ Feedback: string /** Hex-encoded string of 32 bytes */ @@ -64,10 +68,17 @@ export type Scalars = { TargetConfirmations: number /** Timestamp field, serialized as Unix time (the number of seconds since the Unix epoch) */ Timestamp: number + /** A time-based one-time password */ + TotpCode: string + /** An id to be passed between set and verify for confirming totp */ + TotpRegistrationId: string + /** A secret to generate time-based one-time password */ + TotpSecret: string /** Unique identifier of a user */ Username: string /** Unique identifier of a wallet */ WalletId: string + _FieldSet: string } export type Account = { @@ -150,6 +161,7 @@ export type AuthTokenPayload = { readonly __typename: "AuthTokenPayload" readonly authToken?: Maybe readonly errors: ReadonlyArray + readonly totpRequired?: Maybe } /** A wallet belonging to an account which contains a BTC balance and a list of transactions. */ @@ -186,7 +198,6 @@ export type BtcWalletTransactionsByAddressArgs = { export type BuildInformation = { readonly __typename: "BuildInformation" - readonly buildTime?: Maybe readonly commitHash?: Maybe readonly helmRevision?: Maybe } @@ -282,6 +293,12 @@ export type DeviceNotificationTokenCreateInput = { readonly deviceToken: Scalars["String"] } +export type Email = { + readonly __typename: "Email" + readonly address?: Maybe + readonly verified?: Maybe +} + export type Error = { readonly code?: Maybe readonly message: Scalars["String"] @@ -659,12 +676,21 @@ export type Mutation = { readonly quizCompleted: QuizCompletedPayload /** @deprecated will be moved to AccountContact */ readonly userContactUpdateAlias: UserContactUpdateAliasPayload + readonly userEmailDelete: UserEmailDeletePayload + readonly userEmailRegistrationInitiate: UserEmailRegistrationInitiatePayload + readonly userEmailRegistrationValidate: UserEmailRegistrationValidatePayload readonly userLogin: AuthTokenPayload readonly userLoginUpgrade: UpgradePayload - readonly userLogout: AuthTokenPayload + readonly userLogout: SuccessPayload + readonly userPhoneDelete: UserPhoneDeletePayload + readonly userPhoneRegistrationInitiate: SuccessPayload + readonly userPhoneRegistrationValidate: UserPhoneRegistrationValidatePayload /** @deprecated Use QuizCompletedMutation instead */ readonly userQuizQuestionUpdateCompleted: UserQuizQuestionUpdateCompletedPayload readonly userRequestAuthCode: SuccessPayload + readonly userTotpDelete: UserTotpDeletePayload + readonly userTotpRegistrationInitiate: UserTotpRegistrationInitiatePayload + readonly userTotpRegistrationValidate: UserTotpRegistrationValidatePayload readonly userUpdateLanguage: UserUpdateLanguagePayload /** @deprecated Username will be moved to @Handle in Accounts. Also SetUsername naming should be used instead of UpdateUsername to reflect the idempotency of Handles */ readonly userUpdateUsername: UserUpdateUsernamePayload @@ -782,6 +808,14 @@ export type MutationUserContactUpdateAliasArgs = { input: UserContactUpdateAliasInput } +export type MutationUserEmailRegistrationInitiateArgs = { + input: UserEmailRegistrationInitiateInput +} + +export type MutationUserEmailRegistrationValidateArgs = { + input: UserEmailRegistrationValidateInput +} + export type MutationUserLoginArgs = { input: UserLoginInput } @@ -794,6 +828,14 @@ export type MutationUserLogoutArgs = { input: UserLogoutInput } +export type MutationUserPhoneRegistrationInitiateArgs = { + input: UserPhoneRegistrationInitiateInput +} + +export type MutationUserPhoneRegistrationValidateArgs = { + input: UserPhoneRegistrationValidateInput +} + export type MutationUserQuizQuestionUpdateCompletedArgs = { input: UserQuizQuestionUpdateCompletedInput } @@ -802,6 +844,18 @@ export type MutationUserRequestAuthCodeArgs = { input: UserRequestAuthCodeInput } +export type MutationUserTotpDeleteArgs = { + input: UserTotpDeleteInput +} + +export type MutationUserTotpRegistrationInitiateArgs = { + input: UserTotpRegistrationInitiateInput +} + +export type MutationUserTotpRegistrationValidateArgs = { + input: UserTotpRegistrationValidateInput +} + export type MutationUserUpdateLanguageArgs = { input: UserUpdateLanguageInput } @@ -1338,6 +1392,8 @@ export type User = { readonly contacts: ReadonlyArray readonly createdAt: Scalars["Timestamp"] readonly defaultAccount: Account + /** Email address */ + readonly email?: Maybe readonly id: Scalars["ID"] /** * Preferred language for user. @@ -1351,6 +1407,8 @@ export type User = { * @deprecated use Quiz from Account instead */ readonly quizQuestions: ReadonlyArray + /** Whether TOTP is enabled for this user. */ + readonly totpEnabled: Scalars["Boolean"] /** * Optional immutable user friendly identifier. * @deprecated will be moved to @Handle in Account and Wallet @@ -1395,6 +1453,34 @@ export type UserContactUpdateAliasPayload = { readonly errors: ReadonlyArray } +export type UserEmailDeletePayload = { + readonly __typename: "UserEmailDeletePayload" + readonly errors: ReadonlyArray + readonly me?: Maybe +} + +export type UserEmailRegistrationInitiateInput = { + readonly email: Scalars["EmailAddress"] +} + +export type UserEmailRegistrationInitiatePayload = { + readonly __typename: "UserEmailRegistrationInitiatePayload" + readonly emailRegistrationId?: Maybe + readonly errors: ReadonlyArray + readonly me?: Maybe +} + +export type UserEmailRegistrationValidateInput = { + readonly code: Scalars["OneTimeAuthCode"] + readonly emailRegistrationId: Scalars["EmailRegistrationId"] +} + +export type UserEmailRegistrationValidatePayload = { + readonly __typename: "UserEmailRegistrationValidatePayload" + readonly errors: ReadonlyArray + readonly me?: Maybe +} + export type UserLoginInput = { readonly code: Scalars["OneTimeAuthCode"] readonly phone: Scalars["Phone"] @@ -1409,6 +1495,28 @@ export type UserLogoutInput = { readonly authToken: Scalars["AuthToken"] } +export type UserPhoneDeletePayload = { + readonly __typename: "UserPhoneDeletePayload" + readonly errors: ReadonlyArray + readonly me?: Maybe +} + +export type UserPhoneRegistrationInitiateInput = { + readonly channel?: InputMaybe + readonly phone: Scalars["Phone"] +} + +export type UserPhoneRegistrationValidateInput = { + readonly code: Scalars["OneTimeAuthCode"] + readonly phone: Scalars["Phone"] +} + +export type UserPhoneRegistrationValidatePayload = { + readonly __typename: "UserPhoneRegistrationValidatePayload" + readonly errors: ReadonlyArray + readonly me?: Maybe +} + export type UserQuizQuestion = { readonly __typename: "UserQuizQuestion" readonly completed: Scalars["Boolean"] @@ -1430,6 +1538,39 @@ export type UserRequestAuthCodeInput = { readonly phone: Scalars["Phone"] } +export type UserTotpDeleteInput = { + readonly authToken: Scalars["AuthToken"] +} + +export type UserTotpDeletePayload = { + readonly __typename: "UserTotpDeletePayload" + readonly errors: ReadonlyArray + readonly me?: Maybe +} + +export type UserTotpRegistrationInitiateInput = { + readonly authToken: Scalars["AuthToken"] +} + +export type UserTotpRegistrationInitiatePayload = { + readonly __typename: "UserTotpRegistrationInitiatePayload" + readonly errors: ReadonlyArray + readonly totpRegistrationId?: Maybe + readonly totpSecret?: Maybe +} + +export type UserTotpRegistrationValidateInput = { + readonly authToken: Scalars["AuthToken"] + readonly totpCode: Scalars["TotpCode"] + readonly totpRegistrationId: Scalars["TotpRegistrationId"] +} + +export type UserTotpRegistrationValidatePayload = { + readonly __typename: "UserTotpRegistrationValidatePayload" + readonly errors: ReadonlyArray + readonly me?: Maybe +} + export type UserUpdate = | IntraLedgerUpdate | LnUpdate diff --git a/lib/graphql/local-schema.gql b/lib/graphql/local-schema.gql deleted file mode 100644 index e69de29b..00000000 diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03d..fd36f949 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/package.json b/package.json index c423a0c1..2de0151e 100644 --- a/package.json +++ b/package.json @@ -35,16 +35,15 @@ "ioredis": "^5.3.1", "lnurl-pay": "^1.0.1", "lodash.debounce": "^4.0.8", - "next": "^12.3.0", + "next": "^13.4.19", "original-url": "^1.2.3", - "react": "^17.0.2", + "react": "^18.2.0", "react-app-polyfill": "^2.0.0", "react-bootstrap": "^1.6.4", "react-currency-input-field": "^3.6.10", - "react-dom": "^17.0.2", + "react-dom": "^18.2.0", "react-lottie": "^1.2.3", "react-qrcode-logo": "^2.9.0", - "react-refresh": "^0.14.0", "react-to-print": "^2.14.12", "use-debounce": "^8.0.4", "use-react-screenshot": "^3.0.0" diff --git a/pages/[username].tsx b/pages/[username].tsx index a232e148..c62902e6 100644 --- a/pages/[username].tsx +++ b/pages/[username].tsx @@ -86,8 +86,8 @@ function ReceivePayment() {

    {`${usernameError.message}.`}

    Please check the username in your browser URL and try again.

    - - localStorage.removeItem("username")}>Back + localStorage.removeItem("username")}> + Back
    ) : ( diff --git a/pages/api/lnurlp/[username].ts b/pages/api/lnurlp/[username].ts index 3d75923c..950cfbd3 100644 --- a/pages/api/lnurlp/[username].ts +++ b/pages/api/lnurlp/[username].ts @@ -12,6 +12,12 @@ import type { NextApiRequest, NextApiResponse } from "next" import Redis from "ioredis" import { GRAPHQL_URI_INTERNAL, NOSTR_PUBKEY } from "../../../lib/config" +import { + AccountDefaultWalletDocument, + AccountDefaultWalletQuery, + LnInvoiceCreateOnBehalfOfRecipientDocument, + LnInvoiceCreateOnBehalfOfRecipientMutation, +} from "../../../lib/graphql/generated" const ipForwardingMiddleware = new ApolloLink((operation, forward) => { operation.setContext(({ headers = {} }) => ({ @@ -35,7 +41,7 @@ const client = new ApolloClient({ cache: new InMemoryCache(), }) -const ACCOUNT_DEFAULT_WALLET = gql` +gql` query accountDefaultWallet($username: Username!, $walletCurrency: WalletCurrency!) { accountDefaultWallet(username: $username, walletCurrency: $walletCurrency) { __typename @@ -43,9 +49,7 @@ const ACCOUNT_DEFAULT_WALLET = gql` walletCurrency } } -` -const LNURL_INVOICE = gql` mutation lnInvoiceCreateOnBehalfOfRecipient( $walletId: WalletId! $amount: SatAmount! @@ -69,35 +73,6 @@ const LNURL_INVOICE = gql` } ` -type CreateInvoiceOutput = { - invoice?: { - paymentRequest: string - paymentHash: string - } - errors?: { - message: string - }[] -} - -type CreateInvoiceParams = { - walletId: string - amount: number - descriptionHash: string -} - -async function createInvoice(params: CreateInvoiceParams): Promise { - const { - data: { - mutationData: { errors, invoice }, - }, - } = await client.mutate({ - mutation: LNURL_INVOICE, - variables: params, - }) - - return { errors, invoice } -} - const nostrEnabled = !!NOSTR_PUBKEY let redis: Redis | null = null @@ -108,15 +83,15 @@ if (nostrEnabled) { sentinels: [ { host: `${process.env.REDIS_0_DNS}`, - port: Number(process.env.REDIS_0_SENTINEL_PORT) || 26379, + port: 26379, }, { host: `${process.env.REDIS_1_DNS}`, - port: Number(process.env.REDIS_1_SENTINEL_PORT) || 26379, + port: 26379, }, { host: `${process.env.REDIS_2_DNS}`, - port: Number(process.env.REDIS_2_SENTINEL_PORT) || 26379, + port: 26379, }, ], name: process.env.REDIS_MASTER_NAME ?? "mymaster", @@ -135,7 +110,22 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { const url = originalUrl(req) const accountUsername = username ? username.toString() : "" - const walletId = await getUserWalletId(accountUsername, req) + let walletId: string | null = null + + try { + const { data } = await client.query({ + query: AccountDefaultWalletDocument, + variables: { username: accountUsername, walletCurrency: "BTC" }, + context: { + "x-real-ip": req.headers["x-real-ip"], + "x-forwarded-for": req.headers["x-forwarded-for"], + }, + }) + walletId = data?.accountDefaultWallet?.id + } catch (err: unknown) { + console.log(err) + } + if (!walletId) { return res.json({ status: "ERROR", @@ -187,12 +177,18 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { descriptionHash = crypto.createHash("sha256").update(metadata).digest("hex") } - const { invoice, errors } = await createInvoice({ - walletId, - amount: amountSats, - descriptionHash, + const result = await client.mutate({ + mutation: LnInvoiceCreateOnBehalfOfRecipientDocument, + variables: { + walletId, + amount: amountSats, + descriptionHash, + }, }) + const errors = result.errors + const invoice = result.data?.mutationData?.invoice + if ((errors && errors.length) || !invoice) { console.log("error getting invoice", errors) return res.json({ @@ -217,20 +213,3 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { }) } } - -const getUserWalletId = async (accountUsername: string, req: NextApiRequest) => { - try { - const { data } = await client.query({ - query: ACCOUNT_DEFAULT_WALLET, - variables: { username: accountUsername, walletCurrency: "BTC" }, - context: { - "x-real-ip": req.headers["x-real-ip"], - "x-forwarded-for": req.headers["x-forwarded-for"], - }, - }) - return data?.accountDefaultWallet?.id - } catch (err) { - console.log("error getting user wallet id:", err) - return undefined - } -} diff --git a/tsconfig.json b/tsconfig.json index fe89f394..2b5cff7b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,10 +19,16 @@ "jsx": "preserve", "allowJs": true, "incremental": true, - "strict": true + "strict": true, + "plugins": [ + { + "name": "next" + } + ] }, "include": [ "**/*", + ".next/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/yarn.lock b/yarn.lock index 2819949b..a779e03f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1709,10 +1709,10 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@next/env@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.4.tgz#c787837d36fcad75d72ff8df6b57482027d64a47" - integrity sha512-H/69Lc5Q02dq3o+dxxy5O/oNxFsZpdL6WREtOOtOM1B/weonIwDXkekr1KV5DPVPr12IHFPrMrcJQ6bgPMfn7A== +"@next/env@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz#46905b4e6f62da825b040343cbc233144e9578d3" + integrity sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ== "@next/eslint-plugin-next@13.4.2": version "13.4.2" @@ -1721,70 +1721,50 @@ dependencies: glob "7.1.7" -"@next/swc-android-arm-eabi@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.4.tgz#fd1c2dafe92066c6120761c6a39d19e666dc5dd0" - integrity sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA== - -"@next/swc-android-arm64@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.4.tgz#11a146dae7b8bca007239b21c616e83f77b19ed4" - integrity sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg== - -"@next/swc-darwin-arm64@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.4.tgz#14ac8357010c95e67327f47082af9c9d75d5be79" - integrity sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA== - -"@next/swc-darwin-x64@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.4.tgz#e7dc63cd2ac26d15fb84d4d2997207fb9ba7da0f" - integrity sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ== - -"@next/swc-freebsd-x64@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.4.tgz#fe7ceec58746fdf03f1fcb37ec1331c28e76af93" - integrity sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ== - -"@next/swc-linux-arm-gnueabihf@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.4.tgz#d7016934d02bfc8bd69818ffb0ae364b77b17af7" - integrity sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw== - -"@next/swc-linux-arm64-gnu@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.4.tgz#43a7bc409b03487bff5beb99479cacdc7bd29af5" - integrity sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA== - -"@next/swc-linux-arm64-musl@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.4.tgz#4d1db6de6dc982b974cd1c52937111e3e4a34bd3" - integrity sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ== - -"@next/swc-linux-x64-gnu@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.4.tgz#c3b414d77bab08b35f7dd8943d5586f0adb15e38" - integrity sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag== - -"@next/swc-linux-x64-musl@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.4.tgz#187a883ec09eb2442a5ebf126826e19037313c61" - integrity sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg== - -"@next/swc-win32-arm64-msvc@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.4.tgz#89befa84e453ed2ef9a888f375eba565a0fde80b" - integrity sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ== - -"@next/swc-win32-ia32-msvc@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.4.tgz#cb50c08f0e40ead63642a7f269f0c8254261f17c" - integrity sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ== - -"@next/swc-win32-x64-msvc@12.3.4": - version "12.3.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.4.tgz#d28ea15a72cdcf96201c60a43e9630cd7fda168f" - integrity sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg== +"@next/swc-darwin-arm64@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz#77ad462b5ced4efdc26cb5a0053968d2c7dac1b6" + integrity sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ== + +"@next/swc-darwin-x64@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz#aebe38713a4ce536ee5f2a291673e14b715e633a" + integrity sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw== + +"@next/swc-linux-arm64-gnu@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz#ec54db65b587939c7b94f9a84800f003a380f5a6" + integrity sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg== + +"@next/swc-linux-arm64-musl@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz#1f5e2c1ea6941e7d530d9f185d5d64be04279d86" + integrity sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA== + +"@next/swc-linux-x64-gnu@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz#96b0882492a2f7ffcce747846d3680730f69f4d1" + integrity sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g== + +"@next/swc-linux-x64-musl@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz#f276b618afa321d2f7b17c81fc83f429fb0fd9d8" + integrity sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q== + +"@next/swc-win32-arm64-msvc@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz#1599ae0d401da5ffca0947823dac577697cce577" + integrity sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw== + +"@next/swc-win32-ia32-msvc@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz#55cdd7da90818f03e4da16d976f0cb22045d16fd" + integrity sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA== + +"@next/swc-win32-x64-msvc@13.4.19": + version "13.4.19" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz#648f79c4e09279212ac90d871646ae12d80cdfce" + integrity sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw== "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" @@ -1890,10 +1870,10 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@swc/helpers@0.4.11": - version "0.4.11" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.11.tgz#db23a376761b3d31c26502122f349a21b592c8de" - integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw== +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== dependencies: tslib "^2.4.0" @@ -2943,7 +2923,7 @@ bundle-name@^3.0.0: dependencies: run-applescript "^5.0.0" -busboy@^1.6.0: +busboy@1.6.0, busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== @@ -3120,6 +3100,11 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -4280,6 +4265,11 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -4369,7 +4359,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5431,31 +5421,29 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@^12.3.0: - version "12.3.4" - resolved "https://registry.yarnpkg.com/next/-/next-12.3.4.tgz#f2780a6ebbf367e071ce67e24bd8a6e05de2fcb1" - integrity sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ== +next@^13.4.19: + version "13.4.19" + resolved "https://registry.npmjs.org/next/-/next-13.4.19.tgz#2326e02aeedee2c693d4f37b90e4f0ed6882b35f" + integrity sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw== dependencies: - "@next/env" "12.3.4" - "@swc/helpers" "0.4.11" + "@next/env" "13.4.19" + "@swc/helpers" "0.5.1" + busboy "1.6.0" caniuse-lite "^1.0.30001406" postcss "8.4.14" - styled-jsx "5.0.7" - use-sync-external-store "1.2.0" + styled-jsx "5.1.1" + watchpack "2.4.0" + zod "3.21.4" optionalDependencies: - "@next/swc-android-arm-eabi" "12.3.4" - "@next/swc-android-arm64" "12.3.4" - "@next/swc-darwin-arm64" "12.3.4" - "@next/swc-darwin-x64" "12.3.4" - "@next/swc-freebsd-x64" "12.3.4" - "@next/swc-linux-arm-gnueabihf" "12.3.4" - "@next/swc-linux-arm64-gnu" "12.3.4" - "@next/swc-linux-arm64-musl" "12.3.4" - "@next/swc-linux-x64-gnu" "12.3.4" - "@next/swc-linux-x64-musl" "12.3.4" - "@next/swc-win32-arm64-msvc" "12.3.4" - "@next/swc-win32-ia32-msvc" "12.3.4" - "@next/swc-win32-x64-msvc" "12.3.4" + "@next/swc-darwin-arm64" "13.4.19" + "@next/swc-darwin-x64" "13.4.19" + "@next/swc-linux-arm64-gnu" "13.4.19" + "@next/swc-linux-arm64-musl" "13.4.19" + "@next/swc-linux-x64-gnu" "13.4.19" + "@next/swc-linux-x64-musl" "13.4.19" + "@next/swc-win32-arm64-msvc" "13.4.19" + "@next/swc-win32-ia32-msvc" "13.4.19" + "@next/swc-win32-x64-msvc" "13.4.19" no-case@^3.0.4: version "3.0.4" @@ -6030,14 +6018,13 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.23.0" react-error-overlay@^6.0.11: version "6.0.11" @@ -6084,11 +6071,6 @@ react-qrcode-logo@^2.9.0: lodash.isequal "^4.5.0" qrcode-generator "^1.4.1" -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== - react-to-print@^2.14.12: version "2.14.12" resolved "https://registry.yarnpkg.com/react-to-print/-/react-to-print-2.14.12.tgz#e3ecddca2a03eddef1773ffb7c1a63c140f44036" @@ -6106,13 +6088,12 @@ react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.2" @@ -6361,13 +6342,12 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@2.7.0: version "2.7.0" @@ -6659,10 +6639,12 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -styled-jsx@5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.7.tgz#be44afc53771b983769ac654d355ca8d019dff48" - integrity sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA== +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" supports-color@^5.3.0: version "5.5.0" @@ -6988,11 +6970,6 @@ use-react-screenshot@^3.0.0: resolved "https://registry.yarnpkg.com/use-react-screenshot/-/use-react-screenshot-3.0.0.tgz#fa4f3bc94b17719041273699d9e04f53987194de" integrity sha512-82+zsJgNWEUsUR7lslLIXMw9BW+xic+epn5Dl2ziedgsP9bz0HM0hfx3E71Kkv1U7F6Hyi4E/jMxuxJPLdpHcg== -use-sync-external-store@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7024,6 +7001,14 @@ warning@^4.0.0, warning@^4.0.3: dependencies: loose-envify "^1.0.0" +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -7246,3 +7231,8 @@ zen-observable@0.8.15: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==