diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..ef941cd --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,35 @@ +name: Tests + +on: + push: + branches: + - main + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - run: pnpm install + + - run: pnpm build + + - name: Test server functionality + run: pnpm exec vitest diff --git a/README.md b/README.md index 02dcd2a..9563656 100644 --- a/README.md +++ b/README.md @@ -48,4 +48,27 @@ VoiceDeck is a platform that allows users to contribute retroactive funding for We recommend [direnv](https://direnv.net/) for managing your environment variables +## Server Design +### Endpoint Details + +`/impact-reports` +- **Returns**: An array of `Report` objects. +- **Purpose**: To provide impact reports to the UI. +- **Implementation Details**: Uses `fetchReports()` from `server/impactReportHelpers.ts`. + +### Server Functions + +Located in `app/server/impactReportHelpers.ts`: + +- `fetchReports`: Function to retrieve reports, including interaction with Hypercerts. + +### Data Models + +- **Impact Report**: The report or stories that have been published previously and verified to actually produce an impact. +- **Hypercert**: A token representing a claim of impactful work, which is fractionable and transferable, conforming to the ERC-1155 standard for semi-fungible tokens. +- **Hypercert Metadata**: A set of data associated with a Hypercert, detailing the scope of work, contributors, impact, and rights, stored on IPFS. + +### Separation of Concerns + +The `/impact-reports` endpoint is responsible for serving impact reports. The implementation details of how the server retrieves data from Hypercert are abstracted away and managed within the `app/server/impactReportHelpers.ts` file. diff --git a/app/model/report.ts b/app/model/report.ts deleted file mode 100644 index f2d59ba..0000000 --- a/app/model/report.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class Report { - name: string; - description: string; - - constructor(name: string, description: string) { - this.name = name; - this.description = description; - } -} diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index 1e143bc..96bae8a 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -1,17 +1,4 @@ import type { MetaFunction } from "@remix-run/node"; -import { useLoaderData } from "@remix-run/react"; - -import { Report } from "../model/report"; -import { ReportService } from "../server/bootstrap.server"; - -export interface IReportLoader { - reports: Report[]; -} - -export const loader = async (): Promise => { - const reportService = await ReportService.getInstance(); - return { reports: reportService.getReports() }; -}; export const meta: MetaFunction = () => { return [ @@ -21,23 +8,34 @@ export const meta: MetaFunction = () => { }; export default function Index() { - const { reports } = useLoaderData(); return (
-

Impact Report

-
- {reports.map((report) => { - return ( -
- ----- -
- name: {report.name} -
- description: {report.description} -
- ); - })} -
+

Welcome to Remix

+
); } diff --git a/app/routes/hypercert-reports.server..tsx b/app/routes/hypercert-reports.server..tsx deleted file mode 100644 index 193b779..0000000 --- a/app/routes/hypercert-reports.server..tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { - ClaimsByOwnerQuery, - HypercertClient, - HypercertIndexerInterface, - HypercertMetadata, - HypercertStorageInterface, -} from "@hypercerts-org/sdk"; -import type { LoaderFunctionArgs } from "@remix-run/node"; -import { Report } from "~/types"; - -const createHypercertClient = () => - new HypercertClient({ chain: { id: 11155111 } }); // Sepolia testnet - -const getHypercertClaims = async (indexer: HypercertIndexerInterface) => { - let claims: ClaimsByOwnerQuery["claims"] | null; - try { - if (!process.env.HC_OWNER_ADDRESS) { - throw new Error("Owner address environment variable is not set"); - } - const response = await indexer.claimsByOwner( - process.env.HC_OWNER_ADDRESS as string, - ); - claims = (response as ClaimsByOwnerQuery).claims; - } catch (error) { - console.error("Failed to fetch claims by owner", error); - throw new Error("Failed to fetch claims"); - } - - return claims; -}; - -const getHypercertMetadata = async ( - claimUri: string, - storage: HypercertStorageInterface, -) => { - let metadata: HypercertMetadata | null; - - try { - const response = await storage.getMetadata(claimUri); - metadata = response; - } catch (error) { - console.error("Failed to fetch metadata", error); - throw new Error("Failed to fetch metadata"); - } - - return metadata; -}; - -const getHypercertReports = async ( - indexer: HypercertIndexerInterface, - storage: HypercertStorageInterface, -) => { - const reports = new Array(); - const errors = []; - try { - const claims = await getHypercertClaims(indexer); - - for (const claim of claims) { - try { - const metadata: HypercertMetadata = await getHypercertMetadata( - claim.uri as string, - storage, - ); - - reports.push({ - title: metadata.name, - description: metadata.description, - id: claim.id, - }); - } catch (error) { - errors.push( - `Failed to fetch metadata for claim with ID ${claim.id}: ${error}`, - ); - } - } - - if (errors.length > 0) { - console.error( - "Errors occurred while fetching metadata for claims:", - errors, - ); - } - - return new Response(JSON.stringify(reports), { - status: 200, - statusText: "OK", - }); - } catch (error) { - console.error("Failed to fetch hypercert claims:", error); - return new Response( - JSON.stringify({ error: "Failed to fetch hypercert claims" }), - { - status: 500, - statusText: "Could not fetch hypercert reports", - }, - ); - } -}; - -export const loader = async ({ request }: LoaderFunctionArgs) => { - const { indexer, storage } = new HypercertClient({ chain: { id: 11155111 } }); - const response = await getHypercertReports(indexer, storage); -}; diff --git a/app/routes/impact-reports.tsx b/app/routes/impact-reports.tsx new file mode 100644 index 0000000..c2cbb54 --- /dev/null +++ b/app/routes/impact-reports.tsx @@ -0,0 +1,37 @@ +import { fetchReports } from "~/server/impactReportHelpers"; + +export const loader = async () => { + const ownerAddress = process.env.HC_OWNER_ADDRESS; + try { + if (!ownerAddress) { + throw new Error("Owner address environment variable is not set"); + } + const reports = await fetchReports(ownerAddress); + return new Response(JSON.stringify(reports), { + status: 200, + statusText: "OK", + }); + } catch (error) { + console.error(`Failed to load impact reports: ${error}`); + return new Response( + JSON.stringify({ error: "Failed to load impact reports" }), + { + status: 500, + statusText: "Internal Server Error", + }, + ); + } +}; + +// or you can use loader like this and import it in the route file: +// export const loader = async (): Promise => { +// const ownerAddress = process.env.HC_OWNER_ADDRESS; +// return { reports: await fetchReports(ownerAddress) }; +// }; +// +// +// and then retrive the data like this in `Index()` function: +// export default function Index() { +// const { reports } = useLoaderData(); +// ... +// } diff --git a/app/server/bootstrap.server.ts b/app/server/bootstrap.server.ts deleted file mode 100644 index 21a9092..0000000 --- a/app/server/bootstrap.server.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ClaimsByOwnerQuery, HypercertClient } from "@hypercerts-org/sdk"; - -import { Report } from "../model/report"; -import { GraphService } from "./service/graph-service.server"; -import { IpfsService } from "./service/ipfs-service.server"; - -export class ReportService { - private static instance: ReportService; - reports: Report[]; - - hypercertClient: HypercertClient; - - constructor() { - this.reports = new Array(); - - this.hypercertClient = new HypercertClient({ - chain: { id: 11155111 }, // Sepolia - }); - } - - static async getInstance(): Promise { - if (!ReportService.instance) { - ReportService.instance = new ReportService(); - await ReportService.instance.init(); - } - - return ReportService.instance; - } - - getReports() { - return this.reports; - } - - private async init() { - const claims = await this.getHyperCertClaims(); - for (const claim of claims) { - const metadata = await this.getHyperCertMetadata(claim.uri as string); - - this.reports.push(new Report(metadata.name, metadata.description)); - } - } - - private async getHyperCertClaims() { - const graphService = await GraphService.getInstance(); - const { claims } = (await graphService.claimsByOwner( - "0x42fbf4d890b4efa0fb0b56a9cc2c5eb0e07c1536", - )) as ClaimsByOwnerQuery; - - return claims; - } - - private async getHyperCertMetadata(claimUri: string) { - const ipfsService = await IpfsService.getInstance(); - const metadata = await ipfsService.getMetadata(claimUri); - - return metadata; - } -} diff --git a/app/server/impactReportHelpers.test.ts b/app/server/impactReportHelpers.test.ts new file mode 100644 index 0000000..9b18391 --- /dev/null +++ b/app/server/impactReportHelpers.test.ts @@ -0,0 +1,32 @@ +import { it } from "node:test"; +import { afterAll, expect, expectTypeOf, test, vi } from "vitest"; +import { fetchReports } from "~/server/impactReportHelpers"; +import { Report } from "~/types"; + +test("fetch reports", async () => { + // address used to mint test hypercerts in Sepolia testnet + const ownerAddress = "0x42fbf4d890b4efa0fb0b56a9cc2c5eb0e07c1536"; + const consoleMock = vi.spyOn(console, "log"); + + afterAll(() => { + consoleMock.mockReset(); + }); + + it("should fetch reports", async () => { + const result = await fetchReports(ownerAddress); + + expectTypeOf(result).toEqualTypeOf(); + expect(result.length).toBeGreaterThan(0); + expect(consoleMock).toHaveBeenCalledWith("Fetching reports from remote"); + }); + + it("should not fetch reports if already cached", async () => { + const result = await fetchReports(ownerAddress); + + expectTypeOf(result).toEqualTypeOf(); + expect(result.length).toBeGreaterThan(0); + expect(consoleMock).toHaveBeenCalledWith( + "Reports already exist, no need to fetch from remote", + ); + }); +}); diff --git a/app/server/impactReportHelpers.ts b/app/server/impactReportHelpers.ts new file mode 100644 index 0000000..995021c --- /dev/null +++ b/app/server/impactReportHelpers.ts @@ -0,0 +1,140 @@ +import { + ClaimsByOwnerQuery, + HypercertClient, + HypercertIndexerInterface, + HypercertMetadata, + HypercertsStorage, +} from "@hypercerts-org/sdk"; +import { Claim, Report } from "~/types"; + +// ============================== +// Report Fetching Functionality +// ============================== + +// cached reports to avoid fetching them again +let reports: Report[] | null = null; + +/** + * Fetches reports either from the cache or by generating them if not already cached. + * @returns A promise that resolves to an array of reports. + * @throws Throws an error if fetching reports fails. + */ +export const fetchReports = async (ownerAddress: string): Promise => { + try { + // Fetch reports from cache if already fetched + if (reports) { + console.log("Reports already exist, no need to fetch from remote"); + console.log(`Existing reports: ${reports.length}`); + } else { + // Fetch reports from remote if not already cached + console.log("Fetching reports from remote"); + const claims = await getHypercertClaims( + ownerAddress, + getHypercertClient().indexer, + ); + reports = await Promise.all( + claims.map(async (claim, index) => { + const metadata = await getHypercertMetadata( + claim.uri as string, + getHypercertClient().storage, + ); + return { + id: claim.id, + title: metadata.name, + summary: metadata.description, + image: metadata.image, + // use hardcoded values for now + // TODO: fetch from CMS or define type(or enum or whatever) + state: index === 0 ? "Madhya Pradesh" : "Kerala", + category: metadata.hypercert?.work_scope.value?.[0], + // tentatively, it represent $1000 + totalCost: 1000, + // TODO: fetch from blockchain when Hypercert Marketplace is ready + fundedSoFar: Math.floor(Math.random() * 1000), + } as Report; + }), + ); + } + + return reports; + } catch (error) { + console.error(`Failed to fetch reports: ${error}`); + throw new Error("Failed to fetch reports"); + } +}; + +// ============================== +// Hypercert Client and Metadata Fetching Functionality +// ============================== + +// singleton instance of HypercertClient +let hypercertClient: HypercertClient | null = null; + +/** + * Retrieves the singleton instance of the HypercertClient. + * @returns The HypercertClient instance. + */ +export const getHypercertClient = (): HypercertClient => { + if (hypercertClient) { + return hypercertClient; + } + hypercertClient = new HypercertClient({ chain: { id: 11155111 } }); // Sepolia testnet + + return hypercertClient; +}; + +/** + * Fetches the claims owned by the specified address from the Hypercert indexer. + * @param ownerAddress - The address of the owner of the claims. + * @param indexer - An instance of HypercertIndexer to retrieve claims from the [Graph](https://thegraph.com/docs/en/) + * @returns A promise that resolves to an array of claims. + * @throws Will throw an error if the owner address is not set or the claims cannot be fetched. + */ +export const getHypercertClaims = async ( + ownerAddress: string, + indexer: HypercertIndexerInterface, +): Promise => { + let claims: Claim[] | null; + + console.log(`Fetching claims owned by ${ownerAddress}`); + try { + // see graphql query: https://github.com/hypercerts-org/hypercerts/blob/d7f5fee/sdk/src/indexer/queries/claims.graphql#L1-L11 + const response = await indexer.claimsByOwner(ownerAddress as string, { + orderDirections: "asc", + first: 100, + // skip the first 2 claims (they are dummy of 0x42FbF4d890B4EFA0FB0b56a9Cc2c5EB0e07C1536 in Sepolia testnet) + skip: 2, + }); + claims = (response as ClaimsByOwnerQuery).claims as Claim[]; + console.log(`Fetched claims: ${claims ? claims.length : 0}`); + + return claims; + } catch (error) { + console.error(`Failed to fetch claims owned by ${ownerAddress}: ${error}`); + throw new Error(`Failed to fetch claims claims owned by ${ownerAddress}`); + } +}; + +/** + * Retrieves the metadata for a given claim URI from IPFS. + * @param claimUri - The IPFS URI of the claim for which metadata is to be fetched. + * @param storage - An instance of HypercertsStorage to retrieve metadata from IPFS. + * @returns A promise that resolves to the metadata of the claim. + * @throws Will throw an error if the metadata cannot be fetched. + */ +export const getHypercertMetadata = async ( + claimUri: string, + storage: HypercertsStorage, +): Promise => { + let metadata: HypercertMetadata | null; + + try { + const response = await storage.getMetadata(claimUri); + metadata = response; + + return metadata; + } catch (error) { + console.error(`Failed to fetch metadata of ${claimUri}: ${error}`); + throw new Error(`Failed to fetch metadata of ${claimUri}`); + } +}; diff --git a/app/server/service/graph-service.server.ts b/app/server/service/graph-service.server.ts deleted file mode 100644 index 5931a19..0000000 --- a/app/server/service/graph-service.server.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { HypercertClient } from "@hypercerts-org/sdk"; - -import { ReportService } from "../bootstrap.server"; - -// graphql schema of hypercert v1.4.1: https://github.com/hypercerts-org/hypercerts/blob/89009f1fcd072aaedd06ede8ba264623277244e9/graph/schema.graphql -export class GraphService { - private static instance: GraphService; - private hypercertClient: HypercertClient; - - constructor(hypercertClient: HypercertClient) { - this.hypercertClient = hypercertClient; - } - - static async getInstance(): Promise { - if (!GraphService.instance) { - GraphService.instance = new GraphService( - (await ReportService.getInstance()).hypercertClient, - ); - } - return GraphService.instance; - } - - // see graphql query: https://github.com/hypercerts-org/hypercerts/blob/main/sdk/src/indexer/queries/claims.graphql#L1-L11 - async claimsByOwner(owner: string) { - return await this.hypercertClient.indexer.claimsByOwner(owner); - } -} diff --git a/app/server/service/ipfs-service.server.ts b/app/server/service/ipfs-service.server.ts deleted file mode 100644 index acc6420..0000000 --- a/app/server/service/ipfs-service.server.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { HypercertClient } from "@hypercerts-org/sdk"; - -import { ReportService } from "../bootstrap.server"; - -export class IpfsService { - private static instance: IpfsService; - private hypercertClient: HypercertClient; - - constructor(hypercertClient: HypercertClient) { - this.hypercertClient = hypercertClient; - } - - static async getInstance(): Promise { - if (!IpfsService.instance) { - IpfsService.instance = new IpfsService( - (await ReportService.getInstance()).hypercertClient, - ); - } - return IpfsService.instance; - } - - // get metadata of hypercert claim - // see Hypercert metadata format v1.4.1: https://github.com/hypercerts-org/hypercerts/blob/89009f1fcd072aaedd06ede8ba264623277244e9/sdk/src/types/metadata.d.ts#L11-L46 - async getMetadata(claimUri: string) { - return await this.hypercertClient.storage.getMetadata(claimUri); - } -} diff --git a/app/types/index.ts b/app/types/index.ts index 02678e5..8cc61d6 100644 --- a/app/types/index.ts +++ b/app/types/index.ts @@ -1,7 +1,51 @@ +/** + * Represents 1 Impact report + * @property {string} id - The ID of associated hypercert + * @property {string} title - The title of the report + * @property {string} summary - The summary of the report + * @property {string} image - The image of the report + * @property {string} state - The state where the impact is being made + * @property {string} category - The category of the report + * @property {number} totalCost - The total cost of the report in USD + * @property {number} fundedSoFar - The amount funded so far in USD + * @property {string} created_at - The date the report was created + * @property {string} updated_at - The date the report was updated + */ export interface Report { id: string; title: string; - description: string; + summary: string; + image: string; + state: string; + category: string; + totalCost: number; + fundedSoFar: number; created_at?: string; updated_at?: string; } + +/** + * Represents 1 Hypercert + * @property {string} __typename - The address of the contract + * @property {string} contract - The address of the contract where the claim is stored. + * @property {any} tokenID - The token ID. + * @property {any} creator - The address of the creator. + * @property {string} id - The ID of the claim. + * @property {any} owner - The address of the owner. + * @property {any} totalUnits - The total number of units. + * @property {string} uri - The URI of the claim metadata. + */ +export interface Claim { + __typename?: "Claim"; + contract: string; + // biome-ignore lint: type definition imported from @hypercerts-org/sdk + tokenID: any; + // biome-ignore lint: type definition imported from @hypercerts-org/sdk + creator?: any | null; + id: string; + // biome-ignore lint: type definition imported from @hypercerts-org/sdk + owner?: any | null; + // biome-ignore lint: type definition imported from @hypercerts-org/sdk + totalUnits?: any | null; + uri?: string | null; +} diff --git a/docs/server.md b/docs/server.md new file mode 100644 index 0000000..67a7f1d --- /dev/null +++ b/docs/server.md @@ -0,0 +1,24 @@ +# Server Design + +## Endpoint Details + +### `/impact-reports` +- **Returns**: An array of `Report` objects. +- **Purpose**: To provide impact reports to the UI. +- **Implementation Details**: Uses `fetchReports()` from `server/impactReportHelpers.ts`. + +## Server Functions + +Located in `app/server/impactReportHelpers.ts`: + +- `fetchReports`: Function to retrieve reports, including interaction with Hypercerts. + +## Data Models + +- **Impact Report**: The report or stories that have been published previously and verified to actually produce an impact. +- **Hypercert**: A token representing a claim of impactful work, which is fractionable and transferable, conforming to the ERC-1155 standard for semi-fungible tokens. +- **Hypercert Metadata**: A set of data associated with a Hypercert, detailing the scope of work, contributors, impact, and rights, stored on IPFS. + +## Separation of Concerns + +The `/impact-reports` endpoint is responsible for serving impact reports. The implementation details of how the server retrieves data from Hypercert are abstracted away and managed within the `app/server/impactReportHelpers.ts` file. diff --git a/package.json b/package.json index a99377c..3ae8cfe 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@fontsource-variable/plus-jakarta-sans": "^5.0.19", - "@hypercerts-org/sdk": "^1.4.1", + "@hypercerts-org/sdk": "^1.4.2-alpha.0", "@remix-run/node": "^2.5.0", "@remix-run/react": "^2.5.0", "@remix-run/serve": "^2.5.0", @@ -31,6 +31,7 @@ "devDependencies": { "@biomejs/biome": "1.5.1", "@remix-run/dev": "^2.5.0", + "@types/node": "^20.11.5", "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "autoprefixer": "^10.4.16", @@ -40,7 +41,8 @@ "tailwindcss": "^3.4.1", "typescript": "^5.1.6", "vite": "^5.0.0", - "vite-tsconfig-paths": "^4.2.1" + "vite-tsconfig-paths": "^4.2.1", + "vitest": "^1.2.1" }, "engines": { "node": ">=18.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12afb2b..de95bf5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ dependencies: specifier: ^5.0.19 version: 5.0.19 '@hypercerts-org/sdk': - specifier: ^1.4.1 - version: 1.4.1(react@18.2.0)(typescript@5.3.3) + specifier: ^1.4.2-alpha.0 + version: 1.4.2-alpha.0(react@18.2.0)(typescript@5.3.3) '@remix-run/node': specifier: ^2.5.0 version: 2.5.0(typescript@5.3.3) @@ -54,7 +54,10 @@ devDependencies: version: 1.5.1 '@remix-run/dev': specifier: ^2.5.0 - version: 2.5.0(@remix-run/serve@2.5.0)(typescript@5.3.3)(vite@5.0.11) + version: 2.5.0(@remix-run/serve@2.5.0)(@types/node@20.11.5)(typescript@5.3.3)(vite@5.0.11) + '@types/node': + specifier: ^20.11.5 + version: 20.11.5 '@types/react': specifier: ^18.2.20 version: 18.2.47 @@ -81,10 +84,13 @@ devDependencies: version: 5.3.3 vite: specifier: ^5.0.0 - version: 5.0.11 + version: 5.0.11(@types/node@20.11.5) vite-tsconfig-paths: specifier: ^4.2.1 version: 4.2.3(typescript@5.3.3)(vite@5.0.11) + vitest: + specifier: ^1.2.1 + version: 1.2.1(@types/node@20.11.5) packages: @@ -173,8 +179,8 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): - resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + /@babel/helper-create-class-features-plugin@7.23.9(@babel/core@7.23.7): + resolution: {integrity: sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -361,7 +367,7 @@ packages: dependencies: '@babel/core': 7.23.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-create-class-features-plugin': 7.23.9(@babel/core@7.23.7) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) dev: true @@ -560,15 +566,6 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.11: resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} engines: {node: '>=12'} @@ -587,15 +584,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.11: resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} engines: {node: '>=12'} @@ -614,15 +602,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.11: resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} engines: {node: '>=12'} @@ -641,15 +620,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.11: resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} engines: {node: '>=12'} @@ -668,15 +638,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.11: resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} engines: {node: '>=12'} @@ -695,15 +656,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.11: resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} engines: {node: '>=12'} @@ -722,15 +674,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.11: resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} engines: {node: '>=12'} @@ -749,15 +692,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.11: resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} engines: {node: '>=12'} @@ -776,15 +710,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.11: resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} engines: {node: '>=12'} @@ -803,15 +728,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.11: resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} engines: {node: '>=12'} @@ -830,15 +746,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.11: resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} engines: {node: '>=12'} @@ -857,15 +764,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.11: resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} engines: {node: '>=12'} @@ -884,15 +782,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.11: resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} engines: {node: '>=12'} @@ -911,15 +800,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.11: resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} engines: {node: '>=12'} @@ -938,15 +818,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.11: resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} engines: {node: '>=12'} @@ -965,15 +836,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.11: resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} engines: {node: '>=12'} @@ -992,15 +854,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.11: resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} engines: {node: '>=12'} @@ -1019,15 +872,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.11: resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} engines: {node: '>=12'} @@ -1046,15 +890,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.11: resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} engines: {node: '>=12'} @@ -1073,15 +908,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.11: resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} engines: {node: '>=12'} @@ -1100,15 +926,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.11: resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} engines: {node: '>=12'} @@ -1127,15 +944,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.11: resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} engines: {node: '>=12'} @@ -1507,8 +1315,8 @@ packages: graphql: 16.8.1 dev: false - /@hypercerts-org/contracts@1.1.0(typescript@5.3.3): - resolution: {integrity: sha512-iEEJP9LQTfgcFjnJj82AwkAob3kfFcTmxm6AGrCXFzt7CU3Xo2odCFKZ81UPFV9C4PyI8tPTSGd12NmUzjLlqA==} + /@hypercerts-org/contracts@1.1.1-alpha.0(typescript@5.3.3): + resolution: {integrity: sha512-3bypIOuTMLM/5KXopzOCOxcR+nUImFf/phPtZ/PoHceAx4CZZe1ygnK8l+GHaBxOX7/HcAp/9D7NBbcnJjHYcw==} dependencies: hardhat: 2.19.4(typescript@5.3.3) transitivePeerDependencies: @@ -1519,13 +1327,13 @@ packages: - utf-8-validate dev: false - /@hypercerts-org/sdk@1.4.1(react@18.2.0)(typescript@5.3.3): - resolution: {integrity: sha512-lTDnaqJffPuK8iKU9LnxGQjdpPASXUq6U+fumJQHyZwhVb2FQnomLu7GNrh6yuCahw8mbj3AXq01GcuNkerLiA==} + /@hypercerts-org/sdk@1.4.2-alpha.0(react@18.2.0)(typescript@5.3.3): + resolution: {integrity: sha512-VT8cd0dfbREKbD8YyQrmoyBLUrVerLwdzLqet6f+LO4yh0dtKHwKIuJJNqbhao5vwzn/iSyob08xIFmGu8rivA==} dependencies: '@ethereum-attestation-service/eas-sdk': 1.3.7(typescript@5.3.3) '@ethersproject/abstract-signer': 5.7.0 '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - '@hypercerts-org/contracts': 1.1.0(typescript@5.3.3) + '@hypercerts-org/contracts': 1.1.1-alpha.0(typescript@5.3.3) '@openzeppelin/merkle-tree': 1.0.5 '@urql/core': 4.2.3(graphql@16.8.1) '@whatwg-node/fetch': 0.9.15 @@ -1559,6 +1367,13 @@ packages: wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -1986,7 +1801,7 @@ packages: requiresBuild: true optional: true - /@remix-run/dev@2.5.0(@remix-run/serve@2.5.0)(typescript@5.3.3)(vite@5.0.11): + /@remix-run/dev@2.5.0(@remix-run/serve@2.5.0)(@types/node@20.11.5)(typescript@5.3.3)(vite@5.0.11): resolution: {integrity: sha512-Px+kyoP21b0/N//VPQ7VRaDZE+oVjTWp4QB1mBwdoCPl9gS7E6LA40YYfY51y/Lts+FSMQPJOLd3yVb9zjzL1w==} engines: {node: '>=18.0.0'} hasBin: true @@ -2017,7 +1832,7 @@ packages: '@remix-run/serve': 2.5.0(typescript@5.3.3) '@remix-run/server-runtime': 2.5.0(typescript@5.3.3) '@types/mdx': 2.0.10 - '@vanilla-extract/integration': 6.2.4 + '@vanilla-extract/integration': 6.3.0(@types/node@20.11.5) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -2056,7 +1871,7 @@ packages: tar-fs: 2.1.1 tsconfig-paths: 4.2.0 typescript: 5.3.3 - vite: 5.0.11 + vite: 5.0.11(@types/node@20.11.5) ws: 7.5.9 transitivePeerDependencies: - '@types/node' @@ -2406,6 +2221,10 @@ packages: tslib: 1.14.1 dev: false + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: @@ -2415,13 +2234,13 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 20.11.0 + '@types/node': 20.11.5 dev: false /@types/bn.js@5.1.5: resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} dependencies: - '@types/node': 20.11.0 + '@types/node': 20.11.5 dev: false /@types/cookie@0.6.0: @@ -2471,15 +2290,15 @@ packages: resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} dev: false - /@types/node@20.11.0: - resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} + /@types/node@20.11.5: + resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} dependencies: undici-types: 5.26.5 /@types/pbkdf2@3.1.2: resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} dependencies: - '@types/node': 20.11.0 + '@types/node': 20.11.5 dev: false /@types/prop-types@15.7.11: @@ -2503,7 +2322,7 @@ packages: /@types/readable-stream@2.3.15: resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 20.11.0 + '@types/node': 20.11.5 safe-buffer: 5.1.2 dev: false @@ -2514,7 +2333,7 @@ packages: /@types/secp256k1@4.0.6: resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} dependencies: - '@types/node': 20.11.0 + '@types/node': 20.11.5 dev: false /@types/unist@2.0.10: @@ -2530,8 +2349,8 @@ packages: - graphql dev: false - /@vanilla-extract/babel-plugin-debug-ids@1.0.3: - resolution: {integrity: sha512-vm4jYu1xhSa6ofQ9AhIpR3DkAp4c+eoR1Rpm8/TQI4DmWbmGbOjYRcqV0aWsfaIlNhN4kFuxFMKBNN9oG6iRzA==} + /@vanilla-extract/babel-plugin-debug-ids@1.0.4: + resolution: {integrity: sha512-mevYcVMwsT6960xnXRw/Rr2K7SOEwzwVBApg/2SJ3eg2KGsHfj1rN0oQ12WdoTT3RzThq+0551bVQKPvQnjeaA==} dependencies: '@babel/core': 7.23.7 transitivePeerDependencies: @@ -2554,22 +2373,22 @@ packages: outdent: 0.8.0 dev: true - /@vanilla-extract/integration@6.2.4: - resolution: {integrity: sha512-+AfymNMVq9sEUe0OJpdCokmPZg4Zi6CqKaW/PnUOfDwEn53ighHOMOBl5hAgxYR8Kiz9NG43Bn00mkjWlFi+ng==} + /@vanilla-extract/integration@6.3.0(@types/node@20.11.5): + resolution: {integrity: sha512-xp/0bdt/GOa7nLDwQ+vBOAG376MOesPhItxRGtuMvo9BLA8vrm2KcKHrKsJTuIl7tfnpuBW5raP6hXcg/oRB3w==} dependencies: '@babel/core': 7.23.7 '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) - '@vanilla-extract/babel-plugin-debug-ids': 1.0.3 + '@vanilla-extract/babel-plugin-debug-ids': 1.0.4 '@vanilla-extract/css': 1.14.0 - esbuild: 0.17.6 + esbuild: 0.19.11 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 lodash: 4.17.21 mlly: 1.4.2 outdent: 0.8.0 - vite: 4.5.1 - vite-node: 0.28.5 + vite: 5.0.11(@types/node@20.11.5) + vite-node: 1.2.1(@types/node@20.11.5) transitivePeerDependencies: - '@types/node' - less @@ -2585,6 +2404,45 @@ packages: resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==} dev: true + /@vitest/expect@1.2.1: + resolution: {integrity: sha512-/bqGXcHfyKgFWYwIgFr1QYDaR9e64pRKxgBNWNXPefPFRhgm+K3+a/dS0cUGEreWngets3dlr8w8SBRw2fCfFQ==} + dependencies: + '@vitest/spy': 1.2.1 + '@vitest/utils': 1.2.1 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.2.1: + resolution: {integrity: sha512-zc2dP5LQpzNzbpaBt7OeYAvmIsRS1KpZQw4G3WM/yqSV1cQKNKwLGmnm79GyZZjMhQGlRcSFMImLjZaUQvNVZQ==} + dependencies: + '@vitest/utils': 1.2.1 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.2.1: + resolution: {integrity: sha512-Tmp/IcYEemKaqAYCS08sh0vORLJkMr0NRV76Gl8sHGxXT5151cITJCET20063wk0Yr/1koQ6dnmP6eEqezmd/Q==} + dependencies: + magic-string: 0.30.5 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.2.1: + resolution: {integrity: sha512-vG3a/b7INKH7L49Lbp0IWrG6sw9j4waWAucwnksPB1r1FTJgV7nkBByd9ufzu6VWya/QTvQW4V9FShZbZIB2UQ==} + dependencies: + tinyspy: 2.2.0 + dev: true + + /@vitest/utils@1.2.1: + resolution: {integrity: sha512-bsH6WVZYe/J2v3+81M5LDU8kW76xWObKIURpPrOXm2pjBniBu2MERI/XP60GpS4PHU3jyK50LUutOwrx4CyHUg==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /@web3-storage/multipart-parser@1.0.0: resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} @@ -2665,6 +2523,11 @@ packages: acorn: 8.11.3 dev: true + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -2752,6 +2615,11 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -2775,6 +2643,10 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true @@ -3062,6 +2934,19 @@ packages: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: true + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3098,6 +2983,12 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: true + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -3400,6 +3291,13 @@ packages: character-entities: 2.0.2 dev: true + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-object-diff@1.1.9: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} dev: true @@ -3444,15 +3342,14 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} - dev: false - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -3467,7 +3364,7 @@ packages: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 - stream-shift: 1.0.2 + stream-shift: 1.0.3 dev: true /eastasianwidth@0.2.0: @@ -3574,36 +3471,6 @@ packages: '@esbuild/win32-x64': 0.17.6 dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - /esbuild@0.19.11: resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} engines: {node: '>=12'} @@ -3819,7 +3686,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 20.11.0 + '@types/node': 20.11.5 require-like: 0.1.2 dev: true @@ -4127,6 +3994,10 @@ packages: engines: {node: '>=18'} dev: true + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -4412,7 +4283,7 @@ packages: hast-util-whitespace: 2.0.1 mdast-util-mdx-expression: 1.3.2 mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 unist-util-position: 4.0.4 @@ -4876,6 +4747,14 @@ packages: engines: {node: '>=14'} dev: true + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.4.2 + pkg-types: 1.0.3 + dev: true + /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -4935,6 +4814,12 @@ packages: js-tokens: 4.0.0 dev: false + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lru-cache@10.1.0: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} @@ -4967,6 +4852,13 @@ packages: react: 18.2.0 dev: false + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /markdown-extensions@1.1.1: resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} engines: {node: '>=0.10.0'} @@ -5834,6 +5726,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -5928,6 +5827,10 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -6038,8 +5941,8 @@ packages: postcss: 8.4.33 dev: true - /postcss-modules-local-by-default@4.0.3(postcss@8.4.33): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + /postcss-modules-local-by-default@4.0.4(postcss@8.4.33): + resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -6050,8 +5953,8 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.1.0(postcss@8.4.33): - resolution: {integrity: sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==} + /postcss-modules-scope@3.1.1(postcss@8.4.33): + resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -6080,8 +5983,8 @@ packages: lodash.camelcase: 4.3.0 postcss: 8.4.33 postcss-modules-extract-imports: 3.0.0(postcss@8.4.33) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.33) - postcss-modules-scope: 3.1.0(postcss@8.4.33) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.33) + postcss-modules-scope: 3.1.1(postcss@8.4.33) postcss-modules-values: 4.0.0(postcss@8.4.33) string-hash: 1.1.3 dev: true @@ -6119,6 +6022,15 @@ packages: hasBin: true dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-ms@7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} @@ -6152,8 +6064,8 @@ packages: retry: 0.12.0 dev: true - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + /property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} dev: true /proxy-addr@2.0.7: @@ -6232,6 +6144,10 @@ packages: scheduler: 0.23.0 dev: false + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /react-refresh@0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} @@ -6437,6 +6353,7 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 + dev: false /rollup@4.9.4: resolution: {integrity: sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==} @@ -6609,6 +6526,10 @@ packages: get-intrinsic: 1.2.2 object-inspect: 1.13.1 + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -6680,14 +6601,14 @@ packages: spdx-license-ids: 3.0.16 dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} dev: true /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.3.0 + spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.16 dev: true @@ -6702,6 +6623,10 @@ packages: minipass: 7.0.4 dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /stacktrace-parser@0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} @@ -6713,8 +6638,12 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stream-shift@1.0.2: - resolution: {integrity: sha512-rV4Bovi9xx0BFzOb/X0B2GqoIjvqPCttZdu0Wgtx2Dxkj7ETyWl9gmqJ4EutWRLvtZWm8dxE+InQZX1IryZn/w==} + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: true /stream-slice@0.1.2: @@ -6816,6 +6745,12 @@ packages: engines: {node: '>=8'} dev: false + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.3 + dev: true + /style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: @@ -6951,6 +6886,20 @@ packages: xtend: 4.0.2 dev: true + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -7033,6 +6982,11 @@ packages: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: false + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -7232,7 +7186,7 @@ packages: hasBin: true dependencies: dequal: 2.0.3 - diff: 5.1.0 + diff: 5.0.0 kleur: 4.1.5 sade: 1.8.1 dev: true @@ -7294,19 +7248,16 @@ packages: - zod dev: false - /vite-node@0.28.5: - resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} - engines: {node: '>=v14.16.0'} + /vite-node@1.2.1(@types/node@20.11.5): + resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@8.1.1) - mlly: 1.4.2 pathe: 1.1.2 picocolors: 1.0.0 - source-map: 0.6.1 - source-map-support: 0.5.21 - vite: 4.5.1 + vite: 5.0.11(@types/node@20.11.5) transitivePeerDependencies: - '@types/node' - less @@ -7329,18 +7280,18 @@ packages: debug: 4.3.4(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.3.3) - vite: 5.0.11 + vite: 5.0.11(@types/node@20.11.5) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.5.1: - resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} - engines: {node: ^14.18.0 || >=16.0.0} + /vite@5.0.11(@types/node@20.11.5): + resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': '>= 14' + '@types/node': ^18.0.0 || >=20.0.0 less: '*' lightningcss: ^1.21.0 sass: '*' @@ -7363,46 +7314,69 @@ packages: terser: optional: true dependencies: - esbuild: 0.18.20 + '@types/node': 20.11.5 + esbuild: 0.19.11 postcss: 8.4.33 - rollup: 3.29.4 + rollup: 4.9.4 optionalDependencies: fsevents: 2.3.3 dev: true - /vite@5.0.11: - resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} + /vitest@1.2.1(@types/node@20.11.5): + resolution: {integrity: sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: + '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: + '@edge-runtime/vm': + optional: true '@types/node': optional: true - less: + '@vitest/browser': optional: true - lightningcss: + '@vitest/ui': optional: true - sass: + happy-dom: optional: true - stylus: - optional: true - sugarss: - optional: true - terser: + jsdom: optional: true dependencies: - esbuild: 0.19.11 - postcss: 8.4.33 - rollup: 4.9.4 - optionalDependencies: - fsevents: 2.3.3 + '@types/node': 20.11.5 + '@vitest/expect': 1.2.1 + '@vitest/runner': 1.2.1 + '@vitest/snapshot': 1.2.1 + '@vitest/spy': 1.2.1 + '@vitest/utils': 1.2.1 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4(supports-color@8.1.1) + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.5 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.0.11(@types/node@20.11.5) + vite-node: 1.2.1(@types/node@20.11.5) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser dev: true /wcwidth@1.0.1: @@ -7456,6 +7430,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wonka@6.3.4: resolution: {integrity: sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==} dev: false @@ -7595,6 +7578,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true diff --git a/vite.config.ts b/vite.config.ts index a9f1124..80448d8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,4 +5,7 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [million.vite({ auto: true }), remix(), tsconfigPaths()], + test: { + include: ["./app/**/*.test.ts"], + }, });