diff --git a/@connect-shared/hooks/useS3UploadInput.ts b/@connect-shared/hooks/useS3UploadInput.ts index c4c3072cbd..cee42a9a65 100644 --- a/@connect-shared/hooks/useS3UploadInput.ts +++ b/@connect-shared/hooks/useS3UploadInput.ts @@ -1,10 +1,11 @@ import { log } from '@charmverse/core/log'; -import { uploadToS3 } from '@root/lib/aws/uploadToS3Browser'; import { DEFAULT_MAX_FILE_SIZE_MB } from '@root/lib/file/constants'; import { encodeFilename } from '@root/lib/utils/encodeFilename'; import { replaceS3Domain } from '@root/lib/utils/url'; import { useState } from 'react'; +import { uploadToS3 } from '../../packages/aws/src/uploadToS3Browser'; + import { useFilePicker } from './useFilePicker'; import { useGetUploadToken } from './useGetUploadToken'; diff --git a/@connect-shared/lib/attestations/storeProjectMetadataAndPublishToGitcoin.ts b/@connect-shared/lib/attestations/storeProjectMetadataAndPublishToGitcoin.ts index b98b9622e8..73e09589bb 100644 --- a/@connect-shared/lib/attestations/storeProjectMetadataAndPublishToGitcoin.ts +++ b/@connect-shared/lib/attestations/storeProjectMetadataAndPublishToGitcoin.ts @@ -2,7 +2,7 @@ import { DataNotFoundError } from '@charmverse/core/errors'; import { log } from '@charmverse/core/log'; import type { GitcoinProjectAttestation } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { resolveENSName } from '@root/lib/blockchain/getENSName'; +import { resolveENSName } from '@packages/blockchain/getENSName'; import { attestOnchain } from '@root/lib/credentials/attestOnchain'; import { gitcoinProjectCredentialSchemaId } from '@root/lib/credentials/schemas/gitcoinProjectSchema'; import { storeProjectInS3 } from '@root/lib/credentials/storeProjectInS3'; diff --git a/@connect-shared/lib/farcaster/uuidFromFid.ts b/@connect-shared/lib/farcaster/uuidFromFid.ts index d5cc5a4d07..09b0165439 100644 --- a/@connect-shared/lib/farcaster/uuidFromFid.ts +++ b/@connect-shared/lib/farcaster/uuidFromFid.ts @@ -4,6 +4,7 @@ import { log } from '@charmverse/core/log'; import { v4 as uuid } from 'uuid'; // Function to generate a deterministic UUID v4 based on an integer input +/** @deprecated Use uuidFromNumber from @packages/utils/uuid instead */ export function deterministicV4UUIDFromFid(num: number | string): string { // Create a hash of the input number to generate more uniformly distributed random bytes const hash = createHash('sha256').update(num.toString()).digest(); diff --git a/@connect-shared/package.json b/@connect-shared/package.json index 97af323430..d7fc534f2f 100644 --- a/@connect-shared/package.json +++ b/@connect-shared/package.json @@ -13,6 +13,7 @@ "license": "ISC", "dependencies": { "@mui/material-nextjs": "^6.1.0", + "@packages/aws": "file:../packages/aws", "framer-motion": "^11.3.17", "next-safe-action": "~7.4.2" } diff --git a/apps/scoutgame/app/api/aws/upload-token/route.ts b/apps/scoutgame/app/api/aws/upload-token/route.ts index 52e7248091..b5ed916cef 100644 --- a/apps/scoutgame/app/api/aws/upload-token/route.ts +++ b/apps/scoutgame/app/api/aws/upload-token/route.ts @@ -1,5 +1,5 @@ -import { uploadToken } from '@connect-shared/lib/aws/uploadToken'; import { getSession } from '@connect-shared/lib/session/getSession'; +import { uploadToken } from '@packages/aws/uploadToken'; export async function GET(request: Request) { const { searchParams } = new URL(request.url); @@ -15,7 +15,7 @@ export async function GET(request: Request) { } try { - const tokenData = await uploadToken(filename, userId); + const tokenData = await uploadToken({ filename, userId }); return Response.json(tokenData); } catch (error) { diff --git a/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useGetERC20Allowance.tsx b/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useGetERC20Allowance.tsx index bfccefcb5a..1ef5ee364f 100644 --- a/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useGetERC20Allowance.tsx +++ b/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useGetERC20Allowance.tsx @@ -1,5 +1,5 @@ -import { getChainById } from '@packages/onchain/chains'; -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getChainById } from '@packages/blockchain/chains'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { UsdcErc20ABIClient } from '@packages/scoutgame/builderNfts/usdcContractApiClient'; import useSWR from 'swr'; import type { Address, Chain } from 'viem'; diff --git a/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useUpdateERC20Allowance.tsx b/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useUpdateERC20Allowance.tsx index cf40098f22..7646800a7e 100644 --- a/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useUpdateERC20Allowance.tsx +++ b/apps/scoutgame/components/common/NFTPurchaseDialog/hooks/useUpdateERC20Allowance.tsx @@ -1,4 +1,4 @@ -import { getChainById } from '@packages/onchain/chains'; +import { getChainById } from '@packages/blockchain/chains'; import { UsdcErc20ABIClient } from '@packages/scoutgame/builderNfts/usdcContractApiClient'; import useSWRMutation from 'swr/mutation'; import { publicActions, type Address, type Chain } from 'viem'; diff --git a/apps/scoutgame/hooks/useS3UploadInput.ts b/apps/scoutgame/hooks/useS3UploadInput.ts index c4c3072cbd..c3ac1b9cc1 100644 --- a/apps/scoutgame/hooks/useS3UploadInput.ts +++ b/apps/scoutgame/hooks/useS3UploadInput.ts @@ -1,5 +1,5 @@ import { log } from '@charmverse/core/log'; -import { uploadToS3 } from '@root/lib/aws/uploadToS3Browser'; +import { uploadToS3 } from '@packages/aws/uploadToS3Browser'; import { DEFAULT_MAX_FILE_SIZE_MB } from '@root/lib/file/constants'; import { encodeFilename } from '@root/lib/utils/encodeFilename'; import { replaceS3Domain } from '@root/lib/utils/url'; diff --git a/apps/scoutgame/lib/blockchain/findOrCreateWalletUser.ts b/apps/scoutgame/lib/blockchain/findOrCreateWalletUser.ts index 35980a1204..0b85b24e6a 100644 --- a/apps/scoutgame/lib/blockchain/findOrCreateWalletUser.ts +++ b/apps/scoutgame/lib/blockchain/findOrCreateWalletUser.ts @@ -1,10 +1,10 @@ import { log } from '@charmverse/core/log'; +import { getENSDetails, getENSName } from '@packages/blockchain/getENSName'; import { getFarcasterUsersByAddresses } from '@packages/farcaster/getFarcasterUsersByAddresses'; -import { getENSDetails, getENSName } from '@root/lib/blockchain/getENSName'; +import { findOrCreateUser } from '@packages/scoutgame/users/findOrCreateUser'; +import type { FindOrCreateUserResult } from '@packages/scoutgame/users/findOrCreateUser'; import { getAddress } from 'viem'; -import type { FindOrCreateUserResult } from 'lib/users/findOrCreateUser'; -import { findOrCreateUser } from 'lib/users/findOrCreateUser'; import { generateUserPath } from 'lib/users/generateUserPath'; import { generateRandomName } from 'lib/utils/generateRandomName'; diff --git a/apps/scoutgame/lib/session/getPendingNftTransactions.tsx b/apps/scoutgame/lib/session/getPendingNftTransactions.tsx index 0840ce621e..19dcb8e4d7 100644 --- a/apps/scoutgame/lib/session/getPendingNftTransactions.tsx +++ b/apps/scoutgame/lib/session/getPendingNftTransactions.tsx @@ -1,7 +1,7 @@ import type { PendingNftTransaction, TransactionStatus } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { getPublicClient } from '@packages/onchain/getPublicClient'; -import { waitForDecentTransactionSettlement } from '@packages/onchain/waitForDecentTransactionSettlement'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; +import { waitForDecentTransactionSettlement } from '@packages/blockchain/waitForDecentTransactionSettlement'; export type TxResponse = Pick; diff --git a/apps/scoutgame/lib/session/loginWithFarcasterAction.ts b/apps/scoutgame/lib/session/loginWithFarcasterAction.ts index 5d9841b99f..6b8581a917 100644 --- a/apps/scoutgame/lib/session/loginWithFarcasterAction.ts +++ b/apps/scoutgame/lib/session/loginWithFarcasterAction.ts @@ -1,12 +1,12 @@ 'use server'; import { log } from '@charmverse/core/log'; +import { findOrCreateFarcasterUser } from '@packages/scoutgame/users/findOrCreateFarcasterUser'; import { authSecret } from '@root/config/constants'; import { sealData } from 'iron-session'; import { cookies } from 'next/headers'; import { actionClient } from 'lib/actions/actionClient'; -import { findOrCreateFarcasterUser } from 'lib/farcaster/findOrCreateFarcasterUser'; import { verifyFarcasterUser } from 'lib/farcaster/verifyFarcasterUser'; import { authSchema } from '../farcaster/config'; diff --git a/apps/scoutgame/lib/session/loginWithWalletAction.ts b/apps/scoutgame/lib/session/loginWithWalletAction.ts index 590ef3b44e..728364bc41 100644 --- a/apps/scoutgame/lib/session/loginWithWalletAction.ts +++ b/apps/scoutgame/lib/session/loginWithWalletAction.ts @@ -1,5 +1,7 @@ 'use server'; +import { trackUserAction } from '@packages/mixpanel/trackUserAction'; + import { actionClient } from 'lib/actions/actionClient'; import { findOrCreateWalletUser } from 'lib/blockchain/findOrCreateWalletUser'; import { loginWithWalletSchema } from 'lib/blockchain/schema'; @@ -20,6 +22,16 @@ export const loginWithWalletAction = actionClient await saveSession(ctx, { scoutId: user.id }); const sessionUser = (await getUserFromSession()) as SessionUser; + if (user.isNew) { + trackUserAction('sign_up', { + userId: user.id + }); + } else { + trackUserAction('sign_in', { + userId: user.id + }); + } + return { user: sessionUser, success: true, diff --git a/apps/scoutgame/scripts/onboardScouts.ts b/apps/scoutgame/scripts/onboardScouts.ts deleted file mode 100644 index 33384bc7f1..0000000000 --- a/apps/scoutgame/scripts/onboardScouts.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { prisma } from '@charmverse/core/prisma-client'; -import { findOrCreateFarcasterUser } from 'lib/farcaster/findOrCreateFarcasterUser'; -import type { ConnectWaitlistTier } from '@packages/scoutgame/waitlist/scoring/constants'; - -async function onboardScouts({ fids, tierOverride }: { fids: number[]; tierOverride?: ConnectWaitlistTier }) { - const existingAccounts = await prisma.scout.findMany({ - where: { - farcasterId: { - in: fids - } - } - }); - - console.log(`Found ${existingAccounts.length} existing accounts`); - - const fidsRequiringAccount = fids.filter((fid) => !existingAccounts.some((account) => account.farcasterId === fid)); - const totalFidsToProcess = fidsRequiringAccount.length; - - for (let i = 0; i < totalFidsToProcess; i++) { - const fid = fidsRequiringAccount[i]; - console.log(`Creating user ${i + 1} / ${totalFidsToProcess}`); - const user = await findOrCreateFarcasterUser({ fid, tierOverride: 'mythic' }); - // console.log(`Created user ${user.id}. View: https://scoutgame.xyz/u/${user.path}`); - } -} - -async function script() { - await onboardScouts({ fids: [5516], tierOverride: 'mythic' }); -} - -script(); diff --git a/apps/scoutgame/tsconfig.json b/apps/scoutgame/tsconfig.json index 1bf68c9b94..605e7e66ec 100644 --- a/apps/scoutgame/tsconfig.json +++ b/apps/scoutgame/tsconfig.json @@ -41,6 +41,6 @@ "@charmverse/core/errors": ["../../node_modules/@charmverse/core/dist/cjs/errors"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/scoutgame/src/users/generateRandomAvatar.ts", "../../packages/scoutgame/src/users/findOrCreateUser.ts"], "exclude": ["../../node_modules", ".next/", "public/sw.js", "sw.js"] } diff --git a/apps/scoutgameadmin/app/api/onchain/scout-events/route.ts b/apps/scoutgameadmin/app/api/blockchain/scout-events/route.ts similarity index 100% rename from apps/scoutgameadmin/app/api/onchain/scout-events/route.ts rename to apps/scoutgameadmin/app/api/blockchain/scout-events/route.ts diff --git a/apps/scoutgameadmin/app/api/onchain/transaction-status/route.ts b/apps/scoutgameadmin/app/api/blockchain/transaction-status/route.ts similarity index 85% rename from apps/scoutgameadmin/app/api/onchain/transaction-status/route.ts rename to apps/scoutgameadmin/app/api/blockchain/transaction-status/route.ts index 587454b0d9..6277152e2b 100644 --- a/apps/scoutgameadmin/app/api/onchain/transaction-status/route.ts +++ b/apps/scoutgameadmin/app/api/blockchain/transaction-status/route.ts @@ -1,4 +1,4 @@ -import { getTransactionStatusFromDecent } from '@packages/onchain/waitForDecentTransactionSettlement'; +import { getTransactionStatusFromDecent } from '@packages/blockchain/waitForDecentTransactionSettlement'; import type { NextRequest } from 'next/server'; import { NextResponse } from 'next/server'; diff --git a/apps/scoutgameadmin/app/api/users/create-builder/route.ts b/apps/scoutgameadmin/app/api/users/create-builder/route.ts new file mode 100644 index 0000000000..d204fd600a --- /dev/null +++ b/apps/scoutgameadmin/app/api/users/create-builder/route.ts @@ -0,0 +1,12 @@ +import { log } from '@charmverse/core/log'; +import type { NextRequest } from 'next/server'; +import { NextResponse } from 'next/server'; + +import { createBuilder } from 'lib/users/createBuilder'; + +export async function POST(request: NextRequest) { + const params = await request.json(); + const newUser = await createBuilder(params); + log.info('Approved new builder', { newUser }); + return NextResponse.json({ success: true }); +} diff --git a/apps/scoutgameadmin/app/api/users/get-user/route.ts b/apps/scoutgameadmin/app/api/users/get-user/route.ts index 73c7c35a08..e2fc5884c3 100644 --- a/apps/scoutgameadmin/app/api/users/get-user/route.ts +++ b/apps/scoutgameadmin/app/api/users/get-user/route.ts @@ -5,7 +5,10 @@ import { getUser } from 'lib/users/getUser'; export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url); - const searchString = searchParams.get('searchString'); - const repos = await getUser({ searchString: searchString || '' }); - return NextResponse.json(repos); + const userId = searchParams.get('userId'); + if (!userId) { + return NextResponse.json({ error: 'userId is required' }, { status: 400 }); + } + const user = await getUser(userId); + return NextResponse.json(user); } diff --git a/apps/scoutgameadmin/app/api/users/route.ts b/apps/scoutgameadmin/app/api/users/route.ts index de3d4ee8a9..d24a0b7930 100644 --- a/apps/scoutgameadmin/app/api/users/route.ts +++ b/apps/scoutgameadmin/app/api/users/route.ts @@ -1,10 +1,11 @@ import { log } from '@charmverse/core/log'; -import { importReposByUser } from '@packages/scoutgame/importReposByUser'; import type { NextRequest } from 'next/server'; import { NextResponse } from 'next/server'; +import { createUser } from 'lib/users/createUser'; import type { SortOrder, SortField } from 'lib/users/getUsers'; import { getUsers } from 'lib/users/getUsers'; +import { searchForUser } from 'lib/users/searchForUser'; export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url); @@ -16,9 +17,12 @@ export async function GET(request: NextRequest) { } export async function POST(request: NextRequest) { - const { owner } = await request.json(); - - await importReposByUser(owner); - + const params = await request.json(); + const user = await searchForUser(params); + if (!user) { + throw new Error(`User not found: ${params.searchString}`); + } + const newUser = await createUser(user); + log.info('Created new user', { newUser }); return NextResponse.json({ success: true }); } diff --git a/apps/scoutgameadmin/app/api/users/search-for-user/route.ts b/apps/scoutgameadmin/app/api/users/search-for-user/route.ts new file mode 100644 index 0000000000..42a4885f94 --- /dev/null +++ b/apps/scoutgameadmin/app/api/users/search-for-user/route.ts @@ -0,0 +1,11 @@ +import type { NextRequest } from 'next/server'; +import { NextResponse } from 'next/server'; + +import { searchForUser } from 'lib/users/searchForUser'; + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url); + const searchString = searchParams.get('searchString'); + const user = await searchForUser({ searchString: searchString || '' }); + return NextResponse.json(user); +} diff --git a/apps/scoutgameadmin/components/repos/components/AddRepoButton/AddRepoModal.tsx b/apps/scoutgameadmin/components/repos/components/AddRepoButton/AddRepoModal.tsx index cb4c035471..9e4dc1a830 100644 --- a/apps/scoutgameadmin/components/repos/components/AddRepoButton/AddRepoModal.tsx +++ b/apps/scoutgameadmin/components/repos/components/AddRepoButton/AddRepoModal.tsx @@ -15,7 +15,7 @@ import { import React, { useState } from 'react'; import { mutate } from 'swr'; -import { useCreateRepo, useSearchReposByOwnerFromGithub } from 'hooks/api/repos'; +import { useCreateRepos, useSearchReposByOwnerFromGithub } from 'hooks/api/repos'; import { useDebouncedValue } from 'hooks/useDebouncedValue'; type Props = { @@ -26,7 +26,7 @@ type Props = { export function AddRepoModal({ open, onClose, onAdd }: Props) { const [repoInput, setRepoInput] = useState(''); - const { trigger: addGithubRepo, isMutating: isImporting } = useCreateRepo(); + const { trigger: createRepos, isMutating: isImporting } = useCreateRepos(); const debouncedFilterString = useDebouncedValue(repoInput); const { data: reposFromGithub, @@ -39,7 +39,7 @@ export function AddRepoModal({ open, onClose, onAdd }: Props) { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - await addGithubRepo({ owner: repoInput }); + await createRepos({ owner: repoInput }); onAdd(); onClose(); setRepoInput(''); @@ -55,7 +55,7 @@ export function AddRepoModal({ open, onClose, onAdd }: Props) { Add new repos by owner
- + { e.preventDefault(); await createUser({ searchString: repoInput }); onAdd(); onClose(); - setRepoInput(''); + setTextInput(''); // clear SWR cache mutate( (key) => true, // which cache keys are updated @@ -46,17 +46,17 @@ export function AddUserModal({ open, onClose, onAdd }: Props) { return ( - Add or manage user + Add scout - + setRepoInput(e.target.value)} + onChange={(e) => setTextInput(e.target.value)} required slotProps={{ input: { @@ -98,11 +98,11 @@ export function AddUserModal({ open, onClose, onAdd }: Props) { Points Balance: {user.scout.currentBalance} - {user.scout.farcasterId && ( + {user.scout.farcasterName && ( Farcaster:{' '} - - {user.scout.path} + + {user.scout.farcasterName} )} @@ -126,7 +126,9 @@ export function AddUserModal({ open, onClose, onAdd }: Props) { - + {user.scout.builderStatus === 'applied' && ( Approve builder @@ -164,7 +166,9 @@ export function AddUserModal({ open, onClose, onAdd }: Props) { - + Add {user.waitlistUser.githubLogin ? 'builder' : 'scout'} @@ -186,7 +190,9 @@ export function AddUserModal({ open, onClose, onAdd }: Props) { Following: {user.farcasterUser.following_count} - + Add scout diff --git a/apps/scoutgameadmin/components/users/UserActionButton/AddBuilderModal.tsx b/apps/scoutgameadmin/components/users/UserActionButton/AddBuilderModal.tsx new file mode 100644 index 0000000000..3ecb666c0b --- /dev/null +++ b/apps/scoutgameadmin/components/users/UserActionButton/AddBuilderModal.tsx @@ -0,0 +1,94 @@ +import { LoadingButton } from '@mui/lab'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Stack, + Button, + TextField, + CircularProgress, + InputAdornment, + Link, + Typography, + Box +} from '@mui/material'; +import React, { useState } from 'react'; +import { mutate } from 'swr'; + +import { useCreateBuilder } from 'hooks/api/users'; +import { useDebouncedValue } from 'hooks/useDebouncedValue'; +import type { ScoutGameUser } from 'lib/users/getUsers'; + +type Props = { + open: boolean; + user: Pick; + onClose: () => void; + onAdd: () => void; +}; + +export function AddBuilderModal({ user, open, onClose, onAdd }: Props) { + const [githubLogin, setTextInput] = useState(''); + const { trigger: createUser, error: createBuilderError, isMutating: isCreating } = useCreateBuilder(); + const githubLoginDebounced = useDebouncedValue(githubLogin); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + await createUser({ userId: user.id, githubLogin }); + onAdd(); + onClose(); + setTextInput(''); + // clear SWR cache + mutate( + (key) => true, // which cache keys are updated + undefined // update cache data to `undefined` + // { revalidate: false } // do not revalidate + ); + }; + + const didApply = user?.builderStatus === 'applied'; + const action = didApply ? 'Approve' : 'Add'; + const requireGithubLogin = !user.githubLogin; + + return ( + + + {action} builder profile +
+ Register an NFT and mark the builder as approved +
+ + + + {requireGithubLogin && ( + setTextInput(e.target.value)} + required + /> + )} + {createBuilderError && ( + + + {createBuilderError.message || 'Failed to save builder'} + + + )} + + + + {action} + + + + + +
+ ); +} diff --git a/apps/scoutgameadmin/components/users/UserActionButton/UserActionButton.tsx b/apps/scoutgameadmin/components/users/UserActionButton/UserActionButton.tsx new file mode 100644 index 0000000000..068de2d148 --- /dev/null +++ b/apps/scoutgameadmin/components/users/UserActionButton/UserActionButton.tsx @@ -0,0 +1,66 @@ +import { MoreHoriz as MoreHorizIcon } from '@mui/icons-material'; +import { Menu, MenuItem, IconButton } from '@mui/material'; +import { useState } from 'react'; + +import type { ScoutGameUser } from 'lib/users/getUsers'; + +import { AddBuilderModal } from './AddBuilderModal'; +import { ViewTransactionsModal } from './ViewTransactionsModal'; + +export function UserActionButton({ user }: { user: ScoutGameUser }) { + const [anchorEl, setAnchorEl] = useState(null); + const [isBuilderModalOpen, setIsBuilderModalOpen] = useState(false); + const [isTransactionsModalOpen, setIsTransactionsModalOpen] = useState(false); + const open = Boolean(anchorEl); + + const handleClick = (event: React.MouseEvent) => { + event.stopPropagation(); + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + return ( + <> + + + + + {(user.builderStatus === 'applied' || user.builderStatus === 'rejected') && ( + setIsBuilderModalOpen(true)}>Approve builder profile + )} + {!user.builderStatus && setIsBuilderModalOpen(true)}>Add builder profile} + setIsTransactionsModalOpen(true)}>View NFT transactions + + setIsBuilderModalOpen(false)} + onAdd={() => {}} + /> + setIsTransactionsModalOpen(false)} + scoutId={user.id} + /> + + ); +} diff --git a/apps/scoutgameadmin/components/users/ViewTransactionsButton/ViewTransactionsModal.tsx b/apps/scoutgameadmin/components/users/UserActionButton/ViewTransactionsModal.tsx similarity index 94% rename from apps/scoutgameadmin/components/users/ViewTransactionsButton/ViewTransactionsModal.tsx rename to apps/scoutgameadmin/components/users/UserActionButton/ViewTransactionsModal.tsx index 30e06fdd43..95fd02b473 100644 --- a/apps/scoutgameadmin/components/users/ViewTransactionsButton/ViewTransactionsModal.tsx +++ b/apps/scoutgameadmin/components/users/UserActionButton/ViewTransactionsModal.tsx @@ -15,7 +15,7 @@ import { } from '@mui/material'; import React from 'react'; -import { useGetScoutEvents } from 'hooks/api/onchain'; +import { useGetScoutEvents } from 'hooks/api/blockchain'; type Props = { open: boolean; diff --git a/apps/scoutgameadmin/components/users/UsersDashboard.tsx b/apps/scoutgameadmin/components/users/UsersDashboard.tsx index 20d4bb1be2..7c365149ae 100644 --- a/apps/scoutgameadmin/components/users/UsersDashboard.tsx +++ b/apps/scoutgameadmin/components/users/UsersDashboard.tsx @@ -1,12 +1,17 @@ 'use client'; -import { ArrowDropDown as ArrowDropDownIcon, Add as AddIcon, Clear as ClearIcon } from '@mui/icons-material'; +import { + MoreHoriz as MoreHorizIcon, + ArrowDropDown as ArrowDropDownIcon, + Add as AddIcon, + Clear as ClearIcon +} from '@mui/icons-material'; import { CircularProgress, Container, InputAdornment, Link, - Typography, + Avatar, Paper, Stack, Table, @@ -18,6 +23,7 @@ import { TextField, Box, IconButton, + Typography, TableSortLabel } from '@mui/material'; import React, { useState, useMemo } from 'react'; @@ -28,7 +34,7 @@ import { useDebouncedValue } from 'hooks/useDebouncedValue'; import type { SortField, SortOrder, ScoutGameUser } from 'lib/users/getUsers'; import { AddUserButton } from './AddUserButton/AddUserButton'; -import { ViewTransactionsButton } from './ViewTransactionsButton/ViewTransactionsButton'; +import { UserActionButton } from './UserActionButton/UserActionButton'; export function UsersDashboard({ users }: { users: ScoutGameUser[] }) { const [filterString, setFilter] = useState(''); @@ -86,7 +92,7 @@ export function UsersDashboard({ users }: { users: ScoutGameUser[] }) { input: { endAdornment: ( - {(isLoading || isValidating) && } + {(isLoading || isValidating) && filterString && } {filterString && ( setFilter('')} edge='end'> @@ -112,25 +118,22 @@ export function UsersDashboard({ users }: { users: ScoutGameUser[] }) { handleSort('path')} - > - Username - + active={sortField === 'displayName'} + direction={sortField === 'displayName' ? sortOrder : 'asc'} + onClick={() => handleSort('displayName')} + > ID - Farcaster ID - + handleSort('builderStatus')} + active={sortField === 'nftsPurchased'} + direction={sortField === 'nftsPurchased' ? sortOrder : 'asc'} + onClick={() => handleSort('nftsPurchased')} > - Builder Status + NFTs Purchased - + - - handleSort('nftsPurchased')} - > - NFTs Purchased - - + + handleSort('builderStatus')} + > + Builder Status + + + {/** Actions */} {filteredAndSortedUsers.map((user) => ( - {user.path} - {user.id} - {user.farcasterId} - {user.builderStatus || 'N/A'} - {user.currentBalance} - - {user.nftsPurchased} - + + + {user.displayName} + + {user.id} + {user.nftsPurchased} + {user.currentBalance} {new Date(user.createdAt).toLocaleDateString()} + + {user?.builderStatus === 'approved' && Approved} + {user?.builderStatus === 'rejected' && Rejected} + {user?.builderStatus === 'banned' && Suspended} + {user?.builderStatus === 'applied' && Applied} + {!user?.builderStatus && } + + + + ))} diff --git a/apps/scoutgameadmin/components/users/ViewTransactionsButton/ViewTransactionsButton.tsx b/apps/scoutgameadmin/components/users/ViewTransactionsButton/ViewTransactionsButton.tsx deleted file mode 100644 index 2eb8704527..0000000000 --- a/apps/scoutgameadmin/components/users/ViewTransactionsButton/ViewTransactionsButton.tsx +++ /dev/null @@ -1,27 +0,0 @@ -'use client'; - -import { Button } from '@mui/material'; -import type { ButtonProps } from '@mui/material'; -import { useState } from 'react'; -import type { ReactNode } from 'react'; - -import { ViewTransactionsModal } from './ViewTransactionsModal'; - -export function ViewTransactionsButton({ - children, - scoutId, - ...props -}: { - children: ReactNode; - scoutId: string; -} & ButtonProps) { - const [isModalOpen, setIsModalOpen] = useState(false); - return ( - <> - - setIsModalOpen(false)} scoutId={scoutId} /> - - ); -} diff --git a/apps/scoutgameadmin/hooks/api/onchain.ts b/apps/scoutgameadmin/hooks/api/blockchain.ts similarity index 54% rename from apps/scoutgameadmin/hooks/api/onchain.ts rename to apps/scoutgameadmin/hooks/api/blockchain.ts index 412d045e9a..488cf00065 100644 --- a/apps/scoutgameadmin/hooks/api/onchain.ts +++ b/apps/scoutgameadmin/hooks/api/blockchain.ts @@ -3,9 +3,12 @@ import type { RepoSearchResult } from '../../app/api/github/search-repos/route'; import { useGET } from './helpers'; export function useGetScoutEvents(scoutId: string) { - return useGET(scoutId ? '/api/onchain/scout-events' : null, { scoutId }); + return useGET(scoutId ? '/api/blockchain/scout-events' : null, { scoutId }); } export function useGetTransactionStatus({ chainId, txHash }: { chainId: string; txHash: string }) { - return useGET(chainId && txHash ? '/api/onchain/transaction-status' : null, { chainId, txHash }); + return useGET(chainId && txHash ? '/api/blockchain/transaction-status' : null, { + chainId, + txHash + }); } diff --git a/apps/scoutgameadmin/hooks/api/repos.ts b/apps/scoutgameadmin/hooks/api/repos.ts index eaeb9d3417..eaa3e891c2 100644 --- a/apps/scoutgameadmin/hooks/api/repos.ts +++ b/apps/scoutgameadmin/hooks/api/repos.ts @@ -12,6 +12,6 @@ export function useSearchReposByOwnerFromGithub(owner: string) { return useGETImmutable(owner ? '/api/github/search-repos' : null, { owner }); } -export function useCreateRepo() { +export function useCreateRepos() { return usePOST<{ owner: string }>('/api/repos'); } diff --git a/apps/scoutgameadmin/hooks/api/users.ts b/apps/scoutgameadmin/hooks/api/users.ts index a41ce53ec4..aec2ba55e4 100644 --- a/apps/scoutgameadmin/hooks/api/users.ts +++ b/apps/scoutgameadmin/hooks/api/users.ts @@ -1,7 +1,9 @@ -import type { SearchUserResult } from 'lib/users/getUser'; +import type { CreateBuilderParams } from 'lib/users/createBuilder'; +import type { UserResult } from 'lib/users/getUser'; import type { ScoutGameUser, SortField, SortOrder, UserFilter } from 'lib/users/getUsers'; +import type { SearchUserResult } from 'lib/users/searchForUser'; -import { useGETImmutable, usePOST } from './helpers'; +import { useGETImmutable, useGET, usePOST } from './helpers'; export function useSearchUsers({ searchString, @@ -22,8 +24,16 @@ export function useSearchUsers({ }); } -export function useGetUser(searchString?: string) { - return useGETImmutable(searchString ? '/api/users/get-user' : null, { searchString }); +export function useSearchForUser(searchString?: string) { + return useGET(searchString ? '/api/users/search-for-user' : null, { searchString }); +} + +export function useGetUser(userId?: string) { + return useGET(userId ? '/api/users/get-user' : null, { userId }); +} + +export function useCreateBuilder() { + return usePOST('/api/users/create-builder'); } export function useCreateUser() { diff --git a/apps/scoutgameadmin/lib/contract/getContractData.ts b/apps/scoutgameadmin/lib/contract/getContractData.ts index a436f3befa..d3a51e8588 100644 --- a/apps/scoutgameadmin/lib/contract/getContractData.ts +++ b/apps/scoutgameadmin/lib/contract/getContractData.ts @@ -1,4 +1,4 @@ -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { builderContractReadonlyApiClient } from '@packages/scoutgame/builderNfts/clients/builderContractReadClient'; import { builderProxyContractReadonlyApiClient } from '@packages/scoutgame/builderNfts/clients/builderProxyContractReadClient'; import { diff --git a/apps/scoutgameadmin/lib/users/createBuilder.ts b/apps/scoutgameadmin/lib/users/createBuilder.ts new file mode 100644 index 0000000000..ca0c5ea577 --- /dev/null +++ b/apps/scoutgameadmin/lib/users/createBuilder.ts @@ -0,0 +1,50 @@ +import { prisma } from '@charmverse/core/prisma-client'; +import { octokit } from '@packages/github/client'; +import { approveBuilder } from '@packages/scoutgame/builders/approveBuilder'; + +export type CreateBuilderParams = { + userId: string; + githubLogin?: string; +}; + +export async function createBuilder(params: CreateBuilderParams) { + const scout = await prisma.scout.findUniqueOrThrow({ + where: { + id: params.userId + }, + include: { + githubUser: true + } + }); + if (!scout.githubUser && !params.githubLogin) { + throw new Error('Github login is required'); + } + if (params.githubLogin) { + const githubUser = await octokit.rest.users.getByUsername({ username: params.githubLogin }); + const githubUserDB = await prisma.githubUser.findUnique({ + where: { + id: githubUser.data.id + } + }); + if (githubUserDB) { + throw new Error('Github user already exists'); + } + + await prisma.githubUser.upsert({ + where: { + id: githubUser.data.id + }, + update: { + builderId: scout.id + }, + create: { + id: githubUser.data.id, + login: params.githubLogin, + displayName: githubUser.data.name, + email: githubUser.data.email, + builderId: scout.id + } + }); + } + await approveBuilder({ builderId: scout.id }); +} diff --git a/apps/scoutgameadmin/lib/users/createUser.ts b/apps/scoutgameadmin/lib/users/createUser.ts new file mode 100644 index 0000000000..cb0ea03817 --- /dev/null +++ b/apps/scoutgameadmin/lib/users/createUser.ts @@ -0,0 +1,71 @@ +import { log } from '@charmverse/core/log'; +import type { Scout } from '@charmverse/core/prisma-client'; +import { prisma } from '@charmverse/core/prisma-client'; +import { getFarcasterUserById } from '@packages/farcaster/getFarcasterUserById'; +import { octokit } from '@packages/github/client'; +import { findOrCreateFarcasterUser } from '@packages/scoutgame/users/findOrCreateFarcasterUser'; + +import type { SearchUserResult } from './searchForUser'; + +export async function createUser({ scout, waitlistUser, farcasterUser }: SearchUserResult): Promise { + if (scout) { + throw new Error('Scout user already exists'); + } + if (!scout && !waitlistUser && !farcasterUser) { + throw new Error('No input data provided to create a user'); + } + + // convert existing waitlist record to scout + if (waitlistUser) { + const githubUser = waitlistUser.githubLogin + ? await octokit.rest.users.getByUsername({ username: waitlistUser.githubLogin }) + : null; + const profile = await getFarcasterUserById(waitlistUser.fid); + if (!profile) { + throw new Error(`No Farcaster profile found for fid: ${waitlistUser.fid}`); + } + const displayName = profile.display_name; + const username = profile.username; + const avatarUrl = profile.pfp_url; + const bio = profile.profile.bio.text; + const githubUserDB = + githubUser && + (await prisma.githubUser.findUnique({ + where: { + id: githubUser.data.id + } + })); + return prisma.scout.create({ + data: { + displayName, + path: username, + avatar: avatarUrl, + bio, + builderStatus: 'applied', + farcasterId: waitlistUser.fid, + farcasterName: username, + githubUser: githubUserDB + ? { connect: { id: githubUserDB.id } } + : githubUser + ? { + create: { + id: githubUser.data.id, + login: githubUser.data.login, + displayName: githubUser.data.name, + email: githubUser.data.email + } + } + : undefined + } + }); + } else if (farcasterUser) { + const result = await findOrCreateFarcasterUser({ fid: farcasterUser.fid }); + const newScout = await prisma.scout.findUniqueOrThrow({ + where: { + id: result.id + } + }); + return newScout; + } + throw new Error('Unknown scenario when creating user'); +} diff --git a/apps/scoutgameadmin/lib/users/getUser.ts b/apps/scoutgameadmin/lib/users/getUser.ts index 1a5764ea45..2ccb8ce73b 100644 --- a/apps/scoutgameadmin/lib/users/getUser.ts +++ b/apps/scoutgameadmin/lib/users/getUser.ts @@ -1,68 +1,17 @@ -import type { ConnectWaitlistSlot, Scout } from '@charmverse/core/prisma-client'; +import type { Scout } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import type { FarcasterUser } from '@root/lib/farcaster/getFarcasterUsers'; -import { getFarcasterUsers } from '@root/lib/farcaster/getFarcasterUsers'; -import { getNumberFromString } from './getUsers'; - -export type SearchUserResult = { - scout?: Scout & { githubLogin?: string }; - waitlistUser?: ConnectWaitlistSlot; - farcasterUser?: FarcasterUser; -}; +export type UserResult = Scout & { githubLogin?: string }; // find a single user, from scouts or waitlist record. Eventually this doesnt need to search waitlist -export async function getUser({ searchString }: { searchString: string }): Promise { - if (searchString.length < 2) { - return null; - } - // assume farcaster id if search string is a number - const userFid = getNumberFromString(searchString); - if (userFid) { - const scout = await prisma.scout.findUnique({ - where: { - farcasterId: userFid - } - }); - if (scout) { - return { scout }; - } - const waitlistUser = await prisma.connectWaitlistSlot.findUnique({ - where: { - fid: userFid - } - }); - if (waitlistUser) { - return { waitlistUser }; - } - const farcasterUser = await getFarcasterUsers({ fids: [userFid] }); - if (farcasterUser[0]) { - return { farcasterUser: farcasterUser[0] }; - } - } - const user = await prisma.scout.findUnique({ +export async function getUser(userId: string): Promise { + const user = await prisma.scout.findFirst({ where: { - path: searchString + id: userId }, include: { githubUser: true } }); - if (user) { - return { scout: { ...user, githubLogin: user.githubUser[0]?.login } }; - } - const waitlistUser = await prisma.connectWaitlistSlot.findFirst({ - where: { - githubLogin: searchString - } - }); - if (waitlistUser) { - return { waitlistUser }; - } - const farcasterUsers = await getFarcasterUsers({ username: searchString }); - if (farcasterUsers[0]) { - return { farcasterUser: farcasterUsers[0] }; - } - - return null; + return user ? { ...user, githubLogin: user?.githubUser[0]?.login } : null; } diff --git a/apps/scoutgameadmin/lib/users/getUsers.ts b/apps/scoutgameadmin/lib/users/getUsers.ts index e4add317c0..48f356c495 100644 --- a/apps/scoutgameadmin/lib/users/getUsers.ts +++ b/apps/scoutgameadmin/lib/users/getUsers.ts @@ -1,14 +1,15 @@ import type { Scout } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; +import { validate } from 'uuid'; export type ScoutGameUser = Pick< Scout, - 'builderStatus' | 'path' | 'id' | 'avatar' | 'displayName' | 'createdAt' | 'farcasterId' | 'currentBalance' -> & { nftsPurchased: number }; + 'builderStatus' | 'path' | 'id' | 'avatar' | 'displayName' | 'createdAt' | 'farcasterName' | 'currentBalance' +> & { githubLogin: string | null; nftsPurchased: number }; export type UserFilter = 'only-builders'; -export type SortField = 'path' | 'builderStatus' | 'currentBalance' | 'nftsPurchased' | 'createdAt'; +export type SortField = 'displayName' | 'builderStatus' | 'currentBalance' | 'nftsPurchased' | 'createdAt'; export type SortOrder = 'asc' | 'desc'; export async function getUsers({ @@ -24,7 +25,7 @@ export async function getUsers({ } // assume farcaster id if search string is a number const userFid = getNumberFromString(searchString); - + const isScoutId = validate(searchString || ''); const users = await prisma.scout.findMany({ take: sortField === 'nftsPurchased' ? 1000 : 500, // return more for nft sort since we sort in the frontend orderBy: @@ -46,27 +47,32 @@ export async function getUsers({ : { createdAt: sortOrder || 'desc' }, where: userFid ? { farcasterId: userFid } - : typeof searchString === 'string' - ? { - path: { - contains: searchString, - mode: 'insensitive' + : isScoutId + ? { id: searchString } + : typeof searchString === 'string' + ? { + path: { + contains: searchString, + mode: 'insensitive' + } } - } - : filter === 'only-builders' - ? { builderStatus: { not: null } } - : undefined, + : filter === 'only-builders' + ? { builderStatus: { not: null } } + : undefined, include: { + githubUser: true, userSeasonStats: true } }); return users.map((user) => ({ ...user, + githubLogin: user.githubUser[0]?.login || null, nftsPurchased: user.userSeasonStats.find(({ season }) => season === '2024-W41')?.nftsPurchased || 0 })); } export function getNumberFromString(searchString?: string) { const userFidRaw = parseInt(searchString ?? '', 10); - return Number.isNaN(userFidRaw) ? undefined : userFidRaw; + const isEqualToItself = searchString === userFidRaw.toString(); // uuids like "055f1650-517b-484e-a1c0-c050ef5aae4a" can sometimes return a number, which we don't want + return Number.isNaN(userFidRaw) || !isEqualToItself ? undefined : userFidRaw; } diff --git a/apps/scoutgameadmin/lib/users/searchForUser.ts b/apps/scoutgameadmin/lib/users/searchForUser.ts new file mode 100644 index 0000000000..6e27e2e1d3 --- /dev/null +++ b/apps/scoutgameadmin/lib/users/searchForUser.ts @@ -0,0 +1,86 @@ +import type { ConnectWaitlistSlot, Scout } from '@charmverse/core/prisma-client'; +import { prisma } from '@charmverse/core/prisma-client'; +import type { FarcasterUser } from '@root/lib/farcaster/getFarcasterUsers'; +import { getFarcasterUsers } from '@root/lib/farcaster/getFarcasterUsers'; + +import { getNumberFromString } from './getUsers'; + +export type SearchUserResult = { + scout?: Scout & { githubLogin?: string }; + waitlistUser?: ConnectWaitlistSlot; + farcasterUser?: FarcasterUser; +}; + +// find a single user, from scouts or waitlist record. Eventually this doesnt need to search waitlist +export async function searchForUser({ searchString }: { searchString: string }): Promise { + if (searchString.length < 2) { + return null; + } + // assume farcaster id if search string is a number + // look for scout, then waitlist, then farcaster for a profile + const userFid = getNumberFromString(searchString); + if (userFid) { + const scout = await prisma.scout.findUnique({ + where: { + farcasterId: userFid + } + }); + if (scout) { + return { scout }; + } + const waitlistUser = await prisma.connectWaitlistSlot.findUnique({ + where: { + fid: userFid + } + }); + if (waitlistUser) { + return { waitlistUser }; + } + const farcasterUser = await getFarcasterUsers({ fids: [userFid] }); + if (farcasterUser[0]) { + return { farcasterUser: farcasterUser[0] }; + } + } + // check for scout by path + const user = await prisma.scout.findUnique({ + where: { + path: searchString + }, + include: { + githubUser: true + } + }); + if (user) { + return { scout: { ...user, githubLogin: user.githubUser[0]?.login } }; + } + // check for scout by name + const userByName = await prisma.scout.findFirst({ + where: { + displayName: { + equals: searchString, + mode: 'insensitive' + } + }, + include: { + githubUser: true + } + }); + if (userByName) { + return { scout: { ...userByName, githubLogin: userByName.githubUser[0]?.login } }; + } + // check for waitlist by github login or farcaster username + const waitlistUser = await prisma.connectWaitlistSlot.findFirst({ + where: { + OR: [{ githubLogin: searchString }, { username: searchString }] + } + }); + if (waitlistUser) { + return { waitlistUser }; + } + const farcasterUsers = await getFarcasterUsers({ username: searchString }); + if (farcasterUsers[0]) { + return { farcasterUser: farcasterUsers[0] }; + } + + return null; +} diff --git a/apps/scoutgameadmin/middleware.ts b/apps/scoutgameadmin/middleware.ts index 25857badf1..58753049bb 100644 --- a/apps/scoutgameadmin/middleware.ts +++ b/apps/scoutgameadmin/middleware.ts @@ -35,6 +35,6 @@ export const config = { * - images (image files) * - favicon.ico (favicon file) */ - '/((?!api|_next/static|_next/image|images|favicon.ico|robots.txt|__ENV.js|manifest.webmanifest).*)' + '/((?!api|_next/static|_next/image|images|favicon.ico|robots.txt|__ENV.js|manifest.webmanifest|nft-assets).*)' ] }; diff --git a/apps/scoutgameadmin/package.json b/apps/scoutgameadmin/package.json index a0ae5918b9..eb2ce31d62 100644 --- a/apps/scoutgameadmin/package.json +++ b/apps/scoutgameadmin/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@mui/lab": "^6.0.0-beta.11", - "@packages/onchain": "^0.0.0", + "@packages/blockchain": "^0.0.0", "@packages/scoutgame": "^0.0.0" } } diff --git a/apps/scoutgameadmin/public/images/icons/blue-fire-icon.svg b/apps/scoutgameadmin/public/images/icons/blue-fire-icon.svg new file mode 100644 index 0000000000..60bcd0fb65 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/blue-fire-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/card.svg b/apps/scoutgameadmin/public/images/icons/card.svg new file mode 100644 index 0000000000..c321ff704b --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/card.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/scoutgameadmin/public/images/icons/github-circle-icon.svg b/apps/scoutgameadmin/public/images/icons/github-circle-icon.svg new file mode 100644 index 0000000000..30bcc64cbd --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/github-circle-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/scoutgameadmin/public/images/icons/hex-gem-icon.svg b/apps/scoutgameadmin/public/images/icons/hex-gem-icon.svg new file mode 100644 index 0000000000..ecc2925327 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/hex-gem-icon.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/like-green-icon.svg b/apps/scoutgameadmin/public/images/icons/like-green-icon.svg new file mode 100644 index 0000000000..d629d2f5be --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/like-green-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/like-icon.svg b/apps/scoutgameadmin/public/images/icons/like-icon.svg new file mode 100644 index 0000000000..dbe11c7832 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/like-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/nft-green-icon.svg b/apps/scoutgameadmin/public/images/icons/nft-green-icon.svg new file mode 100644 index 0000000000..e9179f4ba9 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/nft-green-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/nft-orange-icon.svg b/apps/scoutgameadmin/public/images/icons/nft-orange-icon.svg new file mode 100644 index 0000000000..fb765f899b --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/nft-orange-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/scoutgameadmin/public/images/icons/optimism-icon.svg b/apps/scoutgameadmin/public/images/icons/optimism-icon.svg new file mode 100644 index 0000000000..b291fb2fd5 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/optimism-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/scout-icon.svg b/apps/scoutgameadmin/public/images/icons/scout-icon.svg new file mode 100644 index 0000000000..9636eb5330 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/scout-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/scoutgameadmin/public/images/icons/season1-icon.svg b/apps/scoutgameadmin/public/images/icons/season1-icon.svg new file mode 100644 index 0000000000..5d3616be7c --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/season1-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/scoutgameadmin/public/images/icons/warpcast-circle-icon.svg b/apps/scoutgameadmin/public/images/icons/warpcast-circle-icon.svg new file mode 100644 index 0000000000..718dbf8987 --- /dev/null +++ b/apps/scoutgameadmin/public/images/icons/warpcast-circle-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/scoutgameadmin/public/nft-assets/fonts/K2D-Medium.ttf b/apps/scoutgameadmin/public/nft-assets/fonts/K2D-Medium.ttf new file mode 100644 index 0000000000..667fefe0e4 Binary files /dev/null and b/apps/scoutgameadmin/public/nft-assets/fonts/K2D-Medium.ttf differ diff --git a/apps/scoutgameadmin/public/nft-assets/no_pfp_avatar.png b/apps/scoutgameadmin/public/nft-assets/no_pfp_avatar.png new file mode 100644 index 0000000000..2b16268316 Binary files /dev/null and b/apps/scoutgameadmin/public/nft-assets/no_pfp_avatar.png differ diff --git a/apps/scoutgameadmin/public/nft-assets/overlays/checked_corners.png b/apps/scoutgameadmin/public/nft-assets/overlays/checked_corners.png new file mode 100644 index 0000000000..17236b1ef3 Binary files /dev/null and b/apps/scoutgameadmin/public/nft-assets/overlays/checked_corners.png differ diff --git a/apps/scoutgameadmin/public/nft-assets/overlays/paint_splatter.png b/apps/scoutgameadmin/public/nft-assets/overlays/paint_splatter.png new file mode 100644 index 0000000000..640ee6012b Binary files /dev/null and b/apps/scoutgameadmin/public/nft-assets/overlays/paint_splatter.png differ diff --git a/apps/scoutgameadmin/public/nft-assets/overlays/rounded_square.png b/apps/scoutgameadmin/public/nft-assets/overlays/rounded_square.png new file mode 100644 index 0000000000..77e6be8d9d Binary files /dev/null and b/apps/scoutgameadmin/public/nft-assets/overlays/rounded_square.png differ diff --git a/apps/scoutgameadmin/public/nft-assets/overlays/scratch_reveal.png b/apps/scoutgameadmin/public/nft-assets/overlays/scratch_reveal.png new file mode 100644 index 0000000000..4e7da15e86 Binary files /dev/null and b/apps/scoutgameadmin/public/nft-assets/overlays/scratch_reveal.png differ diff --git a/apps/scoutgameadmin/theme/theme.tsx b/apps/scoutgameadmin/theme/theme.tsx index 7d8e6d71f4..68a47fbd35 100644 --- a/apps/scoutgameadmin/theme/theme.tsx +++ b/apps/scoutgameadmin/theme/theme.tsx @@ -91,8 +91,7 @@ const themeOptions: Parameters[0] = { MuiFormLabel: { styleOverrides: { root: ({ theme }) => ({ - color: theme.palette.text.primary, - marginBottom: 5 + color: theme.palette.text.primary }) } }, @@ -176,6 +175,13 @@ const themeOptions: Parameters[0] = { } }, MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + '&:hover': { + backgroundColor: theme.vars.palette.inputBackground.main + } + }) + }, defaultProps: { disableRipple: true } @@ -232,11 +238,6 @@ const themeOptions: Parameters[0] = { } } }, - MuiInput: { - defaultProps: { - size: 'small' - } - }, MuiSkeleton: { styleOverrides: { root: { @@ -245,9 +246,6 @@ const themeOptions: Parameters[0] = { } }, MuiOutlinedInput: { - defaultProps: { - size: 'small' - }, styleOverrides: { root: ({ theme }) => ({ backgroundColor: inputBackgroundDarkMode, diff --git a/apps/scoutgamecron/package.json b/apps/scoutgamecron/package.json index a6fddf5d87..f6eb3a3710 100644 --- a/apps/scoutgamecron/package.json +++ b/apps/scoutgamecron/package.json @@ -19,7 +19,6 @@ "@packages/github": "^0.0.0", "@packages/mailer": "^0.0.0", "@packages/mixpanel": "^0.0.0", - "@packages/onchain": "^0.0.0", "@packages/scoutgame": "^0.0.0", "@packages/utils": "^1.0.0", "web-push": "^3.6.7" diff --git a/apps/scoutgamecron/src/tasks/resolveMissingPurchases/resolveMissingPurchases.ts b/apps/scoutgamecron/src/tasks/resolveMissingPurchases/resolveMissingPurchases.ts index 454d9737e5..c1b7569692 100644 --- a/apps/scoutgamecron/src/tasks/resolveMissingPurchases/resolveMissingPurchases.ts +++ b/apps/scoutgamecron/src/tasks/resolveMissingPurchases/resolveMissingPurchases.ts @@ -1,6 +1,6 @@ import { log } from '@charmverse/core/log'; import { arrayUtils } from '@charmverse/core/utilities'; -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { builderNftChain } from '@packages/scoutgame/builderNfts/constants'; import type { BuilderScoutedEvent } from '@packages/scoutgame/builderNfts/getOnchainPurchaseEvents'; import { getAndParseNftMintLogs } from '@packages/scoutgame/builderNfts/getOnchainPurchaseEvents'; diff --git a/apps/sunnyawards/app/api/aws/upload-token/route.ts b/apps/sunnyawards/app/api/aws/upload-token/route.ts index 6561263adf..0995eb76a7 100644 --- a/apps/sunnyawards/app/api/aws/upload-token/route.ts +++ b/apps/sunnyawards/app/api/aws/upload-token/route.ts @@ -1,5 +1,5 @@ -import { uploadToken } from '@connect-shared/lib/aws/uploadToken'; import { getSession } from '@connect-shared/lib/session/getSession'; +import { uploadToken } from '@packages/aws/uploadToken'; export async function GET(request: Request) { const { searchParams } = new URL(request.url); @@ -15,7 +15,7 @@ export async function GET(request: Request) { } try { - const tokenData = await uploadToken(filename, userId); + const tokenData = await uploadToken({ filename, userId }); return Response.json(tokenData); } catch (error: any) { diff --git a/apps/sunnyawards/components/common/ClientGlobals.tsx b/apps/sunnyawards/components/common/ClientGlobals.tsx index cdb4eb5781..15fedaa9f1 100644 --- a/apps/sunnyawards/components/common/ClientGlobals.tsx +++ b/apps/sunnyawards/components/common/ClientGlobals.tsx @@ -1,9 +1,10 @@ 'use client'; -import { useDarkTheme } from '@connect-shared/hooks/useDarkTheme'; import { usePageView } from '@connect-shared/hooks/usePageView'; import { useDatadogLogger } from '@root/hooks/useDatadogLogger'; +import { useDarkTheme } from 'hooks/useDarkTheme'; + // instantiate global hooks for the client-side only export function ClientGlobals({ userId }: { userId?: string }) { useDatadogLogger({ service: 'sunnyawards-browser', userId }); diff --git a/@connect-shared/hooks/useDarkTheme.ts b/apps/sunnyawards/hooks/useDarkTheme.ts similarity index 100% rename from @connect-shared/hooks/useDarkTheme.ts rename to apps/sunnyawards/hooks/useDarkTheme.ts diff --git a/apps/sunnyawards/lib/projects/createProject.ts b/apps/sunnyawards/lib/projects/createProject.ts index 91dfe991f9..2a0aeaa589 100644 --- a/apps/sunnyawards/lib/projects/createProject.ts +++ b/apps/sunnyawards/lib/projects/createProject.ts @@ -1,7 +1,7 @@ import { InvalidInputError } from '@charmverse/core/errors'; import type { OptionalPrismaTransaction, Prisma, Project, ProjectSource } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { resolveENSName } from '@root/lib/blockchain'; +import { resolveENSName } from '@packages/blockchain/getENSName'; import { ensureFarcasterUserExists } from '@root/lib/farcaster/ensureFarcasterUserExists'; import { generatePagePathFromPathAndTitle } from '@root/lib/pages/utils'; import { stringToValidPath, uid } from '@root/lib/utils/strings'; diff --git a/apps/sunnyawards/lib/projects/editProject.ts b/apps/sunnyawards/lib/projects/editProject.ts index f31f11421d..daee2bbcdd 100644 --- a/apps/sunnyawards/lib/projects/editProject.ts +++ b/apps/sunnyawards/lib/projects/editProject.ts @@ -1,7 +1,7 @@ import { InvalidInputError } from '@charmverse/core/errors'; import type { Project } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { resolveENSName } from '@root/lib/blockchain'; +import { resolveENSName } from '@packages/blockchain/getENSName'; import { ensureFarcasterUserExists } from '@root/lib/farcaster/ensureFarcasterUserExists'; import { isTruthy } from '@root/lib/utils/types'; diff --git a/apps/sunnyawards/lib/session/createOrGetUserWithWallet.ts b/apps/sunnyawards/lib/session/createOrGetUserWithWallet.ts index 220871577c..f998f327f1 100644 --- a/apps/sunnyawards/lib/session/createOrGetUserWithWallet.ts +++ b/apps/sunnyawards/lib/session/createOrGetUserWithWallet.ts @@ -1,7 +1,7 @@ import { log } from '@charmverse/core/log'; import type { User } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { getENSName } from '@root/lib/blockchain/getENSName'; +import { getENSName } from '@packages/blockchain/getENSName'; import { logSignupViaWallet } from '@root/lib/metrics/postToDiscord'; import { isProfilePathAvailable } from '@root/lib/profile/isProfilePathAvailable'; import { sessionUserRelations } from '@root/lib/session/config'; diff --git a/apps/sunnyawards/package.json b/apps/sunnyawards/package.json index 65735b8927..f9134e01c6 100644 --- a/apps/sunnyawards/package.json +++ b/apps/sunnyawards/package.json @@ -15,6 +15,7 @@ "dependencies": { "@hookform/resolvers": "^3.6.0", "@mui/material-nextjs": "^6.1.0", + "@packages/blockchain": "^0.0.0", "@typeschema/yup": "^0.13.3", "framer-motion": "^11.5.4", "next-safe-action": "~7.4.2", diff --git a/jest.setup.ts b/jest.setup.ts index cf6efbc0f2..2413f3e644 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -8,8 +8,8 @@ afterAll(() => { // Mock external requests globally -jest.mock('lib/blockchain/getENSName', () => ({ - ...jest.requireActual('lib/blockchain/getENSName'), +jest.mock('@packages/blockchain/getENSName', () => ({ + ...jest.requireActual('@packages/blockchain/getENSName'), __esModule: true, getENSName: jest.fn().mockImplementation(() => Promise.resolve(null)), getENSDetails: jest.fn().mockImplementation(() => Promise.resolve(null)), diff --git a/lib/aws/uploadToS3Server.ts b/lib/aws/uploadToS3Server.ts index 1cedc46a70..fa2abf57b3 100644 --- a/lib/aws/uploadToS3Server.ts +++ b/lib/aws/uploadToS3Server.ts @@ -5,9 +5,10 @@ import type { PutObjectCommandInput } from '@aws-sdk/client-s3'; import { S3Client } from '@aws-sdk/client-s3'; import { Upload } from '@aws-sdk/lib-storage'; import { awsS3Bucket } from '@root/config/constants'; -import { getS3ClientConfig } from '@root/lib/aws/getS3ClientConfig'; import { v4 as uuid } from 'uuid'; +import { getS3ClientConfig } from './getS3ClientConfig'; + const client = new S3Client(getS3ClientConfig()); export async function uploadFileToS3(file: { pathInS3: string; content: Buffer; contentType?: string }) { @@ -67,3 +68,11 @@ export function getUserS3FilePath({ userId, url }: { userId: string; url: string export function getFarcasterAppFilePath({ url }: { url: string }) { return `farcaster-app/${uuid()}/${generateFilename(url)}`; } + +export const getFilenameWithExtension = (path: string, fallbackExtension = 'jpg'): string => { + const pathParts = path.split('/'); + const rawName = pathParts.pop() || ''; + const [name, extension] = rawName.split('.'); + + return `${pathParts.join('/')}/${name}.${extension?.toLowerCase() || fallbackExtension}`; +}; diff --git a/lib/blockchain/__tests__/refreshENSName.spec.ts b/lib/blockchain/__tests__/refreshENSName.spec.ts index 7b3258ac76..7aec64b613 100644 --- a/lib/blockchain/__tests__/refreshENSName.spec.ts +++ b/lib/blockchain/__tests__/refreshENSName.spec.ts @@ -9,7 +9,7 @@ import { randomETHWalletAddress } from 'testing/generateStubs'; import { refreshENSName } from '../refreshENSName'; -jest.mock('../getENSName', () => { +jest.mock('@packages/blockchain/getENSName', () => { return { getENSName: (address: string) => { if (address.match('different')) { diff --git a/lib/blockchain/index.ts b/lib/blockchain/index.ts deleted file mode 100644 index a5dd0ab331..0000000000 --- a/lib/blockchain/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './getENSName'; diff --git a/lib/blockchain/refreshENSName.ts b/lib/blockchain/refreshENSName.ts index ab67e0b343..bc63f71249 100644 --- a/lib/blockchain/refreshENSName.ts +++ b/lib/blockchain/refreshENSName.ts @@ -1,12 +1,11 @@ import { log } from '@charmverse/core/log'; import { prisma } from '@charmverse/core/prisma-client'; +import { getENSName } from '@packages/blockchain/getENSName'; import { getUserProfile } from '@root/lib/profile/getUser'; import type { LoggedInUser } from '@root/lib/profile/getUser'; import { matchWalletAddress, shortWalletAddress } from '@root/lib/utils/blockchain'; import { InvalidInputError, MissingDataError } from '@root/lib/utils/errors'; -import { getENSName } from './getENSName'; - export type ENSUserNameRefresh = { userId: string; address: string; diff --git a/lib/optimism/createProject.ts b/lib/optimism/createProject.ts index 3bd4337673..9256012fdd 100644 --- a/lib/optimism/createProject.ts +++ b/lib/optimism/createProject.ts @@ -1,7 +1,7 @@ import { InvalidInputError } from '@charmverse/core/errors'; import type { OptionalPrismaTransaction, Prisma, Project, ProjectSource } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { resolveENSName } from '@root/lib/blockchain'; +import { resolveENSName } from '@packages/blockchain/getENSName'; import { ensureFarcasterUserExists } from '@root/lib/farcaster/ensureFarcasterUserExists'; import { generatePagePathFromPathAndTitle } from '@root/lib/pages/utils'; import { stringToValidPath, uid } from '@root/lib/utils/strings'; diff --git a/lib/optimism/editProject.ts b/lib/optimism/editProject.ts index a7d584e2c6..1733edf272 100644 --- a/lib/optimism/editProject.ts +++ b/lib/optimism/editProject.ts @@ -1,7 +1,7 @@ import { InvalidInputError } from '@charmverse/core/errors'; import type { Project } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { resolveENSName } from '@root/lib/blockchain'; +import { resolveENSName } from '@packages/blockchain/getENSName'; import { ensureFarcasterUserExists } from '@root/lib/farcaster/ensureFarcasterUserExists'; import { isTruthy } from '@root/lib/utils/types'; diff --git a/lib/profile/__tests__/getEnsProfile.spec.ts b/lib/profile/__tests__/getEnsProfile.spec.ts index c4423e142c..e4befa92fe 100644 --- a/lib/profile/__tests__/getEnsProfile.spec.ts +++ b/lib/profile/__tests__/getEnsProfile.spec.ts @@ -1,12 +1,12 @@ import { prisma } from '@charmverse/core/prisma-client'; -import { getENSDetails } from '@root/lib/blockchain'; +import { getENSDetails } from '@packages/blockchain/getENSName'; import { randomETHWalletAddress } from '@root/lib/utils/blockchain'; import { generateUserAndSpaceWithApiToken } from 'testing/setupDatabase'; import { getEnsProfile } from '../getEnsProfile'; -jest.mock('../../blockchain/getENSName', () => ({ +jest.mock('@packages/blockchain/getENSName', () => ({ getENSDetails: jest.fn().mockResolvedValue({ avatar: 'https://test-avatar.png', description: 'my bio', diff --git a/lib/profile/getEnsProfile.ts b/lib/profile/getEnsProfile.ts index 36e696588e..7768d6f4cf 100644 --- a/lib/profile/getEnsProfile.ts +++ b/lib/profile/getEnsProfile.ts @@ -1,5 +1,5 @@ import { prisma } from '@charmverse/core/prisma-client'; -import { getENSDetails } from '@root/lib/blockchain/getENSName'; +import { getENSDetails } from '@packages/blockchain/getENSName'; export type EnsProfile = { ensname: string | null; diff --git a/lib/projects/getProjectMemberCreateTransaction.ts b/lib/projects/getProjectMemberCreateTransaction.ts index dc933ff024..2e87e0dd23 100644 --- a/lib/projects/getProjectMemberCreateTransaction.ts +++ b/lib/projects/getProjectMemberCreateTransaction.ts @@ -1,7 +1,7 @@ import type { ProjectMember } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; import { stringUtils } from '@charmverse/core/utilities'; -import { getENSName } from '@root/lib/blockchain'; +import { getENSName } from '@packages/blockchain/getENSName'; import { isProfilePathAvailable } from '@root/lib/profile/isProfilePathAvailable'; import { shortWalletAddress } from '@root/lib/utils/blockchain'; import { uid } from '@root/lib/utils/strings'; diff --git a/lib/users/__tests__/createUser.spec.ts b/lib/users/__tests__/createUser.spec.ts index fe38d9723e..83c6e28859 100644 --- a/lib/users/__tests__/createUser.spec.ts +++ b/lib/users/__tests__/createUser.spec.ts @@ -6,7 +6,7 @@ import { randomETHWalletAddress } from 'testing/generateStubs'; import { createOrGetUserFromWallet } from '../createUser'; -jest.mock('lib/blockchain/getENSName', () => { +jest.mock('@packages/blockchain/getENSName', () => { return { getENSName: (address: string) => { if (address.match('include')) { diff --git a/lib/users/createUser.ts b/lib/users/createUser.ts index 521751445e..b30084cfe3 100644 --- a/lib/users/createUser.ts +++ b/lib/users/createUser.ts @@ -1,6 +1,6 @@ import { log } from '@charmverse/core/log'; import { prisma } from '@charmverse/core/prisma-client'; -import { getENSName } from '@root/lib/blockchain/getENSName'; +import { getENSName } from '@packages/blockchain/getENSName'; import type { SignupAnalytics } from '@root/lib/metrics/mixpanel/interfaces/UserEvent'; import { logSignupViaWallet } from '@root/lib/metrics/postToDiscord'; import type { LoggedInUser } from '@root/lib/profile/getUser'; diff --git a/lib/users/prepopulateUserProfile.ts b/lib/users/prepopulateUserProfile.ts index 03a6b72ea0..6ccaaa3879 100644 --- a/lib/users/prepopulateUserProfile.ts +++ b/lib/users/prepopulateUserProfile.ts @@ -1,7 +1,7 @@ import { log } from '@charmverse/core/log'; import type { User } from '@charmverse/core/prisma'; import { prisma } from '@charmverse/core/prisma-client'; -import { getENSDetails } from '@root/lib/blockchain'; +import { getENSDetails } from '@packages/blockchain/getENSName'; import { getUserNFTs } from '@root/lib/profile/getUserNFTs'; import { updateProfileAvatar } from '@root/lib/profile/updateProfileAvatar'; import { uniqBy } from 'lodash'; diff --git a/package-lock.json b/package-lock.json index 7a2f6e9729..5eaa320502 100644 --- a/package-lock.json +++ b/package-lock.json @@ -352,6 +352,7 @@ "license": "ISC", "dependencies": { "@mui/material-nextjs": "^6.1.0", + "@packages/aws": "file:../packages/aws", "framer-motion": "^11.3.17", "next-safe-action": "~7.4.2" } @@ -782,7 +783,7 @@ "version": "0.1.0", "dependencies": { "@mui/lab": "^6.0.0-beta.11", - "@packages/onchain": "^0.0.0", + "@packages/blockchain": "^0.0.0", "@packages/scoutgame": "^0.0.0" } }, @@ -1038,7 +1039,6 @@ "@packages/github": "^0.0.0", "@packages/mailer": "^0.0.0", "@packages/mixpanel": "^0.0.0", - "@packages/onchain": "^0.0.0", "@packages/scoutgame": "^0.0.0", "@packages/utils": "^1.0.0", "web-push": "^3.6.7" @@ -1094,6 +1094,7 @@ "dependencies": { "@hookform/resolvers": "^3.6.0", "@mui/material-nextjs": "^6.1.0", + "@packages/blockchain": "^0.0.0", "@typeschema/yup": "^0.13.3", "framer-motion": "^11.5.4", "next-safe-action": "~7.4.2", @@ -18511,6 +18512,14 @@ "node": ">=14" } }, + "node_modules/@packages/aws": { + "resolved": "packages/aws", + "link": true + }, + "node_modules/@packages/blockchain": { + "resolved": "packages/blockchain", + "link": true + }, "node_modules/@packages/charmeditor": { "resolved": "packages/charmeditor", "link": true @@ -18531,10 +18540,6 @@ "resolved": "packages/mixpanel", "link": true }, - "node_modules/@packages/onchain": { - "resolved": "packages/onchain", - "link": true - }, "node_modules/@packages/scoutgame": { "resolved": "packages/scoutgame", "link": true @@ -70079,6 +70084,1282 @@ } } }, + "packages/aws": { + "name": "@packages/aws", + "version": "0.0.0", + "dependencies": { + "@aws-sdk/client-s3": "^3.682.0", + "@aws-sdk/lib-storage": "^3.682.0", + "@aws-sdk/xhr-http-handler": "^3.679.0" + } + }, + "packages/aws/node_modules/@aws-sdk/client-s3": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.682.0.tgz", + "integrity": "sha512-gn8yPhOmExhqRENnR/vKvsbTw9jaRPbfNE8fQ2j91ejXhpj632QDNdobY8TxxPm2UEW2ISAVM55r2/UPl0YP1Q==", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/client-sts": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-bucket-endpoint": "3.679.0", + "@aws-sdk/middleware-expect-continue": "3.679.0", + "@aws-sdk/middleware-flexible-checksums": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-location-constraint": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-sdk-s3": "3.682.0", + "@aws-sdk/middleware-ssec": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/signature-v4-multi-region": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@aws-sdk/xml-builder": "3.679.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/eventstream-serde-browser": "^3.0.10", + "@smithy/eventstream-serde-config-resolver": "^3.0.7", + "@smithy/eventstream-serde-node": "^3.0.9", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-blob-browser": "^3.1.6", + "@smithy/hash-node": "^3.0.7", + "@smithy/hash-stream-node": "^3.1.6", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/md5-js": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/client-sso": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.682.0.tgz", + "integrity": "sha512-PYH9RFUMYLFl66HSBq4tIx6fHViMLkhJHTYJoJONpBs+Td+NwVJ895AdLtDsBIhMS0YseCbPpuyjUCJgsUrwUw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.682.0.tgz", + "integrity": "sha512-ZPZ7Y/r/w3nx/xpPzGSqSQsB090Xk5aZZOH+WBhTDn/pBEuim09BYXCLzvvxb7R7NnuoQdrTJiwimdJAhHl7ZQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.682.0" + } + }, + "packages/aws/node_modules/@aws-sdk/client-sts": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.682.0.tgz", + "integrity": "sha512-xKuo4HksZ+F8m9DOfx/ZuWNhaPuqZFPwwy0xqcBT6sWH7OAuBjv/fnpOTzyQhpVTWddlf+ECtMAMrxjxuOExGQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/core": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.679.0.tgz", + "integrity": "sha512-CS6PWGX8l4v/xyvX8RtXnBisdCa5+URzKd0L6GvHChype9qKUVxO/Gg6N/y43Hvg7MNWJt9FBPNWIxUB+byJwg==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.679.0.tgz", + "integrity": "sha512-EdlTYbzMm3G7VUNAMxr9S1nC1qUNqhKlAxFU8E7cKsAe8Bp29CD5HAs3POc56AVo9GC4yRIS+/mtlZSmrckzUA==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.679.0.tgz", + "integrity": "sha512-ZoKLubW5DqqV1/2a3TSn+9sSKg0T8SsYMt1JeirnuLJF0mCoYFUaWMyvxxKuxPoqvUsaycxKru4GkpJ10ltNBw==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.682.0.tgz", + "integrity": "sha512-6eqWeHdK6EegAxqDdiCi215nT3QZPwukgWAYuVxNfJ/5m0/P7fAzF+D5kKVgByUvGJEbq/FEL8Fw7OBe64AA+g==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.682.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.682.0.tgz", + "integrity": "sha512-HSmDqZcBVZrTctHCT9m++vdlDfJ1ARI218qmZa+TZzzOFNpKWy6QyHMEra45GB9GnkkMmV6unoDSPMuN0AqcMg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-ini": "3.682.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.679.0.tgz", + "integrity": "sha512-u/p4TV8kQ0zJWDdZD4+vdQFTMhkDEJFws040Gm113VHa/Xo1SYOjbpvqeuFoz6VmM0bLvoOWjxB9MxnSQbwKpQ==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.682.0.tgz", + "integrity": "sha512-h7IH1VsWgV6YAJSWWV6y8uaRjGqLY3iBpGZlXuTH/c236NMLaNv+WqCBLeBxkFGUb2WeQ+FUPEJDCD69rgLIkg==", + "dependencies": { + "@aws-sdk/client-sso": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/token-providers": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.679.0.tgz", + "integrity": "sha512-a74tLccVznXCaBefWPSysUcLXYJiSkeUmQGtalNgJ1vGkE36W5l/8czFiiowdWdKWz7+x6xf0w+Kjkjlj42Ung==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.679.0" + } + }, + "packages/aws/node_modules/@aws-sdk/lib-storage": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.682.0.tgz", + "integrity": "sha512-MtG/uE5iVpxW+nC+QZTbQhoMWdDNXtAtPaO6vTNvc+q8PWvOnIjY3KmaFpEC1CbHYSFvRdidGL33iONWX18ZYg==", + "dependencies": { + "@smithy/abort-controller": "^3.1.5", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/smithy-client": "^3.4.0", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.682.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.679.0.tgz", + "integrity": "sha512-5EpiPhhGgnF+uJR4DzWUk6Lx3pOn9oM6JGXxeHsiynfoBfq7vHMleq+uABHHSQS+y7XzbyZ7x8tXNQlliMwOsg==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-arn-parser": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.679.0.tgz", + "integrity": "sha512-nYsh9PdWrF4EahTRdXHGlNud82RPc508CNGdh1lAGfPU3tNveGfMBX3PcGBtPOse3p9ebNKRWVmUc9eXSjGvHA==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.682.0.tgz", + "integrity": "sha512-5u1STth6iZUtAvPDO0NJVYKUX2EYKU7v84MYYaZ3O27HphRjFqDos0keL2KTnHn/KmMD68rM3yiUareWR8hnAQ==", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.679.0.tgz", + "integrity": "sha512-y176HuQ8JRY3hGX8rQzHDSbCl9P5Ny9l16z4xmaiLo+Qfte7ee4Yr3yaAKd7GFoJ3/Mhud2XZ37fR015MfYl2w==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.679.0.tgz", + "integrity": "sha512-SA1C1D3XgoKTGxyNsOqd016ONpk46xJLWDgJUd00Zb21Ox5wYCoY6aDRKiaMRW+1VfCJdezs1Do3XLyIU9KxyA==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-logger": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.679.0.tgz", + "integrity": "sha512-0vet8InEj7nvIvGKk+ch7bEF5SyZ7Us9U7YTEgXPrBNStKeRUsgwRm0ijPWWd0a3oz2okaEwXsFl7G/vI0XiEA==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.679.0.tgz", + "integrity": "sha512-sQoAZFsQiW/LL3DfKMYwBoGjYDEnMbA9WslWN8xneCmBAwKo6IcSksvYs23PP8XMIoBGe2I2J9BSr654XWygTQ==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.682.0.tgz", + "integrity": "sha512-Tqndx8elRD4xDR8f5Cng6jpZ/odcm1ZTOtGRFMzHgOCij4BeMf4+/+ecQScobcrAZpUTCUTCzaTvdCdJw8MYJA==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-arn-parser": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.679.0.tgz", + "integrity": "sha512-4GNUxXbs1M71uFHRiCAZtN0/g23ogI9YjMe5isAuYMHXwDB3MhqF7usKf954mBP6tplvN44vYlbJ84faaLrTtg==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.682.0.tgz", + "integrity": "sha512-7TyvYR9HdGH1/Nq0eeApUTM4izB6rExiw87khVYuJwZHr6FmvIL1FsOVFro/4WlXa0lg4LiYOm/8H8dHv+fXTg==", + "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.679.0.tgz", + "integrity": "sha512-Ybx54P8Tg6KKq5ck7uwdjiKif7n/8g1x+V0V9uTjBjRWqaIgiqzXwKWoPj6NCNkE7tJNtqI4JrNxp/3S3HvmRw==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.682.0.tgz", + "integrity": "sha512-y7RAQSCb9pH8wCX5We9UXfiqPVwBLLvSljhuXC31mibHmYaZnpNEwHiQlRNQPblyaNpiKnXXQ0H3Ns3FDyDYdQ==", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/token-providers": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.679.0.tgz", + "integrity": "sha512-1/+Zso/x2jqgutKixYFQEGli0FELTgah6bm7aB+m2FAWH4Hz7+iMUsazg6nSWm714sG9G3h5u42Dmpvi9X6/hA==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.679.0" + } + }, + "packages/aws/node_modules/@aws-sdk/types": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.679.0.tgz", + "integrity": "sha512-NwVq8YvInxQdJ47+zz4fH3BRRLC6lL+WLkvr242PVBbUOLRyK/lkwHlfiKUoeVIMyK5NF+up6TRg71t/8Bny6Q==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.679.0.tgz", + "integrity": "sha512-CwzEbU8R8rq9bqUFryO50RFBlkfufV9UfMArHPWlo+lmsC+NlSluHQALoj6Jkq3zf5ppn1CN0c1DDLrEqdQUXg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/util-endpoints": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.679.0.tgz", + "integrity": "sha512-YL6s4Y/1zC45OvddvgE139fjeWSKKPgLlnfrvhVL7alNyY9n7beR4uhoDpNrt5mI6sn9qiBF17790o+xLAXjjg==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.679.0.tgz", + "integrity": "sha512-CusSm2bTBG1kFypcsqU8COhnYc6zltobsqs3nRrvYqYaOqtMnuE46K4XTWpnzKgwDejgZGOE+WYyprtAxrPvmQ==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.682.0.tgz", + "integrity": "sha512-so5s+j0gPoTS0HM4HPL+G0ajk0T6cQAg8JXzRgvyiQAxqie+zGCZAV3VuVeMNWMVbzsgZl0pYZaatPFTLG/AxA==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "packages/aws/node_modules/@aws-sdk/xhr-http-handler": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xhr-http-handler/-/xhr-http-handler-3.679.0.tgz", + "integrity": "sha512-WKT8lXKCIyYYv2TwZztyChDfkWjPz0Uy+YyY0vYLg7klKrTGtrnKDdK2LWjnTcqCuYzLJmz9ulFt/Cv77Gp8rQ==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "events": "3.3.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@aws-sdk/xml-builder": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.679.0.tgz", + "integrity": "sha512-nPmhVZb39ty5bcQ7mAwtjezBcsBqTYZ9A2D9v/lE92KCLdu5RhSkPH7O71ZqbZx1mUSg9fAOxHPiG79U5VlpLQ==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/chunked-blob-reader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", + "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/chunked-blob-reader-native": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", + "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", + "dependencies": { + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/config-resolver": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz", + "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/credential-provider-imds": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz", + "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/eventstream-codec": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz", + "integrity": "sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/eventstream-serde-browser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz", + "integrity": "sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz", + "integrity": "sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/eventstream-serde-node": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz", + "integrity": "sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/eventstream-serde-universal": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz", + "integrity": "sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==", + "dependencies": { + "@smithy/eventstream-codec": "^3.1.7", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/hash-blob-browser": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.7.tgz", + "integrity": "sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==", + "dependencies": { + "@smithy/chunked-blob-reader": "^4.0.0", + "@smithy/chunked-blob-reader-native": "^3.0.1", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/hash-node": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.8.tgz", + "integrity": "sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/hash-stream-node": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.7.tgz", + "integrity": "sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/invalid-dependency": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz", + "integrity": "sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/md5-js": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.8.tgz", + "integrity": "sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/middleware-content-length": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz", + "integrity": "sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/middleware-retry": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", + "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.5", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-retry": "^3.0.8", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "dependencies": { + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/service-error-classification": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", + "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", + "dependencies": { + "@smithy/types": "^3.6.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz", + "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==", + "dependencies": { + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/aws/node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz", + "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==", + "dependencies": { + "@smithy/config-resolver": "^3.0.10", + "@smithy/credential-provider-imds": "^3.2.5", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/aws/node_modules/@smithy/util-endpoints": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz", + "integrity": "sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/util-retry": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", + "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", + "dependencies": { + "@smithy/service-error-classification": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/aws/node_modules/@smithy/util-waiter": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.7.tgz", + "integrity": "sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/aws/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/blockchain": { + "name": "@packages/blockchain", + "version": "0.0.0" + }, "packages/charmeditor": { "name": "@packages/charmeditor", "version": "1.0.0", @@ -70119,15 +71400,17 @@ }, "packages/onchain": { "name": "@packages/onchain", - "version": "0.0.0" + "version": "0.0.0", + "extraneous": true }, "packages/scoutgame": { "name": "@packages/scoutgame", "version": "0.0.0", "dependencies": { + "@packages/aws": "^0.0.0", + "@packages/blockchain": "^0.0.0", "@packages/farcaster": "^0.0.0", "@packages/github": "^0.0.0", - "@packages/onchain": "^0.0.0", "@packages/utils": "^1.0.0" } }, @@ -83246,6 +84529,1062 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==" }, + "@packages/aws": { + "version": "file:packages/aws", + "requires": { + "@aws-sdk/client-s3": "^3.682.0", + "@aws-sdk/lib-storage": "^3.682.0", + "@aws-sdk/xhr-http-handler": "^3.679.0" + }, + "dependencies": { + "@aws-sdk/client-s3": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.682.0.tgz", + "integrity": "sha512-gn8yPhOmExhqRENnR/vKvsbTw9jaRPbfNE8fQ2j91ejXhpj632QDNdobY8TxxPm2UEW2ISAVM55r2/UPl0YP1Q==", + "requires": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/client-sts": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-bucket-endpoint": "3.679.0", + "@aws-sdk/middleware-expect-continue": "3.679.0", + "@aws-sdk/middleware-flexible-checksums": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-location-constraint": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-sdk-s3": "3.682.0", + "@aws-sdk/middleware-ssec": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/signature-v4-multi-region": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@aws-sdk/xml-builder": "3.679.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/eventstream-serde-browser": "^3.0.10", + "@smithy/eventstream-serde-config-resolver": "^3.0.7", + "@smithy/eventstream-serde-node": "^3.0.9", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-blob-browser": "^3.1.6", + "@smithy/hash-node": "^3.0.7", + "@smithy/hash-stream-node": "^3.1.6", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/md5-js": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.6", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/client-sso": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.682.0.tgz", + "integrity": "sha512-PYH9RFUMYLFl66HSBq4tIx6fHViMLkhJHTYJoJONpBs+Td+NwVJ895AdLtDsBIhMS0YseCbPpuyjUCJgsUrwUw==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.682.0.tgz", + "integrity": "sha512-ZPZ7Y/r/w3nx/xpPzGSqSQsB090Xk5aZZOH+WBhTDn/pBEuim09BYXCLzvvxb7R7NnuoQdrTJiwimdJAhHl7ZQ==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/client-sts": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.682.0.tgz", + "integrity": "sha512-xKuo4HksZ+F8m9DOfx/ZuWNhaPuqZFPwwy0xqcBT6sWH7OAuBjv/fnpOTzyQhpVTWddlf+ECtMAMrxjxuOExGQ==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/core": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.679.0.tgz", + "integrity": "sha512-CS6PWGX8l4v/xyvX8RtXnBisdCa5+URzKd0L6GvHChype9qKUVxO/Gg6N/y43Hvg7MNWJt9FBPNWIxUB+byJwg==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.679.0.tgz", + "integrity": "sha512-EdlTYbzMm3G7VUNAMxr9S1nC1qUNqhKlAxFU8E7cKsAe8Bp29CD5HAs3POc56AVo9GC4yRIS+/mtlZSmrckzUA==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-http": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.679.0.tgz", + "integrity": "sha512-ZoKLubW5DqqV1/2a3TSn+9sSKg0T8SsYMt1JeirnuLJF0mCoYFUaWMyvxxKuxPoqvUsaycxKru4GkpJ10ltNBw==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.682.0.tgz", + "integrity": "sha512-6eqWeHdK6EegAxqDdiCi215nT3QZPwukgWAYuVxNfJ/5m0/P7fAzF+D5kKVgByUvGJEbq/FEL8Fw7OBe64AA+g==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.682.0.tgz", + "integrity": "sha512-HSmDqZcBVZrTctHCT9m++vdlDfJ1ARI218qmZa+TZzzOFNpKWy6QyHMEra45GB9GnkkMmV6unoDSPMuN0AqcMg==", + "requires": { + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-ini": "3.682.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.679.0.tgz", + "integrity": "sha512-u/p4TV8kQ0zJWDdZD4+vdQFTMhkDEJFws040Gm113VHa/Xo1SYOjbpvqeuFoz6VmM0bLvoOWjxB9MxnSQbwKpQ==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.682.0.tgz", + "integrity": "sha512-h7IH1VsWgV6YAJSWWV6y8uaRjGqLY3iBpGZlXuTH/c236NMLaNv+WqCBLeBxkFGUb2WeQ+FUPEJDCD69rgLIkg==", + "requires": { + "@aws-sdk/client-sso": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/token-providers": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.679.0.tgz", + "integrity": "sha512-a74tLccVznXCaBefWPSysUcLXYJiSkeUmQGtalNgJ1vGkE36W5l/8czFiiowdWdKWz7+x6xf0w+Kjkjlj42Ung==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/lib-storage": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.682.0.tgz", + "integrity": "sha512-MtG/uE5iVpxW+nC+QZTbQhoMWdDNXtAtPaO6vTNvc+q8PWvOnIjY3KmaFpEC1CbHYSFvRdidGL33iONWX18ZYg==", + "requires": { + "@smithy/abort-controller": "^3.1.5", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/smithy-client": "^3.4.0", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-bucket-endpoint": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.679.0.tgz", + "integrity": "sha512-5EpiPhhGgnF+uJR4DzWUk6Lx3pOn9oM6JGXxeHsiynfoBfq7vHMleq+uABHHSQS+y7XzbyZ7x8tXNQlliMwOsg==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-arn-parser": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-expect-continue": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.679.0.tgz", + "integrity": "sha512-nYsh9PdWrF4EahTRdXHGlNud82RPc508CNGdh1lAGfPU3tNveGfMBX3PcGBtPOse3p9ebNKRWVmUc9eXSjGvHA==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-flexible-checksums": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.682.0.tgz", + "integrity": "sha512-5u1STth6iZUtAvPDO0NJVYKUX2EYKU7v84MYYaZ3O27HphRjFqDos0keL2KTnHn/KmMD68rM3yiUareWR8hnAQ==", + "requires": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.679.0.tgz", + "integrity": "sha512-y176HuQ8JRY3hGX8rQzHDSbCl9P5Ny9l16z4xmaiLo+Qfte7ee4Yr3yaAKd7GFoJ3/Mhud2XZ37fR015MfYl2w==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-location-constraint": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.679.0.tgz", + "integrity": "sha512-SA1C1D3XgoKTGxyNsOqd016ONpk46xJLWDgJUd00Zb21Ox5wYCoY6aDRKiaMRW+1VfCJdezs1Do3XLyIU9KxyA==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.679.0.tgz", + "integrity": "sha512-0vet8InEj7nvIvGKk+ch7bEF5SyZ7Us9U7YTEgXPrBNStKeRUsgwRm0ijPWWd0a3oz2okaEwXsFl7G/vI0XiEA==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.679.0.tgz", + "integrity": "sha512-sQoAZFsQiW/LL3DfKMYwBoGjYDEnMbA9WslWN8xneCmBAwKo6IcSksvYs23PP8XMIoBGe2I2J9BSr654XWygTQ==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-sdk-s3": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.682.0.tgz", + "integrity": "sha512-Tqndx8elRD4xDR8f5Cng6jpZ/odcm1ZTOtGRFMzHgOCij4BeMf4+/+ecQScobcrAZpUTCUTCzaTvdCdJw8MYJA==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-arn-parser": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-ssec": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.679.0.tgz", + "integrity": "sha512-4GNUxXbs1M71uFHRiCAZtN0/g23ogI9YjMe5isAuYMHXwDB3MhqF7usKf954mBP6tplvN44vYlbJ84faaLrTtg==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.682.0.tgz", + "integrity": "sha512-7TyvYR9HdGH1/Nq0eeApUTM4izB6rExiw87khVYuJwZHr6FmvIL1FsOVFro/4WlXa0lg4LiYOm/8H8dHv+fXTg==", + "requires": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/region-config-resolver": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.679.0.tgz", + "integrity": "sha512-Ybx54P8Tg6KKq5ck7uwdjiKif7n/8g1x+V0V9uTjBjRWqaIgiqzXwKWoPj6NCNkE7tJNtqI4JrNxp/3S3HvmRw==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/signature-v4-multi-region": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.682.0.tgz", + "integrity": "sha512-y7RAQSCb9pH8wCX5We9UXfiqPVwBLLvSljhuXC31mibHmYaZnpNEwHiQlRNQPblyaNpiKnXXQ0H3Ns3FDyDYdQ==", + "requires": { + "@aws-sdk/middleware-sdk-s3": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/token-providers": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.679.0.tgz", + "integrity": "sha512-1/+Zso/x2jqgutKixYFQEGli0FELTgah6bm7aB+m2FAWH4Hz7+iMUsazg6nSWm714sG9G3h5u42Dmpvi9X6/hA==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/types": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.679.0.tgz", + "integrity": "sha512-NwVq8YvInxQdJ47+zz4fH3BRRLC6lL+WLkvr242PVBbUOLRyK/lkwHlfiKUoeVIMyK5NF+up6TRg71t/8Bny6Q==", + "requires": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-arn-parser": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.679.0.tgz", + "integrity": "sha512-CwzEbU8R8rq9bqUFryO50RFBlkfufV9UfMArHPWlo+lmsC+NlSluHQALoj6Jkq3zf5ppn1CN0c1DDLrEqdQUXg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.679.0.tgz", + "integrity": "sha512-YL6s4Y/1zC45OvddvgE139fjeWSKKPgLlnfrvhVL7alNyY9n7beR4uhoDpNrt5mI6sn9qiBF17790o+xLAXjjg==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.679.0.tgz", + "integrity": "sha512-CusSm2bTBG1kFypcsqU8COhnYc6zltobsqs3nRrvYqYaOqtMnuE46K4XTWpnzKgwDejgZGOE+WYyprtAxrPvmQ==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.682.0.tgz", + "integrity": "sha512-so5s+j0gPoTS0HM4HPL+G0ajk0T6cQAg8JXzRgvyiQAxqie+zGCZAV3VuVeMNWMVbzsgZl0pYZaatPFTLG/AxA==", + "requires": { + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/xhr-http-handler": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xhr-http-handler/-/xhr-http-handler-3.679.0.tgz", + "integrity": "sha512-WKT8lXKCIyYYv2TwZztyChDfkWjPz0Uy+YyY0vYLg7klKrTGtrnKDdK2LWjnTcqCuYzLJmz9ulFt/Cv77Gp8rQ==", + "requires": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "events": "3.3.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/xml-builder": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.679.0.tgz", + "integrity": "sha512-nPmhVZb39ty5bcQ7mAwtjezBcsBqTYZ9A2D9v/lE92KCLdu5RhSkPH7O71ZqbZx1mUSg9fAOxHPiG79U5VlpLQ==", + "requires": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/chunked-blob-reader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", + "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/chunked-blob-reader-native": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", + "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", + "requires": { + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/config-resolver": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz", + "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==", + "requires": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + } + }, + "@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "requires": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/credential-provider-imds": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz", + "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==", + "requires": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-codec": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz", + "integrity": "sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==", + "requires": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-browser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz", + "integrity": "sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==", + "requires": { + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-config-resolver": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz", + "integrity": "sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-node": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz", + "integrity": "sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==", + "requires": { + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-universal": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz", + "integrity": "sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==", + "requires": { + "@smithy/eventstream-codec": "^3.1.7", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "requires": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-blob-browser": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.7.tgz", + "integrity": "sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==", + "requires": { + "@smithy/chunked-blob-reader": "^4.0.0", + "@smithy/chunked-blob-reader-native": "^3.0.1", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-node": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.8.tgz", + "integrity": "sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==", + "requires": { + "@smithy/types": "^3.6.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-stream-node": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.7.tgz", + "integrity": "sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==", + "requires": { + "@smithy/types": "^3.6.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/invalid-dependency": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz", + "integrity": "sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/md5-js": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.8.tgz", + "integrity": "sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==", + "requires": { + "@smithy/types": "^3.6.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-content-length": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz", + "integrity": "sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==", + "requires": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "requires": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-retry": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", + "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", + "requires": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.5", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-retry": "^3.0.8", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + } + }, + "@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "requires": { + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "requires": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "requires": { + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/service-error-classification": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", + "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", + "requires": { + "@smithy/types": "^3.6.0" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "requires": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "requires": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "requires": { + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz", + "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==", + "requires": { + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-node": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz", + "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==", + "requires": { + "@smithy/config-resolver": "^3.0.10", + "@smithy/credential-provider-imds": "^3.2.5", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-endpoints": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz", + "integrity": "sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==", + "requires": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "requires": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-retry": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", + "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", + "requires": { + "@smithy/service-error-classification": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "requires": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "requires": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + } + } + }, + "@smithy/util-waiter": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.7.tgz", + "integrity": "sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==", + "requires": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + } + } + }, + "@packages/blockchain": { + "version": "file:packages/blockchain" + }, "@packages/charmeditor": { "version": "file:packages/charmeditor", "requires": { @@ -83279,15 +85618,13 @@ "@packages/mixpanel": { "version": "file:packages/mixpanel" }, - "@packages/onchain": { - "version": "file:packages/onchain" - }, "@packages/scoutgame": { "version": "file:packages/scoutgame", "requires": { + "@packages/aws": "^0.0.0", + "@packages/blockchain": "^0.0.0", "@packages/farcaster": "^0.0.0", "@packages/github": "^0.0.0", - "@packages/onchain": "^0.0.0", "@packages/utils": "^1.0.0" } }, @@ -96677,6 +99014,7 @@ "version": "file:@connect-shared", "requires": { "@mui/material-nextjs": "^6.1.0", + "@packages/aws": "file:../packages/aws", "framer-motion": "^11.3.17", "next-safe-action": "~7.4.2" } @@ -116540,7 +118878,7 @@ "version": "file:apps/scoutgameadmin", "requires": { "@mui/lab": "^6.0.0-beta.11", - "@packages/onchain": "^0.0.0", + "@packages/blockchain": "^0.0.0", "@packages/scoutgame": "^0.0.0" }, "dependencies": { @@ -116658,7 +118996,6 @@ "@packages/github": "^0.0.0", "@packages/mailer": "^0.0.0", "@packages/mixpanel": "^0.0.0", - "@packages/onchain": "^0.0.0", "@packages/scoutgame": "^0.0.0", "@packages/testing": "^1.0.0", "@packages/utils": "^1.0.0", @@ -118440,6 +120777,7 @@ "requires": { "@hookform/resolvers": "^3.6.0", "@mui/material-nextjs": "^6.1.0", + "@packages/blockchain": "^0.0.0", "@typeschema/yup": "^0.13.3", "framer-motion": "^11.5.4", "next-safe-action": "~7.4.2", diff --git a/packages/aws/package.json b/packages/aws/package.json new file mode 100644 index 0000000000..184b2fe359 --- /dev/null +++ b/packages/aws/package.json @@ -0,0 +1,17 @@ +{ + "name": "@packages/aws", + "version": "0.0.0", + "description": "", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "exports": { + "./*": "./src/*.ts" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.682.0", + "@aws-sdk/lib-storage": "^3.682.0", + "@aws-sdk/xhr-http-handler": "^3.679.0" + } +} diff --git a/packages/aws/src/getS3ClientConfig.ts b/packages/aws/src/getS3ClientConfig.ts new file mode 100644 index 0000000000..959a4a797e --- /dev/null +++ b/packages/aws/src/getS3ClientConfig.ts @@ -0,0 +1,15 @@ +import type { S3ClientConfig } from '@aws-sdk/client-s3'; + +export function getS3ClientConfig() { + const config: Pick = { + region: process.env.S3_UPLOAD_REGION + }; + + if (process.env.S3_UPLOAD_KEY && process.env.S3_UPLOAD_SECRET) { + config.credentials = { + accessKeyId: process.env.S3_UPLOAD_KEY as string, + secretAccessKey: process.env.S3_UPLOAD_SECRET as string + }; + } + return config; +} diff --git a/packages/aws/src/uploadToS3Browser.ts b/packages/aws/src/uploadToS3Browser.ts new file mode 100644 index 0000000000..cc854f0567 --- /dev/null +++ b/packages/aws/src/uploadToS3Browser.ts @@ -0,0 +1,68 @@ +// This code was copied from https://github.com/ryanto/next-s3-upload/blob/master/packages/next-s3-upload/src/hooks/use-s3-upload.tsx +// We can replace with the actual library once next-s3-upload updates their AWS-SDK dependency to V3 +// see this issue for more: https://github.com/ryanto/next-s3-upload/issues/15 +import type { PutObjectCommandInput } from '@aws-sdk/client-s3'; + +type Config = { + onUploadPercentageProgress?: (progress: number) => void; +}; + +export async function uploadToS3( + getUploadToken: (file: File) => Promise<{ + token: any; + bucket: string; + key: string; + region: string; + }>, + file: File, + config?: Config +) { + const data = await getUploadToken(file); // retrieve a token to upload to s3 + const trackProgress = !!config?.onUploadPercentageProgress; + + const { S3Client } = await import('@aws-sdk/client-s3'); + const { Upload } = await import('@aws-sdk/lib-storage'); + const { XhrHttpHandler } = await import('@aws-sdk/xhr-http-handler'); + + const client = new S3Client({ + credentials: { + accessKeyId: data.token.Credentials.AccessKeyId, + secretAccessKey: data.token.Credentials.SecretAccessKey, + sessionToken: data.token.Credentials.SessionToken + }, + region: data.region, + + requestHandler: trackProgress ? new XhrHttpHandler() : undefined + }); + + const params: PutObjectCommandInput = { + ACL: 'public-read', + Bucket: data.bucket, + Key: data.key, + Body: file, + CacheControl: 'max-age=630720000, public', + ContentType: file.type + }; + + const s3Upload = new Upload({ + client, + params + }); + + s3Upload.on('httpUploadProgress', ({ loaded, total }) => { + if (loaded && total) { + const progressPercentage = Math.min(Math.round((loaded / total) * 100), 100); + config?.onUploadPercentageProgress?.(progressPercentage); + } + }); + + await s3Upload.done(); + + const location = `https://s3.amazonaws.com/${data.bucket}/${data.key}`; + + return { + url: location, + bucket: data.bucket, + key: data.key + }; +} diff --git a/packages/aws/src/uploadToS3Server.ts b/packages/aws/src/uploadToS3Server.ts new file mode 100644 index 0000000000..ee88d368ec --- /dev/null +++ b/packages/aws/src/uploadToS3Server.ts @@ -0,0 +1,79 @@ +// This code was copied from https://github.com/ryanto/next-s3-upload/blob/master/packages/next-s3-upload/src/hooks/use-s3-upload.tsx +// We can replace with the actual library once next-s3-upload updates their AWS-SDK dependency to V3 +// see this issue for more: https://github.com/ryanto/next-s3-upload/issues/15 +import type { PutObjectCommandInput } from '@aws-sdk/client-s3'; +import { S3Client } from '@aws-sdk/client-s3'; +import { Upload } from '@aws-sdk/lib-storage'; +import { v4 as uuid } from 'uuid'; + +import { getS3ClientConfig } from './getS3ClientConfig'; + +const client = new S3Client(getS3ClientConfig()); + +const awsS3Bucket = process.env.S3_UPLOAD_BUCKET as string; + +export async function uploadFileToS3(file: { pathInS3: string; content: Buffer; contentType?: string }) { + const params: PutObjectCommandInput = { + ACL: 'public-read', + Bucket: awsS3Bucket, + Key: file.pathInS3, + Body: file.content, + ContentType: file.contentType + }; + + const s3Upload = new Upload({ + client, + params + }); + + await s3Upload.done(); + + const fileUrl = `https://s3.amazonaws.com/${awsS3Bucket}/${file.pathInS3}`; + return { fileUrl }; +} + +export async function uploadUrlToS3({ pathInS3, url }: { pathInS3: string; url: string }) { + const data = await fetch(url); + const arrayBuffer = await data.arrayBuffer(); + + const blob = Buffer.from(arrayBuffer); + + const { fileUrl } = await uploadFileToS3({ + pathInS3, + content: blob, + contentType: data.headers.get('content-type') || undefined + }); + + return { url: fileUrl }; +} + +function generateFilename(url: string) { + // strip out url base + const filename = url.includes('http') ? decodeURIComponent(new URL(url).pathname.split('/').pop() || '') : url; + const sanitized = filename.replace(/\+/g, '_').replace(/\s/g, '-'); + return sanitized || uuid(); +} + +export function getFilePath({ spaceId, url }: { spaceId: string; url: string }) { + return `spaces/${spaceId}/${uuid()}/${generateFilename(url)}`; +} + +export function getUserS3FilePrefix({ userId }: { userId: string }) { + return `user-content/${userId}`; +} + +export function getUserS3FilePath({ userId, url }: { userId: string; url: string }) { + return `${getUserS3FilePrefix({ userId })}/${uuid()}/${generateFilename(url)}`; +} + +export function getFarcasterAppFilePath({ url }: { url: string }) { + return `farcaster-app/${uuid()}/${generateFilename(url)}`; +} + +export const getFilenameWithExtension = (path: string, fallbackExtension = 'jpg'): string => { + const pathParts = path.split('/'); + const rawName = pathParts.pop() || ''; + const [name, extension] = rawName.split('.'); + + return `${pathParts.join('/')}/${name}.${extension?.toLowerCase() || fallbackExtension}`; +}; diff --git a/@connect-shared/lib/aws/uploadToken.ts b/packages/aws/src/uploadToken.ts similarity index 65% rename from @connect-shared/lib/aws/uploadToken.ts rename to packages/aws/src/uploadToken.ts index 142a9abba3..9f109a1310 100644 --- a/@connect-shared/lib/aws/uploadToken.ts +++ b/packages/aws/src/uploadToken.ts @@ -1,23 +1,24 @@ import { GetFederationTokenCommand, STSClient } from '@aws-sdk/client-sts'; import { MissingDataError } from '@charmverse/core/errors'; -import { awsS3Bucket as bucket } from '@root/config/constants'; -import { getS3ClientConfig } from '@root/lib/aws/getS3ClientConfig'; -import { getUserS3FilePath } from '@root/lib/aws/uploadToS3Server'; import { v4 as uuid } from 'uuid'; -const uploadRegion = process.env.S3_UPLOAD_REGION; -const missingKeys: string[] = []; -if (!process.env.S3_UPLOAD_REGION) { - missingKeys.push('S3_UPLOAD_REGION'); -} -if (!bucket) { - missingKeys.push('S3_UPLOAD_BUCKET'); -} +import { getS3ClientConfig } from './getS3ClientConfig'; +import { getUserS3FilePath } from './uploadToS3Server'; + +const uploadRegion = process.env.S3_UPLOAD_REGION as string; +const s3bucket = process.env.S3_UPLOAD_BUCKET as string; // @ts-ignore const validCharacters = /^[\000-\177]*$/; -export async function uploadToken(filename: string, userId: string) { +export async function uploadToken({ filename, userId }: { filename: string; userId: string }) { + const missingKeys: string[] = []; + if (!uploadRegion) { + missingKeys.push('S3_UPLOAD_REGION'); + } + if (!s3bucket) { + missingKeys.push('S3_UPLOAD_BUCKET'); + } if (missingKeys.length > 0) { throw new MissingDataError(`S3 Upload: Missing ENVs ${missingKeys.join(', ')}`); } @@ -37,7 +38,7 @@ export async function uploadToken(filename: string, userId: string) { Sid: 'Stmt1S3UploadAssets', Effect: 'Allow', Action: ['s3:PutObject', 's3:PutObjectAcl'], - Resource: [`arn:aws:s3:::${bucket}/${key}`] + Resource: [`arn:aws:s3:::${s3bucket}/${key}`] } ] }; @@ -55,7 +56,7 @@ export async function uploadToken(filename: string, userId: string) { return { token, key, - bucket, - region: process.env.S3_UPLOAD_REGION + bucket: s3bucket, + region: uploadRegion }; } diff --git a/packages/onchain/tsconfig.json b/packages/aws/tsconfig.json similarity index 100% rename from packages/onchain/tsconfig.json rename to packages/aws/tsconfig.json diff --git a/packages/onchain/package.json b/packages/blockchain/package.json similarity index 86% rename from packages/onchain/package.json rename to packages/blockchain/package.json index f3870b1f6d..471030cf2a 100644 --- a/packages/onchain/package.json +++ b/packages/blockchain/package.json @@ -1,5 +1,5 @@ { - "name": "@packages/onchain", + "name": "@packages/blockchain", "version": "0.0.0", "description": "", "private": true, diff --git a/packages/onchain/src/chains.ts b/packages/blockchain/src/chains.ts similarity index 100% rename from packages/onchain/src/chains.ts rename to packages/blockchain/src/chains.ts diff --git a/packages/onchain/src/generateWallet.ts b/packages/blockchain/src/generateWallet.ts similarity index 100% rename from packages/onchain/src/generateWallet.ts rename to packages/blockchain/src/generateWallet.ts diff --git a/lib/blockchain/getENSName.ts b/packages/blockchain/src/getENSName.ts similarity index 89% rename from lib/blockchain/getENSName.ts rename to packages/blockchain/src/getENSName.ts index cf43350d0a..895249f233 100644 --- a/lib/blockchain/getENSName.ts +++ b/packages/blockchain/src/getENSName.ts @@ -1,10 +1,12 @@ import { log } from '@charmverse/core/log'; -import { isTestEnv } from '@root/config/constants'; import { getAddress } from 'viem'; import { normalize } from 'viem/ens'; -import { getAlchemyBaseUrl } from './provider/alchemy/client'; -import { getPublicClient } from './publicClient'; +import { getAlchemyBaseUrl } from '../../../lib/blockchain/provider/alchemy/client'; + +import { getPublicClient } from './getPublicClient'; + +const isTestEnv = process.env.NODE_ENV === 'test'; export async function getENSName(_address: string) { if (isTestEnv) { diff --git a/packages/onchain/src/getPublicClient.ts b/packages/blockchain/src/getPublicClient.ts similarity index 100% rename from packages/onchain/src/getPublicClient.ts rename to packages/blockchain/src/getPublicClient.ts diff --git a/packages/onchain/src/getWalletClient.ts b/packages/blockchain/src/getWalletClient.ts similarity index 100% rename from packages/onchain/src/getWalletClient.ts rename to packages/blockchain/src/getWalletClient.ts diff --git a/packages/onchain/src/waitForDecentTransactionSettlement.ts b/packages/blockchain/src/waitForDecentTransactionSettlement.ts similarity index 100% rename from packages/onchain/src/waitForDecentTransactionSettlement.ts rename to packages/blockchain/src/waitForDecentTransactionSettlement.ts diff --git a/packages/blockchain/tsconfig.json b/packages/blockchain/tsconfig.json new file mode 100644 index 0000000000..f5cf4de8e2 --- /dev/null +++ b/packages/blockchain/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + // composite is useful for referenced packages. see https://www.typescriptlang.org/docs/handbook/project-references.html#composite + "composite": true + } +} diff --git a/packages/farcaster/src/messaging/getApprovedSigner.ts b/packages/farcaster/src/messaging/getApprovedSigner.ts index 36a8b72485..688c6d8a7c 100644 --- a/packages/farcaster/src/messaging/getApprovedSigner.ts +++ b/packages/farcaster/src/messaging/getApprovedSigner.ts @@ -3,8 +3,8 @@ import { InvalidInputError } from '@charmverse/core/errors'; import { log } from '@charmverse/core/log'; import type { Signer } from '@neynar/nodejs-sdk/build/neynar-api/v2/openapi-farcaster'; -import { getPublicClient } from '@packages/onchain/getPublicClient'; -import { getWalletClient } from '@packages/onchain/getWalletClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; +import { getWalletClient } from '@packages/blockchain/getWalletClient'; import { GET, POST } from '@packages/utils/http'; import { sleep } from '@packages/utils/sleep'; import type { Address } from 'viem'; diff --git a/packages/mixpanel/src/interfaces.ts b/packages/mixpanel/src/interfaces.ts index 45f9745298..4e2a29a01a 100644 --- a/packages/mixpanel/src/interfaces.ts +++ b/packages/mixpanel/src/interfaces.ts @@ -8,12 +8,6 @@ export type BaseEvent = { userId: string; }; -export type UserSignupEvent = BaseEvent & { - displayName: string; - path: string; - fid?: number; -}; - export type NftPurchaseEvent = BaseEvent & { amount: number; builderPath: string; @@ -28,7 +22,7 @@ export type OpenCheckoutEvent = BaseEvent & { }; export interface UserEventMap { - sign_up: UserSignupEvent; + sign_up: BaseEvent; sign_in: BaseEvent; nft_purchase: NftPurchaseEvent; connect_github_success: BaseEvent; diff --git a/packages/scoutgame/package.json b/packages/scoutgame/package.json index da23c9bc2b..4e64067df3 100644 --- a/packages/scoutgame/package.json +++ b/packages/scoutgame/package.json @@ -11,9 +11,10 @@ "./builderNfts/artwork/generateNftImage": "./src/builderNfts/artwork/generateNftImage.tsx" }, "dependencies": { + "@packages/aws": "^0.0.0", + "@packages/blockchain": "^0.0.0", "@packages/farcaster": "^0.0.0", - "@packages/onchain": "^0.0.0", - "@packages/utils": "^1.0.0", - "@packages/github": "^0.0.0" + "@packages/github": "^0.0.0", + "@packages/utils": "^1.0.0" } } diff --git a/packages/scoutgame/src/builderNfts/__tests__/registerBuilderNFT.spec.ts b/packages/scoutgame/src/builderNfts/__tests__/registerBuilderNFT.spec.ts index 1aedbe3c79..0d344e65a9 100644 --- a/packages/scoutgame/src/builderNfts/__tests__/registerBuilderNFT.spec.ts +++ b/packages/scoutgame/src/builderNfts/__tests__/registerBuilderNFT.spec.ts @@ -87,10 +87,4 @@ describe('registerBuilderNFT', () => { expect(result?.id).toEqual(existingNft.id); expect(getBuilderContractMinterClient().registerBuilderToken).not.toHaveBeenCalled(); }); - - it('should throw an error if scout profile is not marked as a builder', async () => { - const builder = await mockBuilder({ builderStatus: 'applied' }); - - await expect(registerBuilderNFT({ builderId: builder.id, season: mockSeason })).rejects.toThrow(InvalidInputError); - }); }); diff --git a/packages/scoutgame/src/builderNfts/clients/builderContractReadClient.ts b/packages/scoutgame/src/builderNfts/clients/builderContractReadClient.ts index 46fb6ea05c..1f86a0f4a9 100644 --- a/packages/scoutgame/src/builderNfts/clients/builderContractReadClient.ts +++ b/packages/scoutgame/src/builderNfts/clients/builderContractReadClient.ts @@ -1,4 +1,4 @@ -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { getBuilderContractAddress, builderNftChain } from '../constants'; diff --git a/packages/scoutgame/src/builderNfts/clients/builderProxyContractReadClient.ts b/packages/scoutgame/src/builderNfts/clients/builderProxyContractReadClient.ts index 40daa49471..08739d9782 100644 --- a/packages/scoutgame/src/builderNfts/clients/builderProxyContractReadClient.ts +++ b/packages/scoutgame/src/builderNfts/clients/builderProxyContractReadClient.ts @@ -1,4 +1,4 @@ -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { builderNftChain, getBuilderContractAddress } from '../constants'; diff --git a/packages/scoutgame/src/builderNfts/getOnchainPurchaseEvents.ts b/packages/scoutgame/src/builderNfts/getOnchainPurchaseEvents.ts index f4df98b9b5..0e42f5ce68 100644 --- a/packages/scoutgame/src/builderNfts/getOnchainPurchaseEvents.ts +++ b/packages/scoutgame/src/builderNfts/getOnchainPurchaseEvents.ts @@ -1,5 +1,5 @@ import { prisma } from '@charmverse/core/prisma-client'; -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { createPublicClient, http, parseEventLogs } from 'viem'; import { optimism } from 'viem/chains'; diff --git a/packages/scoutgame/src/builderNfts/getScoutGameNftMinterWallet.ts b/packages/scoutgame/src/builderNfts/getScoutGameNftMinterWallet.ts index c881feb72a..59dfc53301 100644 --- a/packages/scoutgame/src/builderNfts/getScoutGameNftMinterWallet.ts +++ b/packages/scoutgame/src/builderNfts/getScoutGameNftMinterWallet.ts @@ -1,4 +1,4 @@ -import { getWalletClient } from '@packages/onchain/getWalletClient'; +import { getWalletClient } from '@packages/blockchain/getWalletClient'; import { builderNftChain, builderSmartContractMinterKey } from './constants'; diff --git a/packages/scoutgame/src/builderNfts/getTokenPurchasePrice.ts b/packages/scoutgame/src/builderNfts/getTokenPurchasePrice.ts index 672a16e870..d87244a2e1 100644 --- a/packages/scoutgame/src/builderNfts/getTokenPurchasePrice.ts +++ b/packages/scoutgame/src/builderNfts/getTokenPurchasePrice.ts @@ -1,4 +1,4 @@ -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { decodeFunctionResult, encodeFunctionData } from 'viem'; import { optimism } from 'viem/chains'; diff --git a/packages/scoutgame/src/builderNfts/handlePendingTransaction.ts b/packages/scoutgame/src/builderNfts/handlePendingTransaction.ts index 0a8988019e..22f51dc89d 100644 --- a/packages/scoutgame/src/builderNfts/handlePendingTransaction.ts +++ b/packages/scoutgame/src/builderNfts/handlePendingTransaction.ts @@ -4,11 +4,11 @@ import { InvalidInputError } from '@charmverse/core/errors'; import { log } from '@charmverse/core/log'; import { prisma, TransactionStatus } from '@charmverse/core/prisma-client'; import { stringUtils } from '@charmverse/core/utilities'; -import { getPublicClient } from '@packages/onchain/getPublicClient'; +import { getPublicClient } from '@packages/blockchain/getPublicClient'; import { DecentTxFailedPermanently, waitForDecentTransactionSettlement -} from '@packages/onchain/waitForDecentTransactionSettlement'; +} from '@packages/blockchain/waitForDecentTransactionSettlement'; import { currentSeason } from '@packages/scoutgame/dates'; import { recordNftMintAndRefreshPrice } from './recordNftMint'; diff --git a/packages/scoutgame/src/builderNfts/refreshBuilderNftPrice.ts b/packages/scoutgame/src/builderNfts/refreshBuilderNftPrice.ts index 7f07029596..546a42a394 100644 --- a/packages/scoutgame/src/builderNfts/refreshBuilderNftPrice.ts +++ b/packages/scoutgame/src/builderNfts/refreshBuilderNftPrice.ts @@ -16,7 +16,7 @@ export async function refreshBuilderNftPrice({ }): Promise { try { if (!stringUtils.isUUID(builderId)) { - throw new InvalidInputError('Invalid builderId. Must be a uuid'); + throw new InvalidInputError(`Invalid builderId. Must be a uuid: ${builderId}`); } const contractClient = getBuilderContractMinterClient(); diff --git a/packages/scoutgame/src/builderNfts/registerBuilderNFT.ts b/packages/scoutgame/src/builderNfts/registerBuilderNFT.ts index b32f688939..8bc879c8f2 100644 --- a/packages/scoutgame/src/builderNfts/registerBuilderNFT.ts +++ b/packages/scoutgame/src/builderNfts/registerBuilderNFT.ts @@ -18,7 +18,7 @@ export async function registerBuilderNFT({ imageHostingBaseUrl?: string; }) { if (!stringUtils.isUUID(builderId)) { - throw new InvalidInputError('Invalid builderId. Must be a uuid'); + throw new InvalidInputError(`Invalid builderId. Must be a uuid: ${builderId}`); } const contractClient = getBuilderContractMinterClient(); @@ -54,14 +54,10 @@ export async function registerBuilderNFT({ throw new InvalidInputError('Scout profile does not have a github user'); } - if (builder.builderStatus !== 'approved') { - throw new InvalidInputError('Scout profile not marked as a builder'); - } - let tokenId = await contractClient.getTokenIdForBuilder({ args: { builderId } }).catch(() => null); if (!tokenId) { - log.info(`Registering builder token for builderId: ${builderId}`); + log.info(`Registering builder token for builder`, { userId: builderId }); await contractClient.registerBuilderToken({ args: { builderId } }); tokenId = await contractClient.getTokenIdForBuilder({ args: { builderId } }); } @@ -75,7 +71,7 @@ export async function registerBuilderNFT({ displayName: builder.displayName }); - log.info(`Registered builder NFT for builderId: ${builderId}`, { + log.info(`Registered builder NFT for builder`, { userId: builderId, builderPath: builder.path, tokenId, diff --git a/packages/scoutgame/src/builders/approveBuilder.ts b/packages/scoutgame/src/builders/approveBuilder.ts index af85805d74..1541608965 100644 --- a/packages/scoutgame/src/builders/approveBuilder.ts +++ b/packages/scoutgame/src/builders/approveBuilder.ts @@ -1,10 +1,10 @@ +import { log } from '@charmverse/core/log'; import { prisma } from '@charmverse/core/prisma-client'; import { registerBuilderNFT } from '../builderNfts/registerBuilderNFT'; import type { Season } from '../dates'; import { currentSeason } from '../dates'; - -import { updateBuildersRank } from './updateBuildersRank'; +import { importReposByUser } from '../importReposByUser'; const baseUrl = process.env.DOMAIN as string; @@ -19,7 +19,8 @@ export async function approveBuilder({ builderId, season = currentSeason }: { bu id: builderId }, select: { - id: true + id: true, + githubUser: true } }); @@ -39,4 +40,13 @@ export async function approveBuilder({ builderId, season = currentSeason }: { bu builderStatus: 'approved' } }); + + // do not wait for git to complete + importReposByUser(scout.githubUser[0]?.login).catch((error) => { + log.error('Error importing repos for new builder', { + error, + githubLogin: scout.githubUser[0]?.login, + userId: builderId + }); + }); } diff --git a/apps/scoutgame/lib/farcaster/findOrCreateFarcasterUser.ts b/packages/scoutgame/src/users/findOrCreateFarcasterUser.ts similarity index 64% rename from apps/scoutgame/lib/farcaster/findOrCreateFarcasterUser.ts rename to packages/scoutgame/src/users/findOrCreateFarcasterUser.ts index 0f43aaf8ae..d78b0bf59d 100644 --- a/apps/scoutgame/lib/farcaster/findOrCreateFarcasterUser.ts +++ b/packages/scoutgame/src/users/findOrCreateFarcasterUser.ts @@ -1,10 +1,9 @@ -import type { Scout, ScoutWallet } from '@charmverse/core/prisma-client'; -import { deterministicV4UUIDFromFid } from '@connect-shared/lib/farcaster/uuidFromFid'; import { getFarcasterUserById } from '@packages/farcaster/getFarcasterUserById'; import type { ConnectWaitlistTier } from '@packages/scoutgame/waitlist/scoring/constants'; +import { uuidFromNumber } from '@packages/utils/uuid'; -import type { FindOrCreateUserResult } from 'lib/users/findOrCreateUser'; -import { findOrCreateUser } from 'lib/users/findOrCreateUser'; +import { findOrCreateUser } from './findOrCreateUser'; +import type { FindOrCreateUserResult } from './findOrCreateUser'; export async function findOrCreateFarcasterUser({ fid, @@ -18,8 +17,7 @@ export async function findOrCreateFarcasterUser({ throw new Error('Could not find Farcaster profile'); } return findOrCreateUser({ - // This ensures the id is aligned with ids from the connect waitlist - newUserId: deterministicV4UUIDFromFid(fid), + newUserId: uuidFromNumber(fid), farcasterId: fid, avatar: profile.pfp_url, bio: profile.profile.bio.text, diff --git a/apps/scoutgame/lib/users/findOrCreateUser.ts b/packages/scoutgame/src/users/findOrCreateUser.ts similarity index 84% rename from apps/scoutgame/lib/users/findOrCreateUser.ts rename to packages/scoutgame/src/users/findOrCreateUser.ts index 88f69d3f2a..584e042b02 100644 --- a/apps/scoutgame/lib/users/findOrCreateUser.ts +++ b/packages/scoutgame/src/users/findOrCreateUser.ts @@ -2,20 +2,24 @@ import { InvalidInputError } from '@charmverse/core/errors'; import { log } from '@charmverse/core/log'; import type { BuilderEventType, Scout, ScoutWallet } from '@charmverse/core/prisma-client'; import { prisma } from '@charmverse/core/prisma-client'; -import { trackUserAction } from '@packages/mixpanel/trackUserAction'; -import { currentSeason, getCurrentWeek } from '@packages/scoutgame/dates'; -import type { ConnectWaitlistTier } from '@packages/scoutgame/waitlist/scoring/constants'; -import { getTier } from '@packages/scoutgame/waitlist/scoring/constants'; -import { getUserS3FilePath, uploadFileToS3, uploadUrlToS3 } from '@root/lib/aws/uploadToS3Server'; -import { getENSName } from '@root/lib/blockchain/getENSName'; -import { getFilenameWithExtension } from '@root/lib/utils/getFilenameWithExtension'; +import { + getUserS3FilePath, + uploadFileToS3, + uploadUrlToS3, + getFilenameWithExtension +} from '@packages/aws/uploadToS3Server'; +import { getENSName } from '@packages/blockchain/getENSName'; import { capitalize } from '@root/lib/utils/strings'; import sharp from 'sharp'; import { v4 } from 'uuid'; import type { Address } from 'viem'; import { isAddress } from 'viem/utils'; -import { generateRandomAvatar } from 'lib/utils/generateRandomAvatar'; +import { currentSeason, getCurrentWeek } from '../dates'; +import { getTier } from '../waitlist/scoring/constants'; +import type { ConnectWaitlistTier } from '../waitlist/scoring/constants'; + +import { generateRandomAvatar } from './generateRandomAvatar'; const waitlistTierPointsRecord: Record = { legendary: 60, @@ -25,7 +29,9 @@ const waitlistTierPointsRecord: Record = { common: 10 }; -export type FindOrCreateUserResult = Pick & { scoutWallet?: ScoutWallet[] }; +export type FindOrCreateUserResult = Pick & { + isNew: boolean; +}; export async function findOrCreateUser({ newUserId, @@ -63,8 +69,7 @@ export async function findOrCreateUser({ }); if (scout) { - trackUserAction('sign_in', { userId: scout.id }); - return scout; + return { ...scout, isNew: false }; } const userId = newUserId || v4(); @@ -168,12 +173,5 @@ export async function findOrCreateUser({ } }); - trackUserAction('sign_up', { - userId: newScout.id, - path: userProps.path, - displayName: userProps.displayName, - fid: farcasterId - }); - - return newScout; + return { ...newScout, isNew: true }; } diff --git a/apps/scoutgame/lib/utils/generateRandomAvatar.ts b/packages/scoutgame/src/users/generateRandomAvatar.ts similarity index 100% rename from apps/scoutgame/lib/utils/generateRandomAvatar.ts rename to packages/scoutgame/src/users/generateRandomAvatar.ts diff --git a/packages/utils/package.json b/packages/utils/package.json index ab70c05f7f..fc1a0aeaee 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -15,6 +15,7 @@ "./http": "./src/http.ts", "./sleep": "./src/sleep.ts", "./env": "./src/env.ts", - "./strings": "./src/strings.ts" + "./strings": "./src/strings.ts", + "./uuid": "./src/uuid.ts" } } diff --git a/packages/utils/src/uuid.ts b/packages/utils/src/uuid.ts new file mode 100644 index 0000000000..ad7f8f210b --- /dev/null +++ b/packages/utils/src/uuid.ts @@ -0,0 +1,15 @@ +import { createHash } from 'crypto'; + +import { v4 as uuid } from 'uuid'; + +// Function to generate a deterministic UUID v4 based on an integer input +export function uuidFromNumber(num: number | string): string { + // Create a hash of the input number to generate more uniformly distributed random bytes + const hash = createHash('sha256').update(num.toString()).digest(); + + // Convert the first 16 bytes of the hash to a Uint8Array + const randomBytes = new Uint8Array(hash.buffer, hash.byteOffset, 16); + + // Generate the UUID using the custom random bytes + return uuid({ random: randomBytes }); +} diff --git a/pages/api/resolve-ens/index.ts b/pages/api/resolve-ens/index.ts index 4d43ddecef..ea7d908516 100644 --- a/pages/api/resolve-ens/index.ts +++ b/pages/api/resolve-ens/index.ts @@ -1,7 +1,7 @@ +import { resolveENSName } from '@packages/blockchain/getENSName'; import type { NextApiRequest, NextApiResponse } from 'next'; import nc from 'next-connect'; -import { resolveENSName } from 'lib/blockchain'; import { onError, onNoMatch, requireUser } from 'lib/middleware'; import { withSessionRoute } from 'lib/session/withSession'; diff --git a/pages/api/v1/rewards/index.ts b/pages/api/v1/rewards/index.ts index 3b242ea2a6..abc0b6afe9 100644 --- a/pages/api/v1/rewards/index.ts +++ b/pages/api/v1/rewards/index.ts @@ -1,9 +1,9 @@ import type { BountyStatus } from '@charmverse/core/prisma'; import { prisma } from '@charmverse/core/prisma-client'; +import { resolveENSName } from '@packages/blockchain/getENSName'; import { ethers } from 'ethers'; import type { NextApiRequest, NextApiResponse } from 'next'; -import { resolveENSName } from 'lib/blockchain'; import { generateMarkdown } from 'lib/prosemirror/markdown/generateMarkdown'; import { apiHandler } from 'lib/public-api/handler'; import { isTruthy } from 'lib/utils/types'; diff --git a/tsconfig.json b/tsconfig.json index 830afbbca2..d9a9433ac4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -31,7 +31,7 @@ "@packages/charmeditor/*": ["./packages/charmeditor/src/*"], "@packages/utils/*": ["./packages/utils/src/*"], "@packages/github/*": ["./packages/github/src/*"], - "@packages/onchain/*": ["./packages/onchain/src/*"], + "@packages/blockchain/*": ["packages/blockchain/src/*"], "@packages/scoutgame/*": ["./packages/scoutgame/src/*"], "@packages/testing/*": ["./packages/testing/src/*"], "@root/abis/*": ["./abis/*"],