Compare commits

..
Author SHA1 Message Date
Joaquim VergesGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
f8ebbe54d9 Version Packages (#6118)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-31 09:17:07 -08:00
Phillip HoandGitHub ca756819db [service-utils] CJS import for kafkajs-lz4 (#6127) 2025-01-30 17:29:44 -08:00
Jonas DanielsandGitHub 7217e774b2 update login permissions UI and styling (#6128) 2025-01-30 17:26:07 -08:00
Jonas DanielsandGitHub 5de72c5ecd fix arrow function in login script (#6126) 2025-01-30 17:05:46 -08:00
Jonas DanielsandGitHub 60c5c26583 add thirdweb login client script (#6125) 2025-01-30 16:57:22 -08:00
Jonas DanielsandGitHub dc74c3b4b9 add Suspense wrapper to root layout (#6124) 2025-01-30 16:15:42 -08:00
Jonas DanielsandGitHub 69a921d01f tw:login (#6122) 2025-01-30 16:09:20 -08:00
Phillip HoandGitHub 9abdb92028 [service-utils] import LZ4 compression for usageV2 (#6123) 2025-01-30 15:59:08 -08:00
Phillip HoandGitHub 6ed2fd13de [service-utils] fix: Add LZ4 package for usageV2 compression (#6121) 2025-01-30 14:55:37 -08:00
Phillip HoandGitHub a22457a69c [service-utils] Expose broker settings for usageV2 (#6120) 2025-01-30 12:38:52 -08:00
gregfromstl ae675db8c8 [Wagmi Adapter] Fix: use smart account chain in getProvider (#6117)
<!--

## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes"

If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000):

## Notes for the reviewer

Anything important to call out? Be sure to also clarify these in your comments.

## How to test

Unit tests, playground, etc.

-->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR focuses on fixing the `getProvider` function in the `wagmi-adapter` package to improve the autoconnection behavior with the account factory by enhancing the chain selection logic.

### Detailed summary
- Updated `getProvider` function to include `args.smartAccount?.chain?.id` in chain selection.
- Changed the logic for defining `chain` to prioritize `params?.chainId`, followed by the smart account's chain ID, the last stored chain ID, and defaulting to `1`.

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2025-01-30 19:17:54 +00:00
MananTank 54c9333fc9 [TOOL-3268] Dashboard: Fix in-app wallet settings page form submit not working (#6115) 2025-01-30 17:12:59 +00:00
MananTank 541cf0b3e9 [TOOL-3259] Dashboard: Fix Claimable Module UI crashing on for ERC20 token currency set in claim condition (#6114)
<!--

## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes"

If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000):

## Notes for the reviewer

Anything important to call out? Be sure to also clarify these in your comments.

## How to test

Unit tests, playground, etc.

-->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR focuses on enhancing the `ClaimableModule` component by integrating the `useQuery` hook for fetching currency decimals and refining the logic for determining when to fetch this data.

### Detailed summary
- Added `useQuery` to fetch currency decimals based on the `claimConditionCurrency`.
- Refactored the logic to check if currency decimals should be fetched.
- Updated the conditional rendering of fetched data in the `ClaimableModule`.
- Made the "Add Claim Condition" button disabled based on `props.isOwnerAccount`.

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2025-01-30 15:25:38 +00:00
27 changed files with 1460 additions and 110 deletions
@@ -26,6 +26,7 @@ import { ToolTipLabel } from "@/components/ui/tooltip";
import type { Account } from "@3rdweb-sdk/react/hooks/useApi";
import { zodResolver } from "@hookform/resolvers/zod";
import { useMutation } from "@tanstack/react-query";
import { useQuery } from "@tanstack/react-query";
import { TransactionButton } from "components/buttons/TransactionButton";
import { addDays, fromUnixTime } from "date-fns";
import { useAllChainsData } from "hooks/chains/allChains";
@@ -119,22 +120,39 @@ function ClaimableModule(props: ModuleInstanceProps) {
claimConditionQuery.data?.startTimestamp === 0 &&
claimConditionQuery.data?.endTimestamp === 0;
const currencyContract = getContract({
address: claimConditionQuery.data?.currency || "",
chain: props.contract.chain,
client: props.contract.client,
});
const claimConditionCurrency = claimConditionQuery.data?.currency;
const shouldFetchTokenDecimals =
claimConditionQuery.data &&
claimConditionQuery.data?.currency !== ZERO_ADDRESS;
const shouldFetchCurrencyDecimals =
!!claimConditionCurrency && claimConditionCurrency !== ZERO_ADDRESS;
const currencyDecimalsQuery = useReadContract(decimals, {
contract: currencyContract,
queryOptions: {
enabled: shouldFetchTokenDecimals,
const currencyDecimalsQuery = useQuery({
queryKey: [
"currency-decimals",
{
contractAddress: props.contract.address,
chainId: props.contract.chain.id,
claimConditionCurrency,
},
],
queryFn: async () => {
if (!claimConditionCurrency) {
throw new Error();
}
const currencyContract = getContract({
address: claimConditionCurrency,
chain: props.contract.chain,
client: props.contract.client,
});
const decimalsVal = await decimals({
contract: currencyContract,
});
return decimalsVal;
},
enabled: shouldFetchCurrencyDecimals,
});
const tokenDecimalsQuery = useReadContract(decimals, {
contract: contract,
queryOptions: {
@@ -265,7 +283,7 @@ function ClaimableModule(props: ModuleInstanceProps) {
// claim conditions data is present
claimConditionQuery.data &&
// token decimals is fetched if it should be fetched
(shouldFetchTokenDecimals ? currencyDecimalsQuery.isFetched : true)
(shouldFetchCurrencyDecimals ? currencyDecimalsQuery.isFetched : true)
? {
claimCondition: claimConditionQuery.data,
currencyDecimals: currencyDecimalsQuery.data,
@@ -276,7 +294,7 @@ function ClaimableModule(props: ModuleInstanceProps) {
tokenId,
isLoading:
claimConditionQuery.isLoading ||
(!!shouldFetchTokenDecimals && currencyDecimalsQuery.isLoading),
(!!shouldFetchCurrencyDecimals && currencyDecimalsQuery.isLoading),
}}
isOwnerAccount={!!ownerAccount}
name={props.contractInfo.name}
@@ -565,6 +583,7 @@ function ClaimConditionSection(props: {
onClick={() => setAddClaimConditionButtonClicked(true)}
variant="outline"
className="w-full"
disabled={!props.isOwnerAccount}
>
Add Claim Condition
</Button>
@@ -417,14 +417,9 @@ function AuthEndpointFields(props: {
canEditAdvancedFeatures: boolean;
}) {
const { form, canEditAdvancedFeatures } = props;
const customHeaderFields = useFieldArray({
control: form.control,
name: "customAuthEndpoint.customHeaders",
});
const expandCustomAuthEndpointField =
form.watch("customAuthEndpoint")?.authEndpoint !== undefined &&
canEditAdvancedFeatures;
form.watch("customAuthEndpoint") !== undefined && canEditAdvancedFeatures;
return (
<div>
@@ -464,88 +459,107 @@ function AuthEndpointFields(props: {
}}
/>
</SwitchContainer>
<AdvancedConfigurationContainer
show={expandCustomAuthEndpointField}
className="grid grid-cols-1 gap-6 lg:grid-cols-2"
>
<FormField
control={form.control}
name="customAuthEndpoint.authEndpoint"
render={({ field }) => (
<FormItem>
<FormLabel>Authentication Endpoint</FormLabel>
<FormControl>
<Input
{...field}
placeholder="https://example.com/your-auth-verifier"
/>
</FormControl>
<FormDescription>
Enter the URL of your server where we will send the user payload
for verification
</FormDescription>
<FormMessage />
</FormItem>
)}
{/* useFieldArray used on this component - it creates empty customAuthEndpoint.customHeaders array on mount */}
{/* So only mount if expandCustomAuthEndpointField is true */}
{expandCustomAuthEndpointField && (
<AuthEndpointFieldsContent
form={form}
canEditAdvancedFeatures={canEditAdvancedFeatures}
/>
)}
</div>
);
}
<div>
<Label className="mb-3 inline-block">Custom Headers</Label>
<div className="flex flex-col gap-4">
{customHeaderFields.fields.map((field, customHeaderIdx) => {
return (
<div className="flex gap-4" key={field.id}>
<Input
placeholder="Name"
type="text"
{...form.register(
`customAuthEndpoint.customHeaders.${customHeaderIdx}.key`,
)}
/>
<Input
placeholder="Value"
type="text"
{...form.register(
`customAuthEndpoint.customHeaders.${customHeaderIdx}.value`,
)}
/>
<Button
variant="outline"
aria-label="Remove header"
onClick={() => {
customHeaderFields.remove(customHeaderIdx);
}}
className="!w-auto px-3"
>
<Trash2Icon className="size-4 shrink-0 text-destructive-text" />
</Button>
</div>
);
})}
function AuthEndpointFieldsContent(props: {
form: UseFormReturn<ApiKeyEmbeddedWalletsValidationSchema>;
canEditAdvancedFeatures: boolean;
}) {
const { form } = props;
<Button
variant="outline"
className="w-full gap-2 bg-background"
onClick={() => {
customHeaderFields.append({
key: "",
value: "",
});
}}
>
<PlusIcon className="size-4" />
Add header
</Button>
</div>
const customHeaderFields = useFieldArray({
control: form.control,
name: "customAuthEndpoint.customHeaders",
});
<p className="mt-3 text-muted-foreground text-sm">
Set custom headers to be sent along the request with the payload to
the authentication endpoint above. This can be used to verify the
incoming requests
</p>
return (
<div className="mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2">
<FormField
control={form.control}
name="customAuthEndpoint.authEndpoint"
render={({ field }) => (
<FormItem>
<FormLabel>Authentication Endpoint</FormLabel>
<FormControl>
<Input
{...field}
placeholder="https://example.com/your-auth-verifier"
/>
</FormControl>
<FormDescription>
Enter the URL of your server where we will send the user payload
for verification
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<div>
<Label className="mb-3 inline-block">Custom Headers</Label>
<div className="flex flex-col gap-4">
{customHeaderFields.fields.map((field, customHeaderIdx) => {
return (
<div className="flex gap-4" key={field.id}>
<Input
placeholder="Name"
type="text"
{...form.register(
`customAuthEndpoint.customHeaders.${customHeaderIdx}.key`,
)}
/>
<Input
placeholder="Value"
type="text"
{...form.register(
`customAuthEndpoint.customHeaders.${customHeaderIdx}.value`,
)}
/>
<Button
variant="outline"
aria-label="Remove header"
onClick={() => {
customHeaderFields.remove(customHeaderIdx);
}}
className="!w-auto px-3"
>
<Trash2Icon className="size-4 shrink-0 text-destructive-text" />
</Button>
</div>
);
})}
<Button
variant="outline"
className="w-full gap-2 bg-background"
onClick={() => {
customHeaderFields.append({
key: "",
value: "",
});
}}
>
<PlusIcon className="size-4" />
Add header
</Button>
</div>
</AdvancedConfigurationContainer>
<p className="mt-3 text-muted-foreground text-sm">
Set custom headers to be sent along the request with the payload to
the authentication endpoint above. This can be used to verify the
incoming requests
</p>
</div>
</div>
);
}
+41
View File
@@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
+36
View File
@@ -0,0 +1,36 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
+16
View File
@@ -0,0 +1,16 @@
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
];
export default eslintConfig;
+28
View File
@@ -0,0 +1,28 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
async headers() {
return [
{
source: "/api/request",
headers: [
{
key: "Access-Control-Allow-Origin",
value: "*", // Set your origin
},
{
key: "Access-Control-Allow-Methods",
value: "GET, POST, PUT, DELETE, OPTIONS",
},
{
key: "Access-Control-Allow-Headers",
value: "Content-Type, Authorization",
},
],
},
];
},
};
export default nextConfig;
+33
View File
@@ -0,0 +1,33 @@
{
"name": "thirdweb-login",
"version": "0.1.0",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"format": "biome format ./src --write",
"lint": "biome check ./src && knip && eslint ./src",
"fix": "biome check ./src --fix && eslint ./src --fix",
"typecheck": "tsc --noEmit",
"knip": "knip"
},
"dependencies": {
"next": "15.1.6",
"react": "19.0.0",
"react-dom": "19.0.0",
"thirdweb": "workspace:*"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@types/node": "22.10.10",
"@types/react": "19.0.8",
"@types/react-dom": "19.0.3",
"eslint": "^9",
"eslint-config-next": "15.1.6",
"postcss": "8.5.1",
"tailwindcss": "3.4.17",
"typescript": "5.7.3"
}
}
+8
View File
@@ -0,0 +1,8 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
},
};
export default config;
+125
View File
@@ -0,0 +1,125 @@
// biome-ignore lint/complexity/useArrowFunction: This is a self-executing function, we do not want to use an arrow function here.
(function () {
const globalSetup = getSetup();
const USER_ADDRESS_KEY = "tw.login:userAddress";
const SESSION_KEY_ADDRESS_KEY = "tw.login:sessionKeyAddress";
const CODE_KEY = "tw.login:code";
function main() {
// check if redirected first, this sets up the logged in state if it was from redirect
const params = parseURLHash(new URL(window.location));
if (params && params.code === localStorage.getItem(CODE_KEY)) {
// reset the URL hash
window.location.hash = "";
// reset the code
localStorage.setItem(CODE_KEY, params.code);
// write the userAddress to local storage
localStorage.setItem(USER_ADDRESS_KEY, params.userAddress);
// write the sessionKeyAddress to local storage
localStorage.setItem(SESSION_KEY_ADDRESS_KEY, params.sessionKeyAddress);
}
const userAddress = localStorage.getItem(USER_ADDRESS_KEY);
const sessionKeyAddress = localStorage.getItem(SESSION_KEY_ADDRESS_KEY);
if (userAddress && sessionKeyAddress) {
// handle logged in state
handleIsLoggedIn();
} else {
// handle not logged in state
handleNotLoggedIn();
}
}
function handleIsLoggedIn() {
console.log("handleIsLoggedIn");
window.thirdweb = {
isLoggedIn: true,
getAddress: () => getAddress(),
logout: () => {
window.localStorage.removeItem(USER_ADDRESS_KEY);
window.localStorage.removeItem(SESSION_KEY_ADDRESS_KEY);
window.location.reload();
},
};
}
function handleNotLoggedIn() {
window.thirdweb = { login: onLogin, isLoggedIn: false };
}
function onLogin() {
const code = window.crypto.getRandomValues(new Uint8Array(4)).join("");
localStorage.setItem(CODE_KEY, code);
// redirect to the login page
const redirect = new URL(globalSetup.baseUrl);
redirect.searchParams.set("code", code);
redirect.searchParams.set("clientId", globalSetup.clientId);
redirect.searchParams.set("redirect", window.location.href);
window.location.href = redirect.href;
}
function getAddress() {
return localStorage.getItem(USER_ADDRESS_KEY);
}
// utils
function getSetup() {
const el = document.currentScript;
if (!el) {
throw new Error("Could not find script element");
}
const baseUrl = new URL(el.src).origin;
const dataset = el.dataset;
const clientId = dataset.clientId;
if (!clientId) {
throw new Error("Missing client-id");
}
return { clientId, baseUrl };
}
/**
* @param {URL} url
* @returns null | { [key: string]: string }
*/
function parseURLHash(url) {
if (!url.hash) {
return null;
}
try {
return decodeHash(url.hash);
} catch {
// if this fails, invalid data -> return null
return null;
}
}
/**
* Decodes a URL hash string to extract the three keys.
*
* @param {string} hash - A string like "#eyJrZXkxIjoiVmFsdWU..."
* @returns {{ userAddress: string, sessionKeyAddress: string, code: string }} An object with the three keys
*/
function decodeHash(hash) {
// Remove the "#" prefix, if present.
const base64Data = hash.startsWith("#") ? hash.slice(1) : hash;
// Decode the Base64 string, then parse the JSON.
const jsonString = atob(base64Data);
const data = JSON.parse(jsonString);
// data should have the shape { userAddress, sessionKeyAddress, code }.
if (
"userAddress" in data &&
"sessionKeyAddress" in data &&
"code" in data
) {
return data;
}
return null;
}
main();
})();
+1
View File
@@ -0,0 +1 @@
!function(){const e=function e(){const t=document.currentScript;if(!t)throw Error("Could not find script element");const s=new URL(t.src).origin,n=t.dataset,r=n.clientId;if(!r)throw Error("Missing client-id");return{clientId:r,baseUrl:s}}(),t="tw.login:userAddress",s="tw.login:sessionKeyAddress",n="tw.login:code";function r(){const t=window.crypto.getRandomValues(new Uint8Array(4)).join("");localStorage.setItem(n,t);const s=new URL(e.baseUrl);s.searchParams.set("code",t),s.searchParams.set("clientId",e.clientId),s.searchParams.set("redirect",window.location.href),window.location.href=s.href}!function e(){const o=function e(t){if(!t.hash)return null;try{return function e(t){const s=t.startsWith("#")?t.slice(1):t,n=atob(s),r=JSON.parse(n);return"userAddress"in r&&"sessionKeyAddress"in r&&"code"in r?r:null}(t.hash)}catch{return null}}(new URL(window.location));o&&o.code===localStorage.getItem(n)&&(window.location.hash="",localStorage.setItem(n,o.code),localStorage.setItem(t,o.userAddress),localStorage.setItem(s,o.sessionKeyAddress));const i=localStorage.getItem(t),l=localStorage.getItem(s);i&&l?(console.log("handleIsLoggedIn"),window.thirdweb={isLoggedIn:!0,getAddress:()=>localStorage.getItem(t),logout(){window.localStorage.removeItem(t),window.localStorage.removeItem(s),window.location.reload()}}):window.thirdweb={login:r,isLoggedIn:!1}}()}();
@@ -0,0 +1,36 @@
import { type NextRequest, NextResponse } from "next/server";
export const POST = async (req: NextRequest) => {
const body = await req.json();
const userAddress = body.userAddress;
const sessionKeyAddress = body.sessionKeyAddress;
if (!userAddress || !sessionKeyAddress) {
return NextResponse.json(
{
message: "Missing userAddress or sessionKeyAddress",
},
{ status: 400 },
);
}
const url = `${ENGINE_URL}/contract/84532/0x638263e3eAa3917a53630e61B1fBa685308024fa/erc1155/claim-to`;
console.log("url", url);
const res = await fetch(url, {
method: "POST",
headers: {
authorization: `Bearer ${ACCESS_TOKEN}`,
"x-account-address": userAddress,
"x-backend-wallet-address": sessionKeyAddress,
"content-type": "application/json",
},
body: JSON.stringify({
receiver: userAddress,
tokenId: "0",
quantity: "1",
}),
});
const data = await res.json();
return NextResponse.json(data, { status: res.status });
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+163
View File
@@ -0,0 +1,163 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
html {
/* scroll-behavior: smooth; */
font-feature-settings: "cv02", "cv03", "cv04", "cv11";
font-feature-settings: "rlig" 1, "calt" 0;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
font-variation-settings: normal;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: transparent;
}
@layer base {
:root {
--radius: 0.5rem;
--sticky-top-height: 70px;
}
:root,
[data-theme="dark"] {
/* bg - neutral */
--background: 0 0% 0%;
--card: 0 0% 3.92%;
--popover: 0 0% 0%;
--secondary: 0 0% 11%;
--muted: 0 0% 11%;
--accent: 0 0% 11%;
--inverted: 0 0% 100%;
/* bg - colorful */
--primary: 221 83% 54%;
--destructive: 360 72% 51%;
/* Text */
--foreground: 0 0% 98%;
--card-foreground: 0 0% 98%;
--popover-foreground: 0 0% 98%;
--primary-foreground: 0 0% 100%;
--secondary-foreground: 0 0% 98%;
--muted-foreground: 0 0% 63%;
--accent-foreground: 0 0% 98%;
--destructive-foreground: 0 0% 100%;
--link-foreground: 215.88 100% 65%;
--warning-text: 38 92% 50%;
--destructive-text: 360 72% 55%;
--success-text: 142 75% 50%;
--inverted-foreground: 0 0% 0%;
/* Borders */
--border: 0 0% 15%;
--active-border: 0 0% 22%;
--ring: 0 0% 30%;
--input: 0 0% 15%;
}
[data-theme="light"] {
/* bg - neutral */
--background: 0 0% 98%;
--popover: 0 0% 100%;
--card: 0 0% 100%;
--secondary: 0 0% 90%;
--muted: 0 0% 93%;
--accent: 0 0% 93%;
--inverted: 0 0 0%;
/* bg - colorful */
--primary: 221 83% 54%;
--destructive: 360 72% 51%;
/* Text */
--foreground: 0 0% 4%;
--card-foreground: 0 0% 4%;
--popover-foreground: 240 10% 4%;
--primary-foreground: 0 0% 100%;
--secondary-foreground: 0 0% 4%;
--muted-foreground: 0 0% 40%;
--accent-foreground: 0 0% 9%;
--destructive-foreground: 0 0% 100%;
--inverted-foreground: 0 0% 100%;
--link-foreground: 221.21deg 83.19% 53.33%;
--success-text: 142.09 70.56% 35.29%;
--warning-text: 38 92% 40%;
--destructive-text: 357.15deg 100% 68.72%;
/* Borders */
--border: 0 0% 85%;
--active-border: 0 0% 70%;
--input: 0 0% 85%;
--ring: 0 0% 80%;
}
}
/* If no data-theme is added in body, its in dark theme */
body:not([data-theme="light"]) .light-only {
display: none;
}
[data-theme="light"] .dark-only {
display: none;
}
code span {
color: var(--code-dark-color);
}
body[data-theme="light"] code span {
color: var(--code-light-color);
}
/* @layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
} */
.styled-scrollbar::-webkit-scrollbar {
width: 0.5rem;
height: 0.5rem;
}
@media (max-width: 640px) {
.styled-scrollbar::-webkit-scrollbar {
width: 0;
height: 0;
}
}
.styled-scrollbar::-webkit-scrollbar-thumb {
border-radius: 0.5rem;
transition: color 200ms ease;
background: var(--border);
}
.styled-scrollbar::-webkit-scrollbar-thumb:hover {
background: hsl(var(--foreground));
}
.styled-scrollbar::-webkit-scrollbar-track {
background-color: transparent;
}
button {
-webkit-tap-highlight-color: transparent;
}
::selection {
background: hsl(var(--foreground));
color: hsl(var(--background));
}
.hide-scrollbar {
scrollbar-width: none; /* Firefox */
}
.hide-scrollbar::-webkit-scrollbar {
display: none; /* Safari and Chrome */
}
+40
View File
@@ -0,0 +1,40 @@
import type { Metadata } from "next";
import { Fira_Code, Inter } from "next/font/google";
import { Suspense } from "react";
import "./globals.css";
import { Providers } from "./providers";
const sansFont = Inter({
subsets: ["latin"],
variable: "--font-sans",
weight: "variable",
});
const monoFont = Fira_Code({
subsets: ["latin"],
variable: "--font-mono",
weight: "variable",
});
export const metadata: Metadata = {
title: "login with thirdweb",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" className="h-full w-full bg-black text-white">
<body
className={`${sansFont.variable} ${monoFont.variable} h-full w-full font-sans antialiased`}
>
<Providers>
<Suspense>{children}</Suspense>
</Providers>
</body>
</html>
);
}
+134
View File
@@ -0,0 +1,134 @@
"use client";
import { useSearchParams } from "next/navigation";
import { createThirdwebClient, getContract } from "thirdweb";
import { baseSepolia } from "thirdweb/chains";
import { addSessionKey, isActiveSigner } from "thirdweb/extensions/erc4337";
import {
ConnectEmbed,
TransactionButton,
useActiveAccount,
} from "thirdweb/react";
import { isContractDeployed } from "thirdweb/utils";
const sesionKeySignerAddress = "0x6f700ba0258886411D2536399624EAa7158d1742";
const client = createThirdwebClient({
clientId: "e9ba48c289e0cc3d06a23bfd370cc111",
});
export default function Page() {
const account = useActiveAccount();
const searchParams = useSearchParams();
const code = searchParams.get("code");
const clientId = searchParams.get("clientId");
const redirect = searchParams.get("redirect");
console.log({ code, clientId, redirect });
return (
<div className="grid h-full w-full place-items-center">
{account ? (
<div className="flex flex-col gap-4 rounded-lg border border-gray-800 p-12">
<h1 className="font-bold text-3xl">Grant Permissions</h1>
<p>
<strong>App.xyz</strong> is asking you to grant it the following
permissions:
</p>
<ul>
<li>✅ Receive your identity information.</li>
<li>
✅ Interact with <strong>all</strong> contracts on{" "}
<strong>Base Sepolia</strong>
</li>
<li>
✅ Spend <strong>all</strong> your funds on{" "}
<strong>Base Sepolia</strong>
</li>
</ul>
<p>
By approving below you will grant <strong>App.xyz</strong> these
permissions until <strong>02/02/2025</strong>.
</p>
<TransactionButton
transaction={async () => {
if (!account) {
throw new Error("No account found");
}
const accountContract = getContract({
address: account.address,
// hard coded for now
chain: baseSepolia,
client,
});
let hasSesionKey = false;
// check if already added
const accountDeployed = await isContractDeployed(accountContract);
if (accountDeployed) {
hasSesionKey = await isActiveSigner({
contract: accountContract,
signer: sesionKeySignerAddress,
});
}
// if not added, send tx to add the session key
if (!hasSesionKey) {
return addSessionKey({
account,
contract: accountContract,
sessionKeyAddress: sesionKeySignerAddress,
// hard coded for now
permissions: { approvedTargets: "*" },
});
}
throw "already-added";
}}
onError={(e) => {
if (typeof e === "string" && e === "already-added") {
// redirect back to the app
window.location.href = `${redirect}${encodeHash(
account.address,
sesionKeySignerAddress,
code || "",
)}`;
} else {
console.error(e);
}
}}
onTransactionConfirmed={() => {
// redirect back to the app
window.location.href = `${redirect}${encodeHash(
account.address,
sesionKeySignerAddress,
code || "",
)}`;
}}
>
Approve
</TransactionButton>
</div>
) : (
<ConnectEmbed
client={client}
accountAbstraction={{ chain: baseSepolia, sponsorGas: true }}
/>
)}
</div>
);
}
function encodeHash(
userAddress: string,
sessionKeyAddress: string,
code: string,
) {
// Create an object with the three keys.
const data = { userAddress, sessionKeyAddress, code };
// Convert to JSON and then Base64-encode the result.
const jsonString = JSON.stringify(data);
const base64Data = btoa(jsonString);
// Return as a hash string (with the "#" prefix).
return `#${base64Data}`;
}
+11
View File
@@ -0,0 +1,11 @@
"use client";
import { ThirdwebProvider } from "thirdweb/react";
export const Providers = ({
children,
}: Readonly<{
children: React.ReactNode;
}>) => {
return <ThirdwebProvider>{children}</ThirdwebProvider>;
};
+18
View File
@@ -0,0 +1,18 @@
import type { Config } from "tailwindcss";
export default {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
background: "var(--background)",
foreground: "var(--foreground)",
},
},
},
plugins: [],
} satisfies Config;
+27
View File
@@ -0,0 +1,27 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
+2 -2
View File
@@ -12,9 +12,9 @@
},
"scripts": {
"preinstall": "npx only-allow pnpm",
"lint": "pnpm dlx sherif@latest -i remark-gfm && turbo run lint",
"lint": "pnpm dlx sherif@latest -i remark-gfm -i eslint && turbo run lint",
"storybook:react": "turbo run storybook --filter=./packages/*",
"prefix": "pnpm dlx sherif@latest -i remark-gfm --fix",
"prefix": "pnpm dlx sherif@latest -i remark-gfm -i eslint --fix",
"fix": "turbo run fix",
"wallet-ui": "turbo run dev --filter=./apps/wallet-ui --filter=./packages/thirdweb",
"wallet-ui:build": "turbo run build --filter=./apps/wallet-ui --filter=./packages/thirdweb",
+8
View File
@@ -1,5 +1,13 @@
# @thirdweb-dev/service-utils
## 0.8.3
### Patch Changes
- [#6121](https://github.com/thirdweb-dev/js/pull/6121) [`6ed2fd1`](https://github.com/thirdweb-dev/js/commit/6ed2fd13de1638bcf1c28fd4fdbeb00c0d449994) Thanks [@arcoraven](https://github.com/arcoraven)! - [service-utils] import LZ4 codec
- [#6120](https://github.com/thirdweb-dev/js/pull/6120) [`a22457a`](https://github.com/thirdweb-dev/js/commit/a22457a69cc6667ac13599d10ebddc41ceafa0ff) Thanks [@arcoraven](https://github.com/arcoraven)! - [service-utils] Expose kafkajs config
## 0.8.2
### Patch Changes
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/service-utils",
"version": "0.8.2",
"version": "0.8.3",
"type": "module",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
@@ -47,6 +47,7 @@
"dependencies": {
"aws4fetch": "1.0.20",
"kafkajs": "2.2.4",
"kafkajs-lz4": "2.0.0-beta.0",
"zod": "3.24.1"
},
"devDependencies": {
+51 -8
View File
@@ -1,9 +1,19 @@
import { randomUUID } from "node:crypto";
import { checkServerIdentity } from "node:tls";
import { Kafka, type Producer } from "kafkajs";
import {
CompressionTypes,
Kafka,
type Producer,
type ProducerConfig,
} from "kafkajs";
import LZ4Codec from "kafkajs-lz4";
import type { ServiceName } from "../core/services.js";
import { type UsageV2Event, getTopicName } from "../core/usageV2.js";
// Import KafkaJS with CJS pattern (source: https://github.com/tulios/kafkajs/issues/1391)
import KafkaJS from "kafkajs";
const { CompressionCodecs } = KafkaJS;
/**
* Creates a UsageV2Producer which opens a persistent TCP connection.
* This class is thread-safe so your service should re-use one instance.
@@ -21,6 +31,7 @@ export class UsageV2Producer {
private kafka: Kafka;
private producer: Producer | null = null;
private topic: string;
private compression: CompressionTypes;
constructor(config: {
/**
@@ -35,14 +46,27 @@ export class UsageV2Producer {
* The product "source" where usage is coming from.
*/
productName: ServiceName;
/**
* The compression algorithm to use.
*/
compression?: CompressionTypes;
username: string;
password: string;
}) {
const {
producerName,
environment,
productName,
compression = CompressionTypes.LZ4,
username,
password,
} = config;
this.kafka = new Kafka({
clientId: `${config.producerName}-${config.environment}`,
clientId: `${producerName}-${environment}`,
brokers:
config.environment === "production"
environment === "production"
? ["warpstream.thirdweb.xyz:9092"]
: ["warpstream-dev.thirdweb.xyz:9092"],
ssl: {
@@ -52,21 +76,27 @@ export class UsageV2Producer {
},
sasl: {
mechanism: "plain",
username: config.username,
password: config.password,
username,
password,
},
});
this.topic = getTopicName(config.productName);
this.topic = getTopicName(productName);
this.compression = compression;
}
/**
* Connect the producer.
* This must be called before calling `sendEvents()`.
*/
async init() {
async init(configOverrides?: ProducerConfig) {
if (this.compression === CompressionTypes.LZ4) {
CompressionCodecs[CompressionTypes.LZ4] = new LZ4Codec().codec;
}
this.producer = this.kafka.producer({
allowAutoTopicCreation: false,
...configOverrides,
});
await this.producer.connect();
}
@@ -81,7 +111,16 @@ export class UsageV2Producer {
*
* @param events - The events to send.
*/
async sendEvents(events: UsageV2Event[]): Promise<void> {
async sendEvents(
events: UsageV2Event[],
/**
* Reference: https://kafka.js.org/docs/producing#producing-messages
*/
configOverrides?: {
acks?: number;
timeout?: number;
},
): Promise<void> {
if (!this.producer) {
throw new Error("Producer not initialized. Call `init()` first.");
}
@@ -103,6 +142,10 @@ export class UsageV2Producer {
messages: parsedEvents.map((event) => ({
value: JSON.stringify(event),
})),
acks: -1, // All brokers must acknowledge
timeout: 10_000, // 10 seconds
compression: this.compression,
...configOverrides,
});
}
+6
View File
@@ -1,5 +1,11 @@
# @thirdweb-dev/wagmi-adapter
## 0.2.11
### Patch Changes
- [#6117](https://github.com/thirdweb-dev/js/pull/6117) [`ae675db`](https://github.com/thirdweb-dev/js/commit/ae675db8c86a9e4cddb6eb208cd132e0eeaa1978) Thanks [@gregfromstl](https://github.com/gregfromstl)! - Fixes getProvider autoconnections with account factory
## 0.2.10
## 0.2.9
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/wagmi-adapter",
"version": "0.2.10",
"version": "0.2.11",
"repository": {
"type": "git",
"url": "git+https://github.com/thirdweb-dev/js.git#main"
+3 -1
View File
@@ -148,7 +148,9 @@ export function inAppWalletConnector(
},
getProvider: async (params) => {
const lastChainId = await config.storage?.getItem("tw.lastChainId");
const chain = defineChain(params?.chainId || lastChainId || 1);
const chain = defineChain(
params?.chainId || args.smartAccount?.chain?.id || lastChainId || 1,
);
if (!wallet.getAccount()) {
const { autoConnect } = await import("thirdweb/wallets");
await autoConnect({
+536
View File
@@ -411,6 +411,49 @@ importers:
specifier: 5.7.3
version: 5.7.3
apps/login:
dependencies:
next:
specifier: 15.1.6
version: 15.1.6(@babel/[email protected])(@opentelemetry/[email protected])(@playwright/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: 19.0.0
version: 19.0.0
react-dom:
specifier: 19.0.0
version: 19.0.0([email protected])
thirdweb:
specifier: workspace:*
version: link:../../packages/thirdweb
devDependencies:
'@eslint/eslintrc':
specifier: ^3
version: 3.2.0
'@types/node':
specifier: 22.10.10
version: 22.10.10
'@types/react':
specifier: 19.0.8
version: 19.0.8
'@types/react-dom':
specifier: 19.0.3
version: 19.0.3(@types/[email protected])
eslint:
specifier: ^9
version: 9.19.0([email protected])
eslint-config-next:
specifier: 15.1.6
version: 15.1.6([email protected]([email protected]))([email protected])
postcss:
specifier: 8.5.1
version: 8.5.1
tailwindcss:
specifier: 3.4.17
version: 3.4.17([email protected](@swc/[email protected](@swc/[email protected]))(@types/[email protected])([email protected]))
typescript:
specifier: 5.7.3
version: 5.7.3
apps/playground-web:
dependencies:
'@abstract-foundation/agw-client':
@@ -891,6 +934,9 @@ importers:
kafkajs:
specifier: 2.2.4
version: 2.2.4
kafkajs-lz4:
specifier: 2.0.0-beta.0
version: 2.0.0-beta.0
zod:
specifier: 3.24.1
version: 3.24.1
@@ -2919,14 +2965,38 @@ packages:
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/[email protected]':
resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ethereumjs/[email protected]':
resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==}
@@ -3171,6 +3241,14 @@ packages:
peerDependencies:
react-hook-form: ^7.0.0
'@humanfs/[email protected]':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
'@humanfs/[email protected]':
resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
engines: {node: '>=18.18.0'}
'@humanwhocodes/[email protected]':
resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
engines: {node: '>=10.10.0'}
@@ -3184,6 +3262,14 @@ packages:
resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
deprecated: Use @eslint/object-schema instead
'@humanwhocodes/[email protected]':
resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
engines: {node: '>=18.18'}
'@humanwhocodes/[email protected]':
resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
engines: {node: '>=18.18'}
'@img/[email protected]':
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -6856,6 +6942,10 @@ packages:
engines: {'0': node >= 0.8.0}
hasBin: true
[email protected]:
resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
engines: {node: '>=6'}
@@ -7402,6 +7492,10 @@ packages:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
[email protected]:
resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
@@ -7609,6 +7703,9 @@ packages:
[email protected]:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
[email protected]:
resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==}
[email protected]:
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
@@ -7642,6 +7739,10 @@ packages:
react: ^18 || ^19 || ^19.0.0-rc
react-dom: ^18 || ^19 || ^19.0.0-rc
[email protected]:
resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@@ -8611,6 +8712,10 @@ packages:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
[email protected]:
resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
[email protected]:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -8625,6 +8730,20 @@ packages:
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
hasBin: true
[email protected]:
resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
jiti: '*'
peerDependenciesMeta:
jiti:
optional: true
[email protected]:
resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
[email protected]:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -8988,6 +9107,10 @@ packages:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
[email protected]:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
[email protected]:
resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==}
engines: {node: '>= 12'}
@@ -9057,6 +9180,10 @@ packages:
resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
engines: {node: ^10.12.0 || >=12.0.0}
[email protected]:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
[email protected]:
resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==}
engines: {node: '>=18'}
@@ -9326,6 +9453,10 @@ packages:
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'}
[email protected]:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
[email protected]:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
@@ -9675,6 +9806,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
[email protected]:
resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-0SZXGNGZ+WzISQ67QDyZ2x0+wVxjjUndtD8oSeik/4ajifeiRufed8fCb8QW8VMyi4MXcS+UO1k/0NGhvq1PAg==}
engines: {node: '>=12.22.0'}
@@ -9796,6 +9931,10 @@ packages:
resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -10219,6 +10358,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==}
[email protected]:
resolution: {integrity: sha512-uWnO/NtXVNGvKPyjMOQnPrPiMS5XJMqDRBq8xmRivanXTxPdZ/yIUZU31Wo8ySAadTPIx4enxCVmCf61+CyQXQ==}
engines: {node: '>=8.0.0'}
[email protected]:
resolution: {integrity: sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==}
engines: {node: '>=14.0.0'}
@@ -10264,6 +10407,10 @@ packages:
resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
engines: {node: '>=14.16'}
[email protected]:
resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
engines: {node: '>=6'}
@@ -10559,6 +10706,10 @@ packages:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
[email protected]:
resolution: {integrity: sha512-1i6ycr3lLNMiV9qjHn4OwaDRR3hxHhVTxAmX2W7PiWITJym6im6vCD7/201RoBIfsN9Rw+XUMdJx9l5KJaXnnA==}
hasBin: true
[email protected]:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
@@ -11548,6 +11699,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==}
[email protected]:
resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==}
engines: {node: '>=18.18'}
@@ -11691,6 +11846,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
[email protected]:
resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
engines: {node: '>=0.10.0'}
@@ -13428,6 +13587,10 @@ packages:
resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
engines: {node: '>=4'}
[email protected]:
resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -13475,6 +13638,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
[email protected]:
resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
engines: {node: '>=6'}
@@ -14678,6 +14845,11 @@ packages:
resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
engines: {node: '>=12'}
[email protected]:
resolution: {integrity: sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==}
engines: {node: '>= 0.10.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==}
@@ -14697,6 +14869,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==}
[email protected]:
resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
@@ -14807,6 +14983,9 @@ packages:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
[email protected]:
resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==}
[email protected]:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
@@ -14845,6 +15024,9 @@ packages:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
[email protected]:
resolution: {integrity: sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==}
[email protected]:
resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==}
engines: {node: '>=4.0.0'}
@@ -17542,8 +17724,25 @@ snapshots:
eslint: 8.57.0
eslint-visitor-keys: 3.4.3
'@eslint-community/[email protected]([email protected]([email protected]))':
dependencies:
eslint: 9.19.0([email protected])
eslint-visitor-keys: 3.4.3
'@eslint-community/[email protected]': {}
'@eslint/[email protected]':
dependencies:
'@eslint/object-schema': 2.1.5
debug: 4.4.0([email protected])
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
'@eslint/[email protected]':
dependencies:
'@types/json-schema': 7.0.15
'@eslint/[email protected]':
dependencies:
ajv: 6.12.6
@@ -17558,8 +17757,31 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/[email protected]':
dependencies:
ajv: 6.12.6
debug: 4.4.0([email protected])
espree: 10.3.0
globals: 14.0.0
ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
'@eslint/[email protected]': {}
'@eslint/[email protected]': {}
'@eslint/[email protected]': {}
'@eslint/[email protected]':
dependencies:
'@eslint/core': 0.10.0
levn: 0.4.1
'@ethereumjs/[email protected]':
dependencies:
'@ethereumjs/util': 9.1.0
@@ -18232,6 +18454,13 @@ snapshots:
dependencies:
react-hook-form: 7.54.2([email protected])
'@humanfs/[email protected]': {}
'@humanfs/[email protected]':
dependencies:
'@humanfs/core': 0.19.1
'@humanwhocodes/retry': 0.3.1
'@humanwhocodes/[email protected]':
dependencies:
'@humanwhocodes/object-schema': 2.0.3
@@ -18244,6 +18473,10 @@ snapshots:
'@humanwhocodes/[email protected]': {}
'@humanwhocodes/[email protected]': {}
'@humanwhocodes/[email protected]': {}
'@img/[email protected]':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.4
@@ -22971,6 +23204,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 7.14.1([email protected]([email protected]))([email protected])
'@typescript-eslint/scope-manager': 7.14.1
'@typescript-eslint/type-utils': 7.14.1([email protected]([email protected]))([email protected])
'@typescript-eslint/utils': 7.14.1([email protected]([email protected]))([email protected])
'@typescript-eslint/visitor-keys': 7.14.1
eslint: 9.19.0([email protected])
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
ts-api-utils: 1.4.3([email protected])
optionalDependencies:
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]([email protected])([email protected])':
dependencies:
'@typescript-eslint/scope-manager': 7.14.1
@@ -22984,6 +23235,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]([email protected]([email protected]))([email protected])':
dependencies:
'@typescript-eslint/scope-manager': 7.14.1
'@typescript-eslint/types': 7.14.1
'@typescript-eslint/typescript-estree': 7.14.1([email protected])
'@typescript-eslint/visitor-keys': 7.14.1
debug: 4.4.0([email protected])
eslint: 9.19.0([email protected])
optionalDependencies:
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]':
dependencies:
'@typescript-eslint/types': 7.14.1
@@ -23006,6 +23270,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]([email protected]([email protected]))([email protected])':
dependencies:
'@typescript-eslint/typescript-estree': 7.14.1([email protected])
'@typescript-eslint/utils': 7.14.1([email protected]([email protected]))([email protected])
debug: 4.4.0([email protected])
eslint: 9.19.0([email protected])
ts-api-utils: 1.4.3([email protected])
optionalDependencies:
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/[email protected]': {}
'@typescript-eslint/[email protected]': {}
@@ -23067,6 +23343,17 @@ snapshots:
- supports-color
- typescript
'@typescript-eslint/[email protected]([email protected]([email protected]))([email protected])':
dependencies:
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected]))
'@typescript-eslint/scope-manager': 7.14.1
'@typescript-eslint/types': 7.14.1
'@typescript-eslint/typescript-estree': 7.14.1([email protected])
eslint: 9.19.0([email protected])
transitivePeerDependencies:
- supports-color
- typescript
'@typescript-eslint/[email protected]([email protected])([email protected])':
dependencies:
'@eslint-community/eslint-utils': 4.4.1([email protected])
@@ -24120,6 +24407,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -24778,6 +25067,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -25002,6 +25293,12 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
string-width: 1.0.2
strip-ansi: 3.0.1
wrap-ansi: 2.1.0
[email protected]:
dependencies:
string-width: 4.2.3
@@ -25040,6 +25337,8 @@ snapshots:
- '@types/react'
- '@types/react-dom'
[email protected]: {}
[email protected]:
dependencies:
color-name: 1.1.3
@@ -26031,6 +26330,26 @@ snapshots:
- eslint-plugin-import-x
- supports-color
[email protected]([email protected]([email protected]))([email protected]):
dependencies:
'@next/eslint-plugin-next': 15.1.6
'@rushstack/eslint-patch': 1.10.5
'@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])
'@typescript-eslint/parser': 7.14.1([email protected]([email protected]))([email protected])
eslint: 9.19.0([email protected])
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.7.0([email protected])([email protected]([email protected]))
eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected]))
eslint-plugin-jsx-a11y: 6.10.2([email protected]([email protected]))
eslint-plugin-react: 7.37.4([email protected]([email protected]))
eslint-plugin-react-hooks: 5.1.0([email protected]([email protected]))
optionalDependencies:
typescript: 5.7.3
transitivePeerDependencies:
- eslint-import-resolver-webpack
- eslint-plugin-import-x
- supports-color
[email protected]:
dependencies:
debug: 3.2.7
@@ -26055,6 +26374,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]([email protected])([email protected]([email protected])):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.0([email protected])
enhanced-resolve: 5.18.0
eslint: 9.19.0([email protected])
fast-glob: 3.3.3
get-tsconfig: 4.10.0
is-bun-module: 1.3.0
is-glob: 4.0.3
stable-hash: 0.0.4
optionalDependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected]))
transitivePeerDependencies:
- supports-color
[email protected]([email protected]):
dependencies:
acorn: 8.14.0
@@ -26087,6 +26422,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected])([email protected]([email protected])))([email protected]([email protected])):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 7.14.1([email protected]([email protected]))([email protected])
eslint: 9.19.0([email protected])
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.7.0([email protected])([email protected]([email protected]))
transitivePeerDependencies:
- supports-color
[email protected](@typescript-eslint/[email protected]([email protected])([email protected]))([email protected])([email protected]):
dependencies:
'@rtsao/scc': 1.1.0
@@ -26116,6 +26462,35 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
[email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected])):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
array.prototype.flat: 1.3.3
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
eslint: 9.19.0([email protected])
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected])([email protected]([email protected])))([email protected]([email protected]))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
minimatch: 3.1.2
object.fromentries: 2.0.8
object.groupby: 1.0.3
object.values: 1.2.1
semver: 7.7.0
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 7.14.1([email protected]([email protected]))([email protected])
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
[email protected]([email protected]):
dependencies:
aria-query: 5.3.2
@@ -26135,6 +26510,25 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
[email protected]([email protected]([email protected])):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.8
array.prototype.flatmap: 1.3.3
ast-types-flow: 0.0.8
axe-core: 4.10.2
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 9.19.0([email protected])
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
minimatch: 3.1.2
object.fromentries: 2.0.8
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
[email protected]([email protected]):
dependencies:
eslint: 8.57.0
@@ -26173,6 +26567,10 @@ snapshots:
dependencies:
eslint: 8.57.0
[email protected]([email protected]([email protected])):
dependencies:
eslint: 9.19.0([email protected])
[email protected]([email protected]):
dependencies:
array-includes: 3.1.8
@@ -26195,6 +26593,28 @@ snapshots:
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
[email protected]([email protected]([email protected])):
dependencies:
array-includes: 3.1.8
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.3
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
es-iterator-helpers: 1.2.1
eslint: 9.19.0([email protected])
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
object.entries: 1.1.8
object.fromentries: 2.0.8
object.values: 1.2.1
prop-types: 15.8.1
resolve: 2.0.0-next.5
semver: 7.7.0
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
[email protected]([email protected])([email protected]):
dependencies:
'@storybook/csf': 0.1.13
@@ -26223,6 +26643,11 @@ snapshots:
esrecurse: 4.3.0
estraverse: 5.3.0
[email protected]:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
[email protected]: {}
[email protected]: {}
@@ -26270,6 +26695,53 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]([email protected]):
dependencies:
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected]))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.19.1
'@eslint/core': 0.10.0
'@eslint/eslintrc': 3.2.0
'@eslint/js': 9.19.0
'@eslint/plugin-kit': 0.2.5
'@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.1
'@types/estree': 1.0.6
'@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
debug: 4.4.0([email protected])
escape-string-regexp: 4.0.0
eslint-scope: 8.2.0
eslint-visitor-keys: 4.2.0
espree: 10.3.0
esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
optionalDependencies:
jiti: 2.4.2
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
acorn: 8.14.0
acorn-jsx: 5.3.2([email protected])
eslint-visitor-keys: 4.2.0
[email protected]:
dependencies:
acorn: 8.14.0
@@ -26830,6 +27302,10 @@ snapshots:
dependencies:
flat-cache: 3.2.0
[email protected]:
dependencies:
flat-cache: 4.0.1
[email protected]:
dependencies:
tslib: 2.8.1
@@ -26912,6 +27388,11 @@ snapshots:
keyv: 4.5.4
rimraf: 3.0.2
[email protected]:
dependencies:
flatted: 3.3.2
keyv: 4.5.4
[email protected]: {}
[email protected]: {}
@@ -27194,6 +27675,8 @@ snapshots:
dependencies:
type-fest: 0.20.2
[email protected]: {}
[email protected]:
dependencies:
define-properties: 1.2.1
@@ -27609,6 +28092,8 @@ snapshots:
dependencies:
loose-envify: 1.4.0
[email protected]: {}
[email protected]:
dependencies:
'@ioredis/commands': 1.2.0
@@ -27731,6 +28216,10 @@ snapshots:
dependencies:
call-bound: 1.0.3
[email protected]:
dependencies:
number-is-nan: 1.0.1
[email protected]: {}
[email protected]:
@@ -28171,6 +28660,10 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
lz4-asm: 0.4.2
[email protected]: {}
[email protected]:
@@ -28243,6 +28736,10 @@ snapshots:
dependencies:
package-json: 8.1.1
[email protected]:
dependencies:
invert-kv: 1.0.0
[email protected]: {}
[email protected]:
@@ -28492,6 +28989,10 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
yargs: 3.32.0
[email protected]:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -30095,6 +30596,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]: {}
[email protected]:
dependencies:
flow-enums-runtime: 0.0.6
@@ -30264,6 +30767,10 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
lcid: 1.0.0
[email protected]: {}
[email protected]: {}
@@ -32384,6 +32891,12 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
code-point-at: 1.1.0
is-fullwidth-code-point: 1.0.0
strip-ansi: 3.0.1
[email protected]:
dependencies:
emoji-regex: 8.0.0
@@ -32467,6 +32980,10 @@ snapshots:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
[email protected]:
dependencies:
ansi-regex: 2.1.1
[email protected]:
dependencies:
ansi-regex: 4.1.1
@@ -34014,6 +34531,8 @@ snapshots:
dependencies:
string-width: 5.1.2
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -34039,6 +34558,11 @@ snapshots:
worker-timers-broker: 6.1.8
worker-timers-worker: 7.0.71
[email protected]:
dependencies:
string-width: 1.0.2
strip-ansi: 3.0.1
[email protected]:
dependencies:
ansi-styles: 4.3.0
@@ -34132,6 +34656,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -34175,6 +34701,16 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
[email protected]:
dependencies:
camelcase: 2.1.1
cliui: 3.2.0
decamelize: 1.2.0
os-locale: 1.4.0
string-width: 1.0.2
window-size: 0.1.4
y18n: 3.2.2
[email protected]: {}
[email protected]:
+4
View File
@@ -14,6 +14,10 @@
"outputs": ["typedoc/**"],
"dependsOn": ["^build"]
},
"thirdweb-login#build": {
"outputs": [".next/**", "!.next/cache/**"],
"dependsOn": ["^build"]
},
"thirdweb-dashboard#build": {
"env": [
"SENTRY_AUTH_TOKEN",