diff --git a/.changeset/smooth-bugs-admire.md b/.changeset/smooth-bugs-admire.md new file mode 100644 index 000000000..a26c2a427 --- /dev/null +++ b/.changeset/smooth-bugs-admire.md @@ -0,0 +1,5 @@ +--- +"create-frames": minor +--- + +feat: introduce cli tool to bootstrap projects from templates diff --git a/.scripts/package.json b/.scripts/package.json new file mode 100644 index 000000000..aead43de3 --- /dev/null +++ b/.scripts/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} \ No newline at end of file diff --git a/.scripts/prepare-create-frames.js b/.scripts/prepare-create-frames.js new file mode 100644 index 000000000..16dc6d54e --- /dev/null +++ b/.scripts/prepare-create-frames.js @@ -0,0 +1,33 @@ +/** + * This script is used to prepare create-frames package for publishing. + * + * It copies the templates directory to the root of the package so that it can be used by the create-frames package. + */ + +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import glob from "fast-glob"; +import { cpSync, renameSync, rmSync } from 'node:fs'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + + +rmSync(resolve(__dirname, "../packages/create-frames/templates"), { force: true, recursive: true }); + +cpSync( + resolve(__dirname, "../templates"), + resolve(__dirname, "../packages/create-frames/templates"), + { + recursive: true, + filter: (src) => !/(node_modules|\.turbo|\.next|next-env\.d\.ts)/.test(src), + } +); + +const dotfiles = await glob( + resolve(__dirname, "../packages/create-frames/templates/**/.*") +); + +// rename dotfiles to use underscore instead of dot so we can publish them to npm as is +for (const doftile of dotfiles) { + renameSync(doftile, doftile.replace("/.", "/_")); +} diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx index 570504f3f..d91135701 100644 --- a/docs/pages/index.mdx +++ b/docs/pages/index.mdx @@ -18,6 +18,12 @@ import { HomePage } from "vocs/components"; GitHub + + Quickstart + + + GitHub + @@ -31,15 +37,25 @@ import { HomePage } from "vocs/components"; # Quickstart -## 1. Clone the frames.js starter template (with local debugger) +## Bootstrap the project from template using the CLI tool -Run to clone the starter into a new folder called `framesjs-starter` +Run one of the commands below based on your preferred package manager and then follow the steps in the terminal. -```bash -npx degit github:framesjs/frames.js/examples/framesjs-starter#main framesjs-starter +:::code-group + +```bash [npm] +npm init frames +``` + +```bash [yarn] +yarn create frames +``` + +```bash [pnpm] +pnpm create frames ``` -or [clone from github](https://github.com/framesjs/frames.js/tree/main/examples/framesjs-starter) +::: ## Alternatively, add frames.js to your existing project manually @@ -58,7 +74,12 @@ export async function generateMetadata() { return { title: "My page", other: await fetchMetadata( - new URL("/frames", process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : "http://localhost:3000") + new URL( + "/frames", + process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : "http://localhost:3000" + ) ), }; } diff --git a/examples/framesjs-starter/package.json b/examples/framesjs-starter/package.json index b0a3b7491..ab28a3ce0 100644 --- a/examples/framesjs-starter/package.json +++ b/examples/framesjs-starter/package.json @@ -8,9 +8,7 @@ "dev:monorepo": "next dev", "build": "next build", "start": "next start", - "lint": "next lint", - "update-debugger": "npx degit github:framesjs/frames.js/examples/framesjs-starter/app/debug#main app/debug --force", - "update-framesjs": "yarn upgrade frames.js@latest && yarn run update-debugger" + "lint": "next lint" }, "dependencies": { "@farcaster/core": "^0.14.3", @@ -43,4 +41,4 @@ "tailwindcss": "^3.3.0", "typescript": "^5.3.3" } -} \ No newline at end of file +} diff --git a/package.json b/package.json index bb93324a6..9ac3e3b6b 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,13 @@ "name": "framesjs-monorepo", "private": true, "scripts": { - "build": "turbo build", - "build:ci": "turbo build --filter=!debugger --filter=!framesjs-starter --filter=!utils-starter --filter=!docs", + "build": "turbo build --filter=!./templates/* && node ./.scripts/prepare-create-frames.js", + "build:ci": "turbo build --filter=!debugger --filter=!framesjs-starter --filter=!utils-starter --filter=!docs --filter=!template-*", "dev": "FJS_MONOREPO=true turbo dev --filter=framesjs-starter... --filter=debugger...", "dev:custom-redirects": "turbo dev --filter=custom-redirects...", "dev:utils-starter": "turbo dev --filter=utils-starter...", "dev:all": "turbo dev", - "lint": "turbo lint", + "lint": "turbo lint --filter=!template-*", "test:ci": "jest --ci", "test": "cd ./packages/frames.js && npm run test:watch", "publish-packages": "turbo run build lint && changeset version && changeset publish && git push --follow-tags origin main", @@ -23,9 +23,11 @@ "@framesjs/typescript-config": "*", "@jest/globals": "^29.7.0", "@types/jest": "^29.5.11", + "fast-glob": "^3.3.2", "jest": "^29.7.0", "nock": "beta", "prettier": "^3.1.1", + "rimraf": "^5.0.5", "turbo": "^1.12.2" }, "engines": { @@ -35,7 +37,8 @@ "workspaces": [ "docs", "examples/*", - "packages/*" + "packages/*", + "templates/*" ], "version": "0.3.0-canary.0" } diff --git a/packages/create-frames/.gitignore b/packages/create-frames/.gitignore new file mode 100644 index 000000000..f10e14abd --- /dev/null +++ b/packages/create-frames/.gitignore @@ -0,0 +1 @@ +templates \ No newline at end of file diff --git a/packages/create-frames/.npmignore b/packages/create-frames/.npmignore new file mode 100644 index 000000000..eb61e78f0 --- /dev/null +++ b/packages/create-frames/.npmignore @@ -0,0 +1 @@ +!templates \ No newline at end of file diff --git a/packages/create-frames/README.md b/packages/create-frames/README.md new file mode 100644 index 000000000..2f5df6d52 --- /dev/null +++ b/packages/create-frames/README.md @@ -0,0 +1,48 @@ +# Create Frames.js app + +Create a new Frames.js app with a single command using predefined templates. + +## Creating a project + +### Using npm + +```sh +npm init frames +``` + +### Using yarn + +```sh +yarn create frames +``` + +### Using pnpm + +```sh +pnpm create frames +``` + +## Installing globally (optional) and running from terminal + +You can also install this package globally and run it from your terminal. + +### Using npm + +```sh +npm install -g create-frames +create-frames +``` + +### Using yarn + +```sh +yarn global add create-frames +create-frames +``` + +### Using pnpm + +```sh +pnpm add -g create-frames +create-frames +``` diff --git a/packages/create-frames/bin.js b/packages/create-frames/bin.js new file mode 100755 index 000000000..e9b1d9161 --- /dev/null +++ b/packages/create-frames/bin.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; +import { getTemplates } from "./utils/getTemplates.js"; +import { create } from "./create.js"; + +// use only default command +yargs(hideBin(process.argv)) + .scriptName("create-frames") + .usage("Usage: $0 [options]") + .command( + "$0", + "Create a new project", + { + name: { + alias: "n", + describe: "Name of the project", + type: "string", + }, + template: { + alias: "t", + describe: "Choose a template for the project", + choices: getTemplates(), + }, + }, + (args) => { + create(args); + } + ) + .parse(); diff --git a/packages/create-frames/create.js b/packages/create-frames/create.js new file mode 100644 index 000000000..e99674800 --- /dev/null +++ b/packages/create-frames/create.js @@ -0,0 +1,135 @@ +import { intro, log, outro, select, confirm, text } from "@clack/prompts"; +import { getTemplates } from "./utils/getTemplates.js"; +import { dirname, relative, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { spawnSync } from "node:child_process"; +import ignore from "ignore"; +import pc from "picocolors"; +import { detect as detectPackageManager } from "detect-package-manager"; +import { + cpSync, + readFileSync, + readdirSync, + renameSync, + writeFileSync, +} from "node:fs"; +import { packageManagerRunCommand } from "./utils/packageManagerRunCommand.js"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +/** + * + * @param {import('yargs').ArgumentsCamelCase<{ t?: string, n?: string }>} params + */ +export async function create(params) { + if (params.$0 !== "create-frames") { + throw new Error("Invalid command"); + } + + intro("Welcome to frames.js"); + + // if there is no -n argument (name, ask for the name of new project) + let projectName = + params.n || + (await text({ + message: "Enter the name of your project", + placeholder: "my-frames-app", + validate(input) { + if (!input) { + return "Project name is required"; + } + + return; + }, + })); + + const destDir = resolve(process.cwd(), projectName); + + const template = + params.t || + (await select({ + message: "Choose a template for the project", + options: getTemplates().map((template) => ({ + name: template, + value: template, + })), + defaultValue: "next", + validate(input) { + if (!input) { + return "Template is required"; + } + + return; + }, + })); + + const templateDir = resolve(__dirname, "./templates", template); + const ignoredPatterns = readFileSync( + resolve(templateDir, "_gitignore"), + "utf-8" + ); + const ignored = ignore().add(ignoredPatterns); + + cpSync(templateDir, destDir, { + force: true, + recursive: true, + filter(src) { + const path = relative(templateDir, src); + + return !path || !ignored.ignores(path); + }, + }); + + for (const file of readdirSync(destDir)) { + if (!file.startsWith("_")) continue; + + renameSync( + resolve(destDir, file), + resolve(destDir, file.replace("_", ".")) + ); + } + + const pkgJsonPath = resolve(destDir, "package.json"); + const pkgJson = JSON.parse(readFileSync(pkgJsonPath, "utf-8")); + pkgJson.name = projectName; + writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2)); + + log.success(`Project successfully scaffolded in ${pc.blue(destDir)}!`); + + const pkgManager = await detectPackageManager(); + + const wantsToInstallDependencies = await confirm({ + message: `Do you want to install the dependencies using ${pkgManager}?`, + initialValue: true, + }); + + if (wantsToInstallDependencies) { + log.message(`Installing the dependencies...`); + const result = spawnSync(pkgManager, ["install"], { + cwd: destDir, + stdio: "ignore", + }); + + if (result.status !== 0) { + log.error( + `Failed to install the dependencies, please install them manually.` + ); + process.exit(1); + } + + log.success(`Dependencies installed!`); + } + + log.message("Next steps:"); + log.step( + `1. Go to the project directory by running: ${pc.blue(`cd ./${projectName}`)}` + ); + log.step( + `2. Start the development server and run the app in debugger by running: ${pc.blue(await packageManagerRunCommand("dev"))}` + ); + log.step( + `3. Open your browser and go to ${pc.blue(`http://localhost:3010`)} to see your app running in the debugger` + ); + + outro("Done! Your project has been set up! 🎉"); +} diff --git a/packages/create-frames/package.json b/packages/create-frames/package.json new file mode 100644 index 000000000..4f4310671 --- /dev/null +++ b/packages/create-frames/package.json @@ -0,0 +1,22 @@ +{ + "name": "create-frames", + "version": "0.0.0", + "type": "module", + "bin": "bin.js", + "license": "MIT", + "engines": { + "node": ">=18.17.0" + }, + "engineStrict": true, + "dependencies": { + "@clack/prompts": "^0.7.0", + "detect-package-manager": "^3.0.1", + "ignore": "^5.3.1", + "picocolors": "^1.0.0", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@types/yargs": "^17.0.32" + }, + "repository": "framesjs/frame.js" +} diff --git a/packages/create-frames/tsconfig.json b/packages/create-frames/tsconfig.json new file mode 100644 index 000000000..51c114d05 --- /dev/null +++ b/packages/create-frames/tsconfig.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": false, + "isolatedModules": true, + "lib": ["es2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "Bundler", + "noEmit": true, + "noUncheckedIndexedAccess": true, + "plugins": [ + { + "name": "next", + }, + ], + "jsx": "preserve", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2022", + "allowJs": true, + }, + "include": ["**/*.ts", "**/*.tsx", "**/*.js"], + "exclude": ["node_modules"], +} diff --git a/packages/create-frames/utils/getTemplates.js b/packages/create-frames/utils/getTemplates.js new file mode 100644 index 000000000..f0e2fc987 --- /dev/null +++ b/packages/create-frames/utils/getTemplates.js @@ -0,0 +1,10 @@ +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { readdirSync } from "node:fs"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export function getTemplates() { + // make sure you build the frames.js first so templates are copied to templates directory + return readdirSync(resolve(__dirname, "../templates")); +} diff --git a/packages/create-frames/utils/packageManagerRunCommand.js b/packages/create-frames/utils/packageManagerRunCommand.js new file mode 100644 index 000000000..c540090b6 --- /dev/null +++ b/packages/create-frames/utils/packageManagerRunCommand.js @@ -0,0 +1,16 @@ +import { detect } from "detect-package-manager"; + +export async function packageManagerRunCommand(command) { + const pkgManager = await detect(); + + switch (pkgManager) { + case "bun": + return `bun run ${command}`; + case "pnpm": + return `pnpm ${command}`; + case "yarn": + return `yarn ${command}`; + default: + return `npm run ${command}`; + } +} diff --git a/templates/express/.gitignore b/templates/express/.gitignore new file mode 100644 index 000000000..54f07af58 --- /dev/null +++ b/templates/express/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/templates/express/README.md b/templates/express/README.md new file mode 100644 index 000000000..6837f6b7a --- /dev/null +++ b/templates/express/README.md @@ -0,0 +1,11 @@ +# Welcome to Express.js + Frames.js + +📖 See the [Express.js docs](https://expressjs.com) and [Frames.js docs](https://framesjs.org) for details on supported features. + +## Development + +Run the Frames.js debugger and Vite dev server: + +```shellscript +npm run dev +``` diff --git a/templates/express/index.html b/templates/express/index.html new file mode 100644 index 000000000..fca754be5 --- /dev/null +++ b/templates/express/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Frames.js + Express.js + TS + + +
+ + + \ No newline at end of file diff --git a/templates/express/package.json b/templates/express/package.json new file mode 100644 index 000000000..22ee30bb6 --- /dev/null +++ b/templates/express/package.json @@ -0,0 +1,35 @@ +{ + "name": "template-express", + "version": "0.0.0", + "type": "module", + "private": true, + "dependencies": { + "compression": "^1.7.4", + "express": "^4.19.1", + "frames.js": "^0.9.6", + "react": "^18.2.0", + "sirv": "^2.0.4" + }, + "devDependencies": { + "@frames.js/debugger": "^0.1.9", + "@types/express": "^4.17.21", + "@types/node": "^18.17.0", + "@types/react": "^18.2.45", + "@vitejs/plugin-react": "^4.2.1", + "concurrently": "^8.2.2", + "cross-env": "^7.0.3", + "typescript": "^5.1.6", + "vite": "^5.1.0", + "vite-tsconfig-paths": "^4.2.1" + }, + "engines": { + "node": ">=18.17.0" + }, + "scripts": { + "dev": "concurrently --kill-others \"node server\" \"frames --url http://localhost:5173\"", + "build": "npm run build:client && npm run build:server", + "build:client": "vite build --ssrManifest --outDir dist/client", + "build:server": "vite build --ssr src/entry-server.tsx --outDir dist/server", + "preview": "cross-env NODE_ENV=production node server" + } +} diff --git a/templates/express/server.js b/templates/express/server.js new file mode 100644 index 000000000..f83570458 --- /dev/null +++ b/templates/express/server.js @@ -0,0 +1,57 @@ +import express from "express"; + +// Constants +const isProduction = process.env.NODE_ENV === "production"; +const port = process.env.PORT || 5173; +const base = process.env.BASE || "/"; + +// Create http server +const app = express(); + +// Add Vite or respective production middlewares +let vite; +if (!isProduction) { + const { createServer } = await import("vite"); + vite = await createServer({ + server: { middlewareMode: true }, + appType: "custom", + base, + }); + app.use(vite.middlewares); +} else { + const compression = (await import("compression")).default; + const sirv = (await import("sirv")).default; + app.use(compression()); + app.use(base, sirv("./dist/client", { extensions: [] })); +} + +// Serve HTML +app.use("*", async (req, res) => { + try { + const url = req.originalUrl.replace(base, ""); + + /** + * @type {import('express').Handler} + */ + let handleRequest; + if (!isProduction) { + // Always read fresh template in development + handleRequest = (await vite.ssrLoadModule("/src/entry-server.tsx")) + .handleRequest; + } else { + handleRequest = (await import("./dist/server/entry-server.js")) + .handleRequest; + } + + handleRequest(req, res); + } catch (e) { + vite?.ssrFixStacktrace(e); + console.log(e.stack); + res.status(500).end(e.stack); + } +}); + +// Start http server +app.listen(port, () => { + console.log(`Server started at http://localhost:${port}`); +}); diff --git a/templates/express/src/entry-server.tsx b/templates/express/src/entry-server.tsx new file mode 100644 index 000000000..fe5e89b6d --- /dev/null +++ b/templates/express/src/entry-server.tsx @@ -0,0 +1,51 @@ +import { farcasterHubContext } from "frames.js/middleware"; +import { createFrames, Button } from 'frames.js/express'; + +const frames = createFrames({ + middleware: [ + farcasterHubContext({ + // remove if you aren't using @frames.js/debugger or you just don't want to use the debugger hub + ...(process.env.NODE_ENV === "production" + ? {} + : { + hubHttpUrl: "http://localhost:3010/hub", + }), + }), + ], +}); + +export const handleRequest = frames(async ctx => { + return { + image: ctx.message ? ( +
+ GM, {ctx.message.requesterUserData?.displayName}! Your FID is{" "} + {ctx.message.requesterFid} + {", "} + {ctx.message.requesterFid < 20_000 + ? "you're OG!" + : "welcome to the Farcaster!"} +
+ ) : ( +
+ Say GM +
+ ), + buttons: !ctx.url.searchParams.has("saidGm") + ? [ + , + ] + : [], + }; +}); \ No newline at end of file diff --git a/templates/express/src/index.tsx b/templates/express/src/index.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/templates/express/src/vite-env.d.ts b/templates/express/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/templates/express/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/templates/express/tsconfig.json b/templates/express/tsconfig.json new file mode 100644 index 000000000..97cbe737d --- /dev/null +++ b/templates/express/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/templates/express/tsconfig.node.json b/templates/express/tsconfig.node.json new file mode 100644 index 000000000..1974ea683 --- /dev/null +++ b/templates/express/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowSyntheticDefaultImports": true, + "jsx": "preserve" + }, + "include": ["vite.config.ts"] +} diff --git a/templates/express/vite.config.ts b/templates/express/vite.config.ts new file mode 100644 index 000000000..9cc50ead1 --- /dev/null +++ b/templates/express/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/templates/hono/.gitignore b/templates/hono/.gitignore new file mode 100644 index 000000000..54f07af58 --- /dev/null +++ b/templates/hono/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/templates/hono/README.md b/templates/hono/README.md new file mode 100644 index 000000000..25a312857 --- /dev/null +++ b/templates/hono/README.md @@ -0,0 +1,11 @@ +# Welcome to Hono + Frames.js + +📖 See the [Hono docs](https://hono.dev) and [Frames.js docs](https://framesjs.org) for details on supported features. + +## Development + +Run the Frames.js debugger and Vite dev server: + +```shellscript +npm run dev +``` diff --git a/templates/hono/index.html b/templates/hono/index.html new file mode 100644 index 000000000..e7c576e55 --- /dev/null +++ b/templates/hono/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Frames.js + Hono + TS + + +
+ + + \ No newline at end of file diff --git a/templates/hono/package.json b/templates/hono/package.json new file mode 100644 index 000000000..564262d24 --- /dev/null +++ b/templates/hono/package.json @@ -0,0 +1,34 @@ +{ + "name": "template-hono", + "version": "0.0.0", + "type": "module", + "private": true, + "dependencies": { + "@hono/node-server": "^1.9.0", + "hono": "^4.1.3", + "frames.js": "^0.9.6", + "react": "^18.2.0" + }, + "devDependencies": { + "@frames.js/debugger": "^0.1.9", + "@hono/vite-dev-server": "^0.10.0", + "@types/node": "^18.17.0", + "@types/react": "^18.2.45", + "@vitejs/plugin-react": "^4.2.1", + "concurrently": "^8.2.2", + "cross-env": "^7.0.3", + "typescript": "^5.1.6", + "vite": "^5.1.0", + "vite-tsconfig-paths": "^4.2.1" + }, + "engines": { + "node": ">=18.17.0" + }, + "scripts": { + "dev": "concurrently --kill-others \"vite\" \"frames --url http://localhost:5173\"", + "build": "npm run build:client && npm run build:server", + "build:client": "vite build --ssrManifest --outDir dist/client", + "build:server": "vite build --ssr src/server.tsx --outDir dist/server", + "preview": "cross-env-shell NODE_ENV=production \"npm run build && node dist/server/server.js\"" + } +} diff --git a/templates/hono/src/index.tsx b/templates/hono/src/index.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/templates/hono/src/server.tsx b/templates/hono/src/server.tsx new file mode 100644 index 000000000..4a4d094b0 --- /dev/null +++ b/templates/hono/src/server.tsx @@ -0,0 +1,67 @@ +import { farcasterHubContext } from "frames.js/middleware"; +import { createFrames, Button } from 'frames.js/hono'; +import { Hono } from 'hono'; +import { serve } from "@hono/node-server"; + +const app = new Hono(); + +const frames = createFrames({ + middleware: [ + farcasterHubContext({ + // remove if you aren't using @frames.js/debugger or you just don't want to use the debugger hub + ...(process.env.NODE_ENV === "production" + ? {} + : { + hubHttpUrl: "http://localhost:3010/hub", + }), + }), + ], +}); + +const handleRequest = frames(async ctx => { + return { + image: ctx.message ? ( +
+ GM, {ctx.message.requesterUserData?.displayName}! Your FID is{" "} + {ctx.message.requesterFid} + {", "} + {ctx.message.requesterFid < 20_000 + ? "you're OG!" + : "welcome to the Farcaster!"} +
+ ) : ( +
+ Say GM +
+ ), + buttons: !ctx.url.searchParams.has("saidGm") + ? [ + , + ] + : [], + }; +}); + +app.get('/', handleRequest); +app.post('/', handleRequest); + +// expose app for `@hono/vite-dev-server` +export default app; + +if (process.env.NODE_ENV === 'production') { + serve({ ...app, port: 3000 }, info => { + console.log(`Server running on http://localhost:${info.port}`); + }) +} \ No newline at end of file diff --git a/templates/hono/tsconfig.json b/templates/hono/tsconfig.json new file mode 100644 index 000000000..97cbe737d --- /dev/null +++ b/templates/hono/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/templates/hono/tsconfig.node.json b/templates/hono/tsconfig.node.json new file mode 100644 index 000000000..1974ea683 --- /dev/null +++ b/templates/hono/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowSyntheticDefaultImports": true, + "jsx": "preserve" + }, + "include": ["vite.config.ts"] +} diff --git a/templates/hono/vite.config.ts b/templates/hono/vite.config.ts new file mode 100644 index 000000000..33520be12 --- /dev/null +++ b/templates/hono/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import devServer from "@hono/vite-dev-server"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + devServer({ + entry: "./src/server.tsx", + }), + ], +}); diff --git a/templates/next-starter-with-examples/.env.sample b/templates/next-starter-with-examples/.env.sample new file mode 100644 index 000000000..9b743ad15 --- /dev/null +++ b/templates/next-starter-with-examples/.env.sample @@ -0,0 +1,17 @@ +# Example: FARCASTER_DEVELOPER_MNEMONIC="candy gibraltar foxtrot kilo barnacles foxes ..." +# (OPTIONAL) Needed for the debugger to create a real Farcaster signer. Get this by exporting your seed phrase from the Warpcast app. Don't share that seed phrase with anyone. +FARCASTER_DEVELOPER_MNEMONIC= +# (OPTIONAL) Only needed for the debugger to create a real Farcaster signer. Get this by visiting your Warpccast profile, pressing the kebab (three dots) menu and then "About" and then your fid should be there. +# Example: FARCASTER_DEVELOPER_FID=1214 +FARCASTER_DEVELOPER_FID= +# (OPTIONAL) Hub URL to use for the debugger. If not set, the debugger will use the default hub URL. +DEBUG_HUB_HTTP_URL= + +NEXT_PUBLIC_HOST="http://localhost:3000" + +# OPTIONAL EXAMPLE KEYS +# Optional, if you use this example +KV_REST_API_URL="" +KV_REST_API_TOKEN="" +# Optional +DEBUGGER_URL="" \ No newline at end of file diff --git a/templates/next-starter-with-examples/.eslintrc.js b/templates/next-starter-with-examples/.eslintrc.js new file mode 100644 index 000000000..00e4aaad1 --- /dev/null +++ b/templates/next-starter-with-examples/.eslintrc.js @@ -0,0 +1,5 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["next"], +}; diff --git a/templates/next-starter-with-examples/.gitignore b/templates/next-starter-with-examples/.gitignore new file mode 100644 index 000000000..f96c7fc29 --- /dev/null +++ b/templates/next-starter-with-examples/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +.env +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +mocks.json diff --git a/templates/next-starter-with-examples/README.md b/templates/next-starter-with-examples/README.md new file mode 100644 index 000000000..72fa5b720 --- /dev/null +++ b/templates/next-starter-with-examples/README.md @@ -0,0 +1,40 @@ +# Frames.js Starter Kit with examples + +This is a boilerplate template to get started quickly with `frames.js` + +## Quickstart + +If running from the frames.js repository itself: + +- Run `yarn` from the repository root +- Run `cd templates/next-starter-with-examples` + +1. Install dependencies `yarn install` + +2. Run `yarn dev` to run the server and debugger, this will also open the debugger automatically in your browser. + +3. Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +4. Edit `app/page.tsx` + +5. Visit [http://localhost:3000/examples](http://localhost:3000/examples) to see the list of examples. + +6. (Optional) To use a real signer (costs warps), copy `.env.sample` to `.env` and fill in the env variables following the comments provided + +## Docs, Questions and Help + +- [Frames.js Documentation](https://framesjs.org) +- [Awesome frames](https://github.com/davidfurlong/awesome-frames?tab=readme-ov-file) +- Join the [/frames-dev](https://warpcast.com/~/channel/frames-devs) channel on Farcaster to ask questions + +## If you get stuck or have feedback, [Message @df please!](https://warpcast.com/df) + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy + +```bash +vercel +``` + +more deployment links coming soon, PRs welcome! diff --git a/templates/next-starter-with-examples/app/debug.ts b/templates/next-starter-with-examples/app/debug.ts new file mode 100644 index 000000000..d91a3acec --- /dev/null +++ b/templates/next-starter-with-examples/app/debug.ts @@ -0,0 +1,19 @@ +const DEFAULT_DEBUGGER_URL = + process.env.DEBUGGER_URL ?? "http://localhost:3010/"; + +export const DEFAULT_DEBUGGER_HUB_URL = + process.env.NODE_ENV === "development" + ? new URL("/hub", DEFAULT_DEBUGGER_URL).toString() + : undefined; + +export function createDebugUrl(frameURL: string | URL): string { + try { + const url = new URL("/", DEFAULT_DEBUGGER_URL); + + url.searchParams.set("url", frameURL.toString()); + + return url.toString(); + } catch (error) { + return "#"; + } +} diff --git a/templates/next-starter-with-examples/app/examples/custom-hub/frames/route.ts b/templates/next-starter-with-examples/app/examples/custom-hub/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/custom-hub/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/custom-hub/page.tsx b/templates/next-starter-with-examples/app/examples/custom-hub/page.tsx new file mode 100644 index 000000000..02803e8de --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/custom-hub/page.tsx @@ -0,0 +1,117 @@ +import { + FrameButton, + FrameContainer, + FrameImage, + FrameInput, + FrameReducer, + NextServerPageProps, + getPreviousFrame, + useFramesReducer, + getFrameMessage, +} from "frames.js/next/server"; +import Link from "next/link"; +import { getTokenUrl } from "frames.js"; +import { createDebugUrl } from "../../debug"; +import { currentURL } from "../../utils"; + +type State = { + active: string; + total_button_presses: number; +}; + +const initialState = { active: "1", total_button_presses: 0 }; + +const reducer: FrameReducer = (state, action) => { + return { + total_button_presses: state.total_button_presses + 1, + active: action.postBody?.untrustedData.buttonIndex + ? String(action.postBody?.untrustedData.buttonIndex) + : "1", + }; +}; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/examples/custom-hub"); + const previousFrame = getPreviousFrame(searchParams); + + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: "https://hub.freefarcasterhub.com:3281", + fetchHubContext: true, + }); + + if (frameMessage && !frameMessage?.isValid) { + throw new Error("Invalid frame payload"); + } + + const [state, dispatch] = useFramesReducer( + reducer, + initialState, + previousFrame + ); + + // Here: do a server side side effect either sync or async (using await), such as minting an NFT if you want. + // example: load the users credentials & check they have an NFT + + console.log("info: state is:", state); + + if (frameMessage) { + const { + isValid, + buttonIndex, + inputText, + castId, + requesterFid, + casterFollowsRequester, + requesterFollowsCaster, + likedCast, + recastedCast, + requesterVerifiedAddresses, + requesterUserData, + } = frameMessage; + + console.log("info: frameMessage is:", frameMessage); + } + + // then, when done, return next frame + return ( +
+ frames.js starter kit.{" "} + + Debug + + + {/* */} + +
+ {frameMessage?.inputText ? frameMessage.inputText : "Hello world"} +
+
+ + + {state?.active === "1" ? "Active" : "Inactive"} + + + {state?.active === "2" ? "Active" : "Inactive"} + + + Mint + + + External + +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/mint-button/frames/route.ts b/templates/next-starter-with-examples/app/examples/mint-button/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/mint-button/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/mint-button/page.tsx b/templates/next-starter-with-examples/app/examples/mint-button/page.tsx new file mode 100644 index 000000000..bf712d793 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/mint-button/page.tsx @@ -0,0 +1,89 @@ +import { getTokenUrl } from "frames.js"; +import { + FrameButton, + FrameContainer, + FrameImage, + FrameReducer, + NextServerPageProps, + getPreviousFrame, + useFramesReducer, +} from "frames.js/next/server"; +import Link from "next/link"; +import { zora } from "viem/chains"; +import { currentURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; + +type State = { + pageIndex: number; +}; + +const nfts: { + src: string; + tokenUrl: string; +}[] = [ + { + src: "https://ipfs.decentralized-content.com/ipfs/bafybeifs7vasy5zbmnpixt7tb6efi35kcrmpoz53d3vg5pwjz52q7fl6pq/cook.png", + tokenUrl: getTokenUrl({ + address: "0x99de131ff1223c4f47316c0bb50e42f356dafdaa", + chain: zora, + tokenId: "2", + }), + }, + { + src: "https://remote-image.decentralized-content.com/image?url=https%3A%2F%2Fipfs.decentralized-content.com%2Fipfs%2Fbafybeiegrnialwu66u3nwzkn4gik4i2x2h4ip7y3w2dlymzlpxb5lrqbom&w=1920&q=75", + tokenUrl: getTokenUrl({ + address: "0x060f3edd18c47f59bd23d063bbeb9aa4a8fec6df", + chain: zora, + tokenId: "1", + }), + }, + { + src: "https://remote-image.decentralized-content.com/image?url=https%3A%2F%2Fipfs.decentralized-content.com%2Fipfs%2Fbafybeidc6e5t3qmyckqh4fr2ewrov5asmeuv4djycopvo3ro366nd3bfpu&w=1920&q=75", + tokenUrl: getTokenUrl({ + address: "0x8f5ed2503b71e8492badd21d5aaef75d65ac0042", + chain: zora, + tokenId: "3", + }), + }, +]; +const initialState: State = { pageIndex: 0 }; + +const reducer: FrameReducer = (state, action) => { + const buttonIndex = action.postBody?.untrustedData.buttonIndex; + + return { + pageIndex: buttonIndex + ? (state.pageIndex + (buttonIndex === 2 ? 1 : -1)) % nfts.length + : state.pageIndex, + }; +}; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/examples/mint-button"); + const previousFrame = getPreviousFrame(searchParams); + const [state] = useFramesReducer(reducer, initialState, previousFrame); + + // then, when done, return next frame + return ( +
+ Mint button example Debug + + + + + + Mint + + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/multi-page/frames/route.ts b/templates/next-starter-with-examples/app/examples/multi-page/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/multi-page/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/multi-page/page.tsx b/templates/next-starter-with-examples/app/examples/multi-page/page.tsx new file mode 100644 index 000000000..03e133526 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/multi-page/page.tsx @@ -0,0 +1,61 @@ +import { + FrameButton, + FrameContainer, + FrameImage, + FrameReducer, + NextServerPageProps, + getPreviousFrame, + useFramesReducer, +} from "frames.js/next/server"; +import Link from "next/link"; +import { currentURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; + +type State = { + pageIndex: number; +}; + +const totalPages = 5; +const initialState: State = { pageIndex: 0 }; + +const reducer: FrameReducer = (state, action) => { + const buttonIndex = action.postBody?.untrustedData.buttonIndex; + + return { + pageIndex: buttonIndex + ? (state.pageIndex + (buttonIndex === 2 ? 1 : -1)) % totalPages + : state.pageIndex, + }; +}; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/examples/multi-page"); + const previousFrame = getPreviousFrame(searchParams); + const [state] = useFramesReducer(reducer, initialState, previousFrame); + const imageUrl = `https://picsum.photos/seed/frames.js-${state.pageIndex}/1146/600`; + + // then, when done, return next frame + return ( +
+ Multi-page example Debug + + +
+ Image +
+ This is slide {state.pageIndex + 1} / {totalPages} +
+
+
+ + +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/multi-protocol/frames/route.ts b/templates/next-starter-with-examples/app/examples/multi-protocol/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/multi-protocol/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/multi-protocol/page.tsx b/templates/next-starter-with-examples/app/examples/multi-protocol/page.tsx new file mode 100644 index 000000000..9668674f8 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/multi-protocol/page.tsx @@ -0,0 +1,83 @@ +import { ClientProtocolId } from "frames.js"; +import { + FrameButton, + FrameContainer, + FrameImage, + NextServerPageProps, + getFrameMessage, + getPreviousFrame, +} from "frames.js/next/server"; +import { getXmtpFrameMessage, isXmtpFrameActionPayload } from "frames.js/xmtp"; +import { currentURL } from "../../utils"; +import { DEFAULT_DEBUGGER_HUB_URL, createDebugUrl } from "../../debug"; +import Link from "next/link"; + +const acceptedProtocols: ClientProtocolId[] = [ + { + id: "xmtp", + version: "vNext", + }, + { + id: "farcaster", + version: "vNext", + }, +]; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/examples/multi-protocol"); + const previousFrame = getPreviousFrame(searchParams); + + let fid: number | undefined; + let walletAddress: string | undefined; + + if ( + previousFrame.postBody && + isXmtpFrameActionPayload(previousFrame.postBody) + ) { + const frameMessage = await getXmtpFrameMessage(previousFrame.postBody); + walletAddress = frameMessage?.verifiedWalletAddress; + } else { + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + if (frameMessage && frameMessage?.isValid) { + fid = frameMessage?.requesterFid; + walletAddress = + frameMessage?.requesterCustodyAddress.length > 0 + ? frameMessage?.requesterCustodyAddress + : frameMessage.requesterCustodyAddress; + } + } + + return ( +
+ Multi-protocol example{" "} + + Debug + + + +
+
+ This frame gets the interactor's wallet address or FID + depending on the client protocol. +
+ {fid &&
FID: {fid}
} + {walletAddress && ( +
Wallet Address: {walletAddress}
+ )} +
+
+ Check +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-cache-control/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-cache-control/frames/route.tsx new file mode 100644 index 000000000..ee6293fa3 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-cache-control/frames/route.tsx @@ -0,0 +1,28 @@ +/* eslint-disable react/jsx-key */ +import { Button } from "frames.js/next"; +import { createFrames } from "frames.js/next"; + +const frames = createFrames({ + basePath: "/examples/new-api-cache-control", +}); + +const handleRequest = frames(async (ctx) => { + return { + image: ( +
+ The current time is {new Date().toLocaleString()} +
+ ), + imageOptions: { + aspectRatio: "1:1", + }, + buttons: [], + headers: { + // Max cache age in seconds + "Cache-Control": "max-age=5", + }, + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-cache-control/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-cache-control/page.tsx new file mode 100644 index 000000000..e0053b7b0 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-cache-control/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-cache-control/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-cache-control"); + + return ( +
+ Cache control example{" "} + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-mint-button/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-mint-button/frames/route.tsx new file mode 100644 index 000000000..23ee9ccf8 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-mint-button/frames/route.tsx @@ -0,0 +1,76 @@ +/* eslint-disable react/jsx-key */ +import { Button, createFrames } from "frames.js/next"; +import { getTokenUrl } from "frames.js"; +import { zora } from "viem/chains"; + +const nfts: { + src: string; + tokenUrl: string; +}[] = [ + { + src: "https://ipfs.decentralized-content.com/ipfs/bafybeifs7vasy5zbmnpixt7tb6efi35kcrmpoz53d3vg5pwjz52q7fl6pq/cook.png", + tokenUrl: getTokenUrl({ + address: "0x99de131ff1223c4f47316c0bb50e42f356dafdaa", + chain: zora, + tokenId: "2", + }), + }, + { + src: "https://remote-image.decentralized-content.com/image?url=https%3A%2F%2Fipfs.decentralized-content.com%2Fipfs%2Fbafybeiegrnialwu66u3nwzkn4gik4i2x2h4ip7y3w2dlymzlpxb5lrqbom&w=1920&q=75", + tokenUrl: getTokenUrl({ + address: "0x060f3edd18c47f59bd23d063bbeb9aa4a8fec6df", + chain: zora, + tokenId: "1", + }), + }, + { + src: "https://remote-image.decentralized-content.com/image?url=https%3A%2F%2Fipfs.decentralized-content.com%2Fipfs%2Fbafybeidc6e5t3qmyckqh4fr2ewrov5asmeuv4djycopvo3ro366nd3bfpu&w=1920&q=75", + tokenUrl: getTokenUrl({ + address: "0x8f5ed2503b71e8492badd21d5aaef75d65ac0042", + chain: zora, + tokenId: "3", + }), + }, +]; + +const frames = createFrames({ + basePath: "/examples/new-api-mint-button/frames", +}); + +const handleRequest = frames(async (ctx) => { + const page = Number(ctx.searchParams?.pageIndex ?? 0); + return { + image: nfts[page]!.src, + imageOptions: { + aspectRatio: "1:1", + }, + buttons: [ + , + , + , + ], + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-mint-button/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-mint-button/page.tsx new file mode 100644 index 000000000..7ab663d32 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-mint-button/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-mint-button/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-mint-button"); + + return ( +
+ New api mint button example.{" "} + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-multi-page/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-multi-page/frames/route.tsx new file mode 100644 index 000000000..8973e65f0 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-multi-page/frames/route.tsx @@ -0,0 +1,47 @@ +/* eslint-disable react/jsx-key */ +import { createFrames, Button } from "frames.js/next"; + +const totalPages = 5; + +const frames = createFrames({ + basePath: "/examples/new-api-multi-page/frames", +}); + +const handleRequest = frames(async (ctx) => { + const pageIndex = Number(ctx.searchParams.pageIndex || 0); + + const imageUrl = `https://picsum.photos/seed/frames.js-${pageIndex}/300/200`; + + return { + image: ( +
+ Image +
+ This is slide {pageIndex + 1} / {totalPages} +
+
+ ), + buttons: [ + , + , + ], + textInput: "Type something!", + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-multi-page/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-multi-page/page.tsx new file mode 100644 index 000000000..7c92dee31 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-multi-page/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-multi-page/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-multi-page"); + + return ( +
+ Multi-page example + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/frames.ts b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/frames.ts new file mode 100644 index 000000000..0234c8657 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/frames.ts @@ -0,0 +1,34 @@ +/* eslint-disable react/jsx-key */ +import { farcasterHubContext, openframes } from "frames.js/middleware"; +import { createFrames } from "frames.js/next"; +import { getXmtpFrameMessage, isXmtpFrameActionPayload } from "frames.js/xmtp"; +import { DEFAULT_DEBUGGER_HUB_URL } from "../../debug"; + +export const frames = createFrames({ + basePath: "/examples/new-api-multi-protocol", + initialState: { + pageIndex: 0, + }, + middleware: [ + farcasterHubContext({ + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }), + openframes({ + clientProtocol: { + id: "xmtp", + version: "2024-02-09", + }, + handler: { + isValidPayload: (body: JSON) => isXmtpFrameActionPayload(body), + getFrameMessage: async (body: JSON) => { + if (!isXmtpFrameActionPayload(body)) { + return undefined; + } + const result = await getXmtpFrameMessage(body); + + return { ...result }; + }, + }, + }), + ], +}); diff --git a/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/frames/route.tsx new file mode 100644 index 000000000..07043b99d --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/frames/route.tsx @@ -0,0 +1,20 @@ +import { Button } from "frames.js/next"; +import { frames } from "../frames"; + +const handleRequest = frames(async (ctx) => { + return { + image: ( +
+
Click the button
+
+ ), + buttons: [ + , + ], + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/page.tsx new file mode 100644 index 000000000..4051f3eb4 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-multi-protocol/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-multi-protocol"); + + return ( +
+ Multi-protocol example + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/who-am-i/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/who-am-i/route.tsx new file mode 100644 index 000000000..ca633b088 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-multi-protocol/who-am-i/route.tsx @@ -0,0 +1,14 @@ +import { frames } from "../frames"; + +export const POST = frames(async (ctx) => { + return { + image: ( +
+ You are{" "} + {ctx.message?.requesterCustodyAddress || + ctx.message?.verifiedWalletAddress}{" "} + from {ctx.clientProtocol?.id} +
+ ), + }; +}); diff --git a/templates/next-starter-with-examples/app/examples/new-api-only-followers-can-mint/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-only-followers-can-mint/frames/route.tsx new file mode 100644 index 000000000..31cc4f6a5 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-only-followers-can-mint/frames/route.tsx @@ -0,0 +1,65 @@ +/* eslint-disable react/jsx-key */ +import { getTokenUrl } from "frames.js"; +import { farcasterHubContext } from "frames.js/middleware"; +import { Button, createFrames } from "frames.js/next"; +import { zora } from "viem/chains"; +import { DEFAULT_DEBUGGER_HUB_URL } from "../../../debug"; + +const frames = createFrames({ + basePath: "/examples/new-api-only-followers-can-mint/frames", + middleware: [ + farcasterHubContext({ + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }), + ], +}); + +const handleRequest = frames(async (ctx) => { + const page = ctx.searchParams?.page ?? "initial"; + if (page === "initial") + return { + image: ( + +
+ You can mint if you follow the caster. +
+
+ ), + buttons: [ + , + ], + }; + return { + image: ( +
+ {ctx.message?.requesterFollowsCaster + ? "You are following the caster." + : "You are not following the caster"} +
+ ), + buttons: [ + ctx.message?.requesterFollowsCaster ? ( + + ) : ( + + ), + ], + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-only-followers-can-mint/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-only-followers-can-mint/page.tsx new file mode 100644 index 000000000..411c881cb --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-only-followers-can-mint/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-only-followers-can-mint/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-only-followers-can-mint"); + + return ( +
+ New api example only followers can mint.{" "} + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-post-redirect/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-post-redirect/frames/route.tsx new file mode 100644 index 000000000..b478f04b1 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-post-redirect/frames/route.tsx @@ -0,0 +1,28 @@ +/* eslint-disable react/jsx-key */ +import { createFrames, Button } from "frames.js/next"; +import { redirect } from "frames.js/core"; + +const frames = createFrames({ + basePath: "/examples/new-api-post-redirect/frames", +}); + +const handleRequest = frames(async (ctx) => { + if (ctx.pressedButton?.action === "post_redirect") { + // Do something with the POST + + // when post_redirect button is clicked you must return a redirect response + return redirect("https://google.com"); + } + + return { + image: ( +
+
Post redirect example
+
+ ), + buttons: [], + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-post-redirect/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-post-redirect/page.tsx new file mode 100644 index 000000000..ac5b9b54c --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-post-redirect/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-post-redirect/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-post-redirect"); + + return ( +
+ Post redirect example + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-slow-request/README.md b/templates/next-starter-with-examples/app/examples/new-api-slow-request/README.md new file mode 100644 index 000000000..0f563d1d5 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-slow-request/README.md @@ -0,0 +1,6 @@ +# Step 1 + +Setup a key value store +https://vercel.com/docs/storage/vercel-kv/quickstart + +or follow the steps in this PR to set it up locally using Docker: https://github.com/vercel/storage/issues/281#issuecomment-1650439329 diff --git a/templates/next-starter-with-examples/app/examples/new-api-slow-request/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-slow-request/frames/route.tsx new file mode 100644 index 000000000..a9944f032 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-slow-request/frames/route.tsx @@ -0,0 +1,126 @@ +import { kv } from "@vercel/kv"; +import { types } from "frames.js/core"; +import { createFrames, Button } from "frames.js/next"; +import { RandomNumberRequestStateValue } from "../slow-fetch/types"; + +const frames = createFrames({ + basePath: "/examples/new-api-slow-request/frames", +}); + +const handleRequest = frames(async (ctx) => { + const initialFrame = { + image: ( +
+ This random number generator takes 10 seconds to respond +
+ ), + buttons: [ + , + ], + } satisfies types.FrameDefinition; + + const checkStatusFrame = { + image: ( +
+ Loading... +
+ ), + buttons: [ + , + ], + } satisfies types.FrameDefinition; + + if (!ctx.message) { + return initialFrame; + } + + const { requesterFid } = ctx.message; + const uniqueId = `fid:${requesterFid}`; + + const existingRequest = await kv.get(uniqueId); + + if (existingRequest) { + switch (existingRequest.status) { + case "pending": + return checkStatusFrame; + case "success": { + if (ctx.url.searchParams.get("reset") === "true") { + // reset to initial state + await kv.del(uniqueId); + } + + return { + image: ( +
+ The number is {existingRequest.data} +
+ ), + buttons: [ + , + ], + } satisfies types.FrameDefinition; + } + case "error": { + if (ctx.url.searchParams.get("retry") === "true") { + // reset to initial state + await kv.del(uniqueId); + + return initialFrame; + } else { + return { + image: {existingRequest.error}, + buttons: [ + , + ], + } satisfies types.FrameDefinition; + } + } + } + } else { + await kv.set( + uniqueId, + { + status: "pending", + timestamp: new Date().getTime(), + }, + // set as pending for one minute + { ex: 60 } + ); + + // start request, don't await it! Return a loading page, let this run in the background + fetch( + new URL( + "/examples/new-api-slow-request/slow-fetch", + process.env.NEXT_PUBLIC_HOST + ).toString(), + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(await ctx.request.clone().json()), + } + ); + } + + return initialFrame; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-slow-request/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-slow-request/page.tsx new file mode 100644 index 000000000..40022d793 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-slow-request/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-slow-request/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-slow-request"); + + return ( +
+ Slow request example + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-slow-request/slow-fetch/route.ts b/templates/next-starter-with-examples/app/examples/new-api-slow-request/slow-fetch/route.ts new file mode 100644 index 000000000..138b20a98 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-slow-request/slow-fetch/route.ts @@ -0,0 +1,53 @@ +import { getFrameMessage } from "frames.js"; +import { NextRequest, NextResponse } from "next/server"; +import { kv } from "@vercel/kv"; +import { RandomNumberRequestStateValue } from "./types"; +import { DEFAULT_DEBUGGER_HUB_URL } from "../../../debug"; + +const MAXIMUM_KV_RESULT_LIFETIME_IN_SECONDS = 2 * 60; // 2 minutes + +export async function POST(req: NextRequest) { + const body = await req.json(); + + // verify independently + const frameMessage = await getFrameMessage(body, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + const uniqueId = `fid:${frameMessage.requesterFid}`; + + // Wait 10 seconds + await new Promise((resolve) => setTimeout(resolve, 10000)); + + try { + const randomNumber = Math.random(); + + await kv.set( + uniqueId, + { + data: randomNumber, + status: "success", + timestamp: new Date().getTime(), + }, + { ex: MAXIMUM_KV_RESULT_LIFETIME_IN_SECONDS } + ); + + return NextResponse.json({ + data: randomNumber, + status: "success", + timestamp: new Date().getTime(), + }); + } catch (e) { + await kv.set( + uniqueId, + { + error: String(e), + status: "error", + timestamp: new Date().getTime(), + }, + { ex: MAXIMUM_KV_RESULT_LIFETIME_IN_SECONDS } + ); + // Handle errors + return NextResponse.json({ message: e }, { status: 500 }); + } +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-slow-request/slow-fetch/types.ts b/templates/next-starter-with-examples/app/examples/new-api-slow-request/slow-fetch/types.ts new file mode 100644 index 000000000..72fa08eeb --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-slow-request/slow-fetch/types.ts @@ -0,0 +1,15 @@ +export type RandomNumberRequestStateValue = + | { + error: string; + status: "error"; + timestamp: number; + } + | { + data: number; + status: "success"; + timestamp: number; + } + | { + status: "pending"; + timestamp: number; + }; diff --git a/templates/next-starter-with-examples/app/examples/new-api-transaction/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api-transaction/frames/route.tsx new file mode 100644 index 000000000..8a1587891 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-transaction/frames/route.tsx @@ -0,0 +1,49 @@ +/* eslint-disable react/jsx-key */ +import { Button } from "frames.js/next"; +import { createFrames } from "frames.js/next"; + +const frames = createFrames({ + basePath: "/examples/new-api-transaction", +}); + +const handleRequest = frames(async (ctx) => { + if (ctx.message?.transactionId) { + return { + image: ( +
+ Transaction submitted! {ctx.message.transactionId} +
+ ), + imageOptions: { + aspectRatio: "1:1", + }, + buttons: [ + , + ], + }; + } + + return { + image: ( +
+ Rent farcaster storage +
+ ), + imageOptions: { + aspectRatio: "1:1", + }, + buttons: [ + , + ], + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api-transaction/page.tsx b/templates/next-starter-with-examples/app/examples/new-api-transaction/page.tsx new file mode 100644 index 000000000..97fd5987f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-transaction/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api-transaction/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api-transaction"); + + return ( +
+ Rent farcaster storage example{" "} + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api-transaction/txdata/contracts/storage-registry.ts b/templates/next-starter-with-examples/app/examples/new-api-transaction/txdata/contracts/storage-registry.ts new file mode 100644 index 000000000..3f7e362b3 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-transaction/txdata/contracts/storage-registry.ts @@ -0,0 +1,814 @@ +export const storageRegistryABI = [ + { + inputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "_priceFeed", + type: "address", + }, + { + internalType: "contract AggregatorV3Interface", + name: "_uptimeFeed", + type: "address", + }, + { + internalType: "uint256", + name: "_initialUsdUnitPrice", + type: "uint256", + }, + { internalType: "uint256", name: "_initialMaxUnits", type: "uint256" }, + { internalType: "address", name: "_initialVault", type: "address" }, + { internalType: "address", name: "_initialRoleAdmin", type: "address" }, + { internalType: "address", name: "_initialOwner", type: "address" }, + { internalType: "address", name: "_initialOperator", type: "address" }, + { internalType: "address", name: "_initialTreasurer", type: "address" }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { inputs: [], name: "CallFailed", type: "error" }, + { inputs: [], name: "ContractDeprecated", type: "error" }, + { inputs: [], name: "ExceedsCapacity", type: "error" }, + { inputs: [], name: "GracePeriodNotOver", type: "error" }, + { inputs: [], name: "IncompleteRound", type: "error" }, + { inputs: [], name: "InvalidAddress", type: "error" }, + { inputs: [], name: "InvalidAmount", type: "error" }, + { inputs: [], name: "InvalidBatchInput", type: "error" }, + { inputs: [], name: "InvalidDeprecationTimestamp", type: "error" }, + { inputs: [], name: "InvalidFixedPrice", type: "error" }, + { inputs: [], name: "InvalidMaxAnswer", type: "error" }, + { inputs: [], name: "InvalidMinAnswer", type: "error" }, + { inputs: [], name: "InvalidPayment", type: "error" }, + { inputs: [], name: "InvalidPrice", type: "error" }, + { inputs: [], name: "InvalidRangeInput", type: "error" }, + { inputs: [], name: "InvalidRoundTimestamp", type: "error" }, + { inputs: [], name: "NotOperator", type: "error" }, + { inputs: [], name: "NotOwner", type: "error" }, + { inputs: [], name: "NotTreasurer", type: "error" }, + { inputs: [], name: "PriceOutOfBounds", type: "error" }, + { inputs: [], name: "SequencerDown", type: "error" }, + { inputs: [], name: "StaleAnswer", type: "error" }, + { inputs: [], name: "Unauthorized", type: "error" }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "Paused", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "payer", + type: "address", + }, + { indexed: true, internalType: "uint256", name: "fid", type: "uint256" }, + { + indexed: false, + internalType: "uint256", + name: "units", + type: "uint256", + }, + ], + name: "Rent", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldDuration", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newDuration", + type: "uint256", + }, + ], + name: "SetCacheDuration", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldTimestamp", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newTimestamp", + type: "uint256", + }, + ], + name: "SetDeprecationTimestamp", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetFixedEthUsdPrice", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPeriod", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPeriod", + type: "uint256", + }, + ], + name: "SetGracePeriod", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldAge", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newAge", + type: "uint256", + }, + ], + name: "SetMaxAge", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetMaxAnswer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldMax", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newMax", + type: "uint256", + }, + ], + name: "SetMaxUnits", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetMinAnswer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetPrice", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldFeed", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newFeed", + type: "address", + }, + ], + name: "SetPriceFeed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldFeed", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newFeed", + type: "address", + }, + ], + name: "SetUptimeFeed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldVault", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newVault", + type: "address", + }, + ], + name: "SetVault", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "Unpaused", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "address", name: "to", type: "address" }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Withdraw", + type: "event", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "uint256[]", name: "fids", type: "uint256[]" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "batchCredit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256[]", name: "fids", type: "uint256[]" }, + { internalType: "uint256[]", name: "units", type: "uint256[]" }, + ], + name: "batchRent", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "start", type: "uint256" }, + { internalType: "uint256", name: "end", type: "uint256" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "continuousCredit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "fid", type: "uint256" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "credit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "deprecationTimestamp", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ethUsdPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "fixedEthUsdPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "bytes32", name: "role", type: "bytes32" }], + name: "getRoleAdmin", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "uint256", name: "index", type: "uint256" }, + ], + name: "getRoleMember", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "bytes32", name: "role", type: "bytes32" }], + name: "getRoleMemberCount", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "hasRole", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "lastPriceFeedUpdateBlock", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "lastPriceFeedUpdateTime", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "maxUnits", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pause", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "paused", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "prevEthUsdPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "units", type: "uint256" }], + name: "price", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeed", + outputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedCacheDuration", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedMaxAge", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedMaxAnswer", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedMinAnswer", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "refreshPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "fid", type: "uint256" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "rent", + outputs: [ + { internalType: "uint256", name: "overpayment", type: "uint256" }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "rentedUnits", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "duration", type: "uint256" }], + name: "setCacheDuration", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "timestamp", type: "uint256" }], + name: "setDeprecationTimestamp", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "fixedPrice", type: "uint256" }], + name: "setFixedEthUsdPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "period", type: "uint256" }], + name: "setGracePeriod", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "age", type: "uint256" }], + name: "setMaxAge", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "maxPrice", type: "uint256" }], + name: "setMaxAnswer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "max", type: "uint256" }], + name: "setMaxUnits", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "minPrice", type: "uint256" }], + name: "setMinAnswer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "usdPrice", type: "uint256" }], + name: "setPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "feed", + type: "address", + }, + ], + name: "setPriceFeed", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "feed", + type: "address", + }, + ], + name: "setUptimeFeed", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "vaultAddr", type: "address" }], + name: "setVault", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "bytes4", name: "interfaceId", type: "bytes4" }], + name: "supportsInterface", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unitPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unpause", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uptimeFeed", + outputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "uptimeFeedGracePeriod", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "usdUnitPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "vault", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "amount", type: "uint256" }], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; diff --git a/templates/next-starter-with-examples/app/examples/new-api-transaction/txdata/route.ts b/templates/next-starter-with-examples/app/examples/new-api-transaction/txdata/route.ts new file mode 100644 index 000000000..c574ab85c --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api-transaction/txdata/route.ts @@ -0,0 +1,58 @@ +import { STORAGE_REGISTRY_ADDRESS } from "@farcaster/core"; +import { TransactionTargetResponse } from "frames.js"; +import { getFrameMessage } from "frames.js/next/server"; +import { NextRequest, NextResponse } from "next/server"; +import { + Abi, + createPublicClient, + encodeFunctionData, + getContract, + http, +} from "viem"; +import { optimism } from "viem/chains"; +import { storageRegistryABI } from "./contracts/storage-registry"; + +export async function POST( + req: NextRequest +): Promise> { + const json = await req.json(); + + const frameMessage = await getFrameMessage(json); + + if (!frameMessage) { + throw new Error("No frame message"); + } + + // Get current storage price + const units = 1n; + + const calldata = encodeFunctionData({ + abi: storageRegistryABI, + functionName: "rent", + args: [BigInt(frameMessage.requesterFid), units], + }); + + const publicClient = createPublicClient({ + chain: optimism, + transport: http(), + }); + + const storageRegistry = getContract({ + address: STORAGE_REGISTRY_ADDRESS, + abi: storageRegistryABI, + client: publicClient, + }); + + const unitPrice = await storageRegistry.read.price([units]); + + return NextResponse.json({ + chainId: "eip155:10", // OP Mainnet 10 + method: "eth_sendTransaction", + params: { + abi: storageRegistryABI as Abi, + to: STORAGE_REGISTRY_ADDRESS, + data: calldata, + value: unitPrice.toString(), + }, + }); +} diff --git a/templates/next-starter-with-examples/app/examples/new-api/frames/frames.ts b/templates/next-starter-with-examples/app/examples/new-api/frames/frames.ts new file mode 100644 index 000000000..3fdf38d47 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api/frames/frames.ts @@ -0,0 +1,5 @@ +import { createFrames } from "frames.js/next"; + +export const frames = createFrames({ + basePath: "/examples/new-api/frames", +}); diff --git a/templates/next-starter-with-examples/app/examples/new-api/frames/next/route.tsx b/templates/next-starter-with-examples/app/examples/new-api/frames/next/route.tsx new file mode 100644 index 000000000..9c6ab573a --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api/frames/next/route.tsx @@ -0,0 +1,21 @@ +/* eslint-disable react/jsx-key */ +import { Button } from "frames.js/next"; +import { frames } from "../frames"; + +const handleRequest = frames(async (ctx) => { + return { + image: ( + + This is next frame and you clicked button:{" "} + {ctx.pressedButton ? "✅" : "❌"} + + ), + buttons: [ + , + ], + }; +}); + +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api/frames/route.tsx b/templates/next-starter-with-examples/app/examples/new-api/frames/route.tsx new file mode 100644 index 000000000..4caad2833 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api/frames/route.tsx @@ -0,0 +1,24 @@ +/* eslint-disable react/jsx-key */ +import { Button } from "frames.js/next"; +import { frames } from "./frames"; + +const handleRequest = frames(async (ctx) => { + return { + image: ( + + Hello there: {ctx.pressedButton ? "✅" : "❌"} + {ctx.message?.inputText ? `, Typed: ${ctx.message?.inputText}` : ""} + + ), + buttons: [ + , + , + ], + textInput: "Type something!", + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next-starter-with-examples/app/examples/new-api/page.tsx b/templates/next-starter-with-examples/app/examples/new-api/page.tsx new file mode 100644 index 000000000..b8a5aef52 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/new-api/page.tsx @@ -0,0 +1,33 @@ +import Link from "next/link"; +import { currentURL, vercelURL } from "../../utils"; +import { createDebugUrl } from "../../debug"; +import type { Metadata } from "next"; +import { fetchMetadata } from "frames.js/next"; + +export async function generateMetadata(): Promise { + return { + title: "New api example", + description: "This is a new api example", + other: { + ...(await fetchMetadata( + new URL( + "/examples/new-api/frames", + vercelURL() || "http://localhost:3000" + ) + )), + }, + }; +} + +export default async function Home() { + const url = currentURL("/examples/new-api"); + + return ( +
+ New api example.{" "} + + Debug + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/only-followers-can-mint/frames/route.ts b/templates/next-starter-with-examples/app/examples/only-followers-can-mint/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/only-followers-can-mint/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/only-followers-can-mint/page.tsx b/templates/next-starter-with-examples/app/examples/only-followers-can-mint/page.tsx new file mode 100644 index 000000000..7b0787184 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/only-followers-can-mint/page.tsx @@ -0,0 +1,115 @@ +import { + FrameButton, + FrameContainer, + FrameImage, + FrameReducer, + NextServerPageProps, + getFrameMessage, + getPreviousFrame, + useFramesReducer, +} from "frames.js/next/server"; +import Link from "next/link"; +import { getTokenUrl } from "frames.js"; +import { zora } from "viem/chains"; +import { DEFAULT_DEBUGGER_HUB_URL, createDebugUrl } from "../../debug"; +import { currentURL } from "../../utils"; + +type State = + | { + page: "initial"; + } + | { page: "result" }; + +const initialState: State = { page: "initial" }; + +const reducer: FrameReducer = (state, action) => { + const buttonIndex = action.postBody?.untrustedData.buttonIndex; + + switch (state.page) { + case "initial": + return buttonIndex === 1 ? { page: "result" } : state; + case "result": + return buttonIndex === 1 ? { page: "initial" } : state; + default: + return { page: "initial" }; + } +}; + +// This is a react server component only +export default async function Home({ + params, + searchParams, +}: NextServerPageProps) { + const url = currentURL("/examples/slow-request"); + + const previousFrame = getPreviousFrame(searchParams); + + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + console.log("info: frameMessage is:", frameMessage); + + if (frameMessage && !frameMessage?.isValid) { + throw new Error("Invalid frame payload"); + } + + const [state, dispatch] = useFramesReducer( + reducer, + initialState, + previousFrame + ); + + // Here: do a server side side effect either sync or async (using await), such as minting an NFT if you want. + // example: load the users credentials & check they have an NFT + console.log("info: state is:", state); + + const initialPage = [ + +
+ You can mint if you follow the caster. +
+
, + Am I?, + ]; + + const resultPage = [ + +
+ {frameMessage?.requesterFollowsCaster + ? "You are following the caster." + : "You are not following the caster"} +
+
, + , + frameMessage?.requesterFollowsCaster ? ( + + Mint + + ) : null, + ]; + + // then, when done, return next frame + return ( +
+ Only followers can mint example.{" "} + Debug + + {state.page === "initial" ? initialPage : resultPage} + +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/page.tsx b/templates/next-starter-with-examples/app/examples/page.tsx new file mode 100644 index 000000000..6e83231f7 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/page.tsx @@ -0,0 +1,112 @@ +import Link from "next/link"; + +export default function ExamplesIndexPage() { + return ( +
+ Frames.js v0.9 +
    +
  • + + Basic + +
  • +
  • + + Transactions + +
  • +
  • + + Multi Page + +
  • +
  • + + Mint button + +
  • +
  • + + Only followers can mint + +
  • +
  • + + Post redirect + +
  • +
  • + + Open Frames + +
  • +
  • + + Caching + +
  • +
  • + + Slow requests + +
  • +
+ Frames.js v0.8 and below +
    +
  • + + Basic + +
  • +
  • + + Transactions + +
  • +
  • + + Custom Hub + +
  • +
  • + + Mint button + +
  • +
  • + + Multi page + +
  • +
  • + + Multi protocol + +
  • +
  • + + Only followers can mint + +
  • +
  • + + Slow request + +
  • +
  • + + User data + +
  • +
  • + + Page router + +
  • +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/slow-request/README.md b/templates/next-starter-with-examples/app/examples/slow-request/README.md new file mode 100644 index 000000000..0f563d1d5 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/slow-request/README.md @@ -0,0 +1,6 @@ +# Step 1 + +Setup a key value store +https://vercel.com/docs/storage/vercel-kv/quickstart + +or follow the steps in this PR to set it up locally using Docker: https://github.com/vercel/storage/issues/281#issuecomment-1650439329 diff --git a/templates/next-starter-with-examples/app/examples/slow-request/frames/route.ts b/templates/next-starter-with-examples/app/examples/slow-request/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/slow-request/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/slow-request/page.tsx b/templates/next-starter-with-examples/app/examples/slow-request/page.tsx new file mode 100644 index 000000000..7f8ea62f4 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/slow-request/page.tsx @@ -0,0 +1,178 @@ +import { kv } from "@vercel/kv"; +import { + FrameButton, + FrameContainer, + FrameImage, + NextServerPageProps, + getFrameMessage, + getPreviousFrame, +} from "frames.js/next/server"; +import Link from "next/link"; +import { RandomNumberRequestStateValue } from "./slow-fetch/types"; +import { currentURL } from "../../utils"; +import { DEFAULT_DEBUGGER_HUB_URL, createDebugUrl } from "../../debug"; + +type State = {}; + +const initialState: State = {} as const; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/examples/slow-request"); + const previousFrame = getPreviousFrame(searchParams); + + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + if (frameMessage && !frameMessage?.isValid) { + throw new Error("Invalid frame payload"); + } + + let frame: React.ReactElement; + + const intialFrame = ( + + +
+ This random number generator takes 10 seconds to respond +
+
+ Generate +
+ ); + + const checkStatusFrame = ( + + +
+ Loading... +
+
+ Check status +
+ ); + + const errorFrame = (error: string) => ( + + {error} + + Retry + + + ); + + if (frameMessage) { + const { requesterFid } = frameMessage; + + const uniqueId = `fid:${requesterFid}`; + + const existingRequest = + await kv.get(uniqueId); + + if (existingRequest) { + switch (existingRequest.status) { + case "pending": + frame = checkStatusFrame; + break; + case "success": + // if retry is true, then try to generate again and show checkStatusFrame + if (searchParams?.reset === "true") { + // reset to initial state + await kv.del(uniqueId); + + frame = intialFrame; + } else { + frame = ( + + +
+ The number is {existingRequest.data} +
+
+ + Reset + +
+ ); + } + break; + case "error": + // if retry is true, then try to generate again and show checkStatusFrame + if (searchParams?.retry === "true") { + // reset to initial state + await kv.del(uniqueId); + + frame = intialFrame; + } else { + frame = errorFrame(existingRequest.error); + } + break; + } + } else { + await kv.set( + uniqueId, + { + status: "pending", + timestamp: new Date().getTime(), + }, + // set as pending for one minute + { ex: 60 } + ); + + // start request, don't await it! Return a loading page, let this run in the background + fetch( + new URL( + "/examples/slow-request/slow-fetch", + process.env.NEXT_PUBLIC_HOST + ).toString(), + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + postBody: JSON.parse(searchParams?.postBody as string), + }), + } + ); + + frame = checkStatusFrame; + } + } else { + frame = intialFrame; + } + + // then, when done, return next frame + return ( +
+ frames.js starter kit with slow requests.{" "} + + Debug + + {frame} +
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/slow-request/slow-fetch/route.ts b/templates/next-starter-with-examples/app/examples/slow-request/slow-fetch/route.ts new file mode 100644 index 000000000..22d594015 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/slow-request/slow-fetch/route.ts @@ -0,0 +1,53 @@ +import { getFrameMessage } from "frames.js"; +import { NextRequest, NextResponse } from "next/server"; +import { kv } from "@vercel/kv"; +import { RandomNumberRequestStateValue } from "./types"; +import { DEFAULT_DEBUGGER_HUB_URL } from "../../../debug"; + +const MAXIMUM_KV_RESULT_LIFETIME_IN_SECONDS = 2 * 60; // 2 minutes + +export async function POST(req: NextRequest) { + const body = await req.json(); + + // verify independently + const frameMessage = await getFrameMessage(body.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + const uniqueId = `fid:${frameMessage.requesterFid}`; + + // Wait 10 seconds + await new Promise((resolve) => setTimeout(resolve, 10000)); + + try { + const randomNumber = Math.random(); + + await kv.set( + uniqueId, + { + data: randomNumber, + status: "success", + timestamp: new Date().getTime(), + }, + { ex: MAXIMUM_KV_RESULT_LIFETIME_IN_SECONDS } + ); + + return NextResponse.json({ + data: randomNumber, + status: "success", + timestamp: new Date().getTime(), + }); + } catch (e) { + await kv.set( + uniqueId, + { + error: String(e), + status: "error", + timestamp: new Date().getTime(), + }, + { ex: MAXIMUM_KV_RESULT_LIFETIME_IN_SECONDS } + ); + // Handle errors + return NextResponse.json({ message: e }, { status: 500 }); + } +} diff --git a/templates/next-starter-with-examples/app/examples/slow-request/slow-fetch/types.ts b/templates/next-starter-with-examples/app/examples/slow-request/slow-fetch/types.ts new file mode 100644 index 000000000..72fa08eeb --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/slow-request/slow-fetch/types.ts @@ -0,0 +1,15 @@ +export type RandomNumberRequestStateValue = + | { + error: string; + status: "error"; + timestamp: number; + } + | { + data: number; + status: "success"; + timestamp: number; + } + | { + status: "pending"; + timestamp: number; + }; diff --git a/templates/next-starter-with-examples/app/examples/transaction/frames/route.ts b/templates/next-starter-with-examples/app/examples/transaction/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/transaction/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/transaction/page.tsx b/templates/next-starter-with-examples/app/examples/transaction/page.tsx new file mode 100644 index 000000000..560f73953 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/transaction/page.tsx @@ -0,0 +1,83 @@ +import { + FrameButton, + FrameContainer, + FrameImage, + FrameReducer, + NextServerPageProps, + getFrameMessage, + getPreviousFrame, + useFramesReducer, +} from "frames.js/next/server"; +import Link from "next/link"; +import { currentURL } from "../../utils"; +import { DEFAULT_DEBUGGER_HUB_URL, createDebugUrl } from "../../debug"; + +type State = { + pageIndex: number; +}; + +const initialState: State = { pageIndex: 0 }; + +const reducer: FrameReducer = (state, action) => { + return { + pageIndex: 0, + }; +}; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/examples/transaction"); + const previousFrame = getPreviousFrame(searchParams); + + const [state] = useFramesReducer(reducer, initialState, previousFrame); + + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + if (frameMessage?.transactionId) { + return ( + + +
+ Transaction submitted! {frameMessage.transactionId} +
+
+ + View on block explorer + +
+ ); + } + + // then, when done, return next frame + return ( +
+ Rent farcaster storage example{" "} + Debug + + +
+ Rent farcaster storage +
+
+ + Buy a unit + +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/examples/transaction/txdata/contracts/storage-registry.ts b/templates/next-starter-with-examples/app/examples/transaction/txdata/contracts/storage-registry.ts new file mode 100644 index 000000000..3f7e362b3 --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/transaction/txdata/contracts/storage-registry.ts @@ -0,0 +1,814 @@ +export const storageRegistryABI = [ + { + inputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "_priceFeed", + type: "address", + }, + { + internalType: "contract AggregatorV3Interface", + name: "_uptimeFeed", + type: "address", + }, + { + internalType: "uint256", + name: "_initialUsdUnitPrice", + type: "uint256", + }, + { internalType: "uint256", name: "_initialMaxUnits", type: "uint256" }, + { internalType: "address", name: "_initialVault", type: "address" }, + { internalType: "address", name: "_initialRoleAdmin", type: "address" }, + { internalType: "address", name: "_initialOwner", type: "address" }, + { internalType: "address", name: "_initialOperator", type: "address" }, + { internalType: "address", name: "_initialTreasurer", type: "address" }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { inputs: [], name: "CallFailed", type: "error" }, + { inputs: [], name: "ContractDeprecated", type: "error" }, + { inputs: [], name: "ExceedsCapacity", type: "error" }, + { inputs: [], name: "GracePeriodNotOver", type: "error" }, + { inputs: [], name: "IncompleteRound", type: "error" }, + { inputs: [], name: "InvalidAddress", type: "error" }, + { inputs: [], name: "InvalidAmount", type: "error" }, + { inputs: [], name: "InvalidBatchInput", type: "error" }, + { inputs: [], name: "InvalidDeprecationTimestamp", type: "error" }, + { inputs: [], name: "InvalidFixedPrice", type: "error" }, + { inputs: [], name: "InvalidMaxAnswer", type: "error" }, + { inputs: [], name: "InvalidMinAnswer", type: "error" }, + { inputs: [], name: "InvalidPayment", type: "error" }, + { inputs: [], name: "InvalidPrice", type: "error" }, + { inputs: [], name: "InvalidRangeInput", type: "error" }, + { inputs: [], name: "InvalidRoundTimestamp", type: "error" }, + { inputs: [], name: "NotOperator", type: "error" }, + { inputs: [], name: "NotOwner", type: "error" }, + { inputs: [], name: "NotTreasurer", type: "error" }, + { inputs: [], name: "PriceOutOfBounds", type: "error" }, + { inputs: [], name: "SequencerDown", type: "error" }, + { inputs: [], name: "StaleAnswer", type: "error" }, + { inputs: [], name: "Unauthorized", type: "error" }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "Paused", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "payer", + type: "address", + }, + { indexed: true, internalType: "uint256", name: "fid", type: "uint256" }, + { + indexed: false, + internalType: "uint256", + name: "units", + type: "uint256", + }, + ], + name: "Rent", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" }, + { + indexed: true, + internalType: "bytes32", + name: "previousAdminRole", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "newAdminRole", + type: "bytes32", + }, + ], + name: "RoleAdminChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleGranted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" }, + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "RoleRevoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldDuration", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newDuration", + type: "uint256", + }, + ], + name: "SetCacheDuration", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldTimestamp", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newTimestamp", + type: "uint256", + }, + ], + name: "SetDeprecationTimestamp", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetFixedEthUsdPrice", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPeriod", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPeriod", + type: "uint256", + }, + ], + name: "SetGracePeriod", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldAge", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newAge", + type: "uint256", + }, + ], + name: "SetMaxAge", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetMaxAnswer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldMax", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newMax", + type: "uint256", + }, + ], + name: "SetMaxUnits", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetMinAnswer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldPrice", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newPrice", + type: "uint256", + }, + ], + name: "SetPrice", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldFeed", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newFeed", + type: "address", + }, + ], + name: "SetPriceFeed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldFeed", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newFeed", + type: "address", + }, + ], + name: "SetUptimeFeed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldVault", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newVault", + type: "address", + }, + ], + name: "SetVault", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "Unpaused", + type: "event", + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: "address", name: "to", type: "address" }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Withdraw", + type: "event", + }, + { + inputs: [], + name: "DEFAULT_ADMIN_ROLE", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "uint256[]", name: "fids", type: "uint256[]" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "batchCredit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256[]", name: "fids", type: "uint256[]" }, + { internalType: "uint256[]", name: "units", type: "uint256[]" }, + ], + name: "batchRent", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "start", type: "uint256" }, + { internalType: "uint256", name: "end", type: "uint256" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "continuousCredit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "fid", type: "uint256" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "credit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "deprecationTimestamp", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "ethUsdPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "fixedEthUsdPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "bytes32", name: "role", type: "bytes32" }], + name: "getRoleAdmin", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "uint256", name: "index", type: "uint256" }, + ], + name: "getRoleMember", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "bytes32", name: "role", type: "bytes32" }], + name: "getRoleMemberCount", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "grantRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "hasRole", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "lastPriceFeedUpdateBlock", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "lastPriceFeedUpdateTime", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "maxUnits", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pause", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "paused", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "prevEthUsdPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "units", type: "uint256" }], + name: "price", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeed", + outputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedCacheDuration", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedMaxAge", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedMaxAnswer", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "priceFeedMinAnswer", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "refreshPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "renounceRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "fid", type: "uint256" }, + { internalType: "uint256", name: "units", type: "uint256" }, + ], + name: "rent", + outputs: [ + { internalType: "uint256", name: "overpayment", type: "uint256" }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "rentedUnits", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "role", type: "bytes32" }, + { internalType: "address", name: "account", type: "address" }, + ], + name: "revokeRole", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "duration", type: "uint256" }], + name: "setCacheDuration", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "timestamp", type: "uint256" }], + name: "setDeprecationTimestamp", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "fixedPrice", type: "uint256" }], + name: "setFixedEthUsdPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "period", type: "uint256" }], + name: "setGracePeriod", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "age", type: "uint256" }], + name: "setMaxAge", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "maxPrice", type: "uint256" }], + name: "setMaxAnswer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "max", type: "uint256" }], + name: "setMaxUnits", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "minPrice", type: "uint256" }], + name: "setMinAnswer", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "usdPrice", type: "uint256" }], + name: "setPrice", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "feed", + type: "address", + }, + ], + name: "setPriceFeed", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "feed", + type: "address", + }, + ], + name: "setUptimeFeed", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "vaultAddr", type: "address" }], + name: "setVault", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [{ internalType: "bytes4", name: "interfaceId", type: "bytes4" }], + name: "supportsInterface", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unitPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unpause", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uptimeFeed", + outputs: [ + { + internalType: "contract AggregatorV3Interface", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "uptimeFeedGracePeriod", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "usdUnitPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "vault", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "amount", type: "uint256" }], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; diff --git a/templates/next-starter-with-examples/app/examples/transaction/txdata/route.ts b/templates/next-starter-with-examples/app/examples/transaction/txdata/route.ts new file mode 100644 index 000000000..c574ab85c --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/transaction/txdata/route.ts @@ -0,0 +1,58 @@ +import { STORAGE_REGISTRY_ADDRESS } from "@farcaster/core"; +import { TransactionTargetResponse } from "frames.js"; +import { getFrameMessage } from "frames.js/next/server"; +import { NextRequest, NextResponse } from "next/server"; +import { + Abi, + createPublicClient, + encodeFunctionData, + getContract, + http, +} from "viem"; +import { optimism } from "viem/chains"; +import { storageRegistryABI } from "./contracts/storage-registry"; + +export async function POST( + req: NextRequest +): Promise> { + const json = await req.json(); + + const frameMessage = await getFrameMessage(json); + + if (!frameMessage) { + throw new Error("No frame message"); + } + + // Get current storage price + const units = 1n; + + const calldata = encodeFunctionData({ + abi: storageRegistryABI, + functionName: "rent", + args: [BigInt(frameMessage.requesterFid), units], + }); + + const publicClient = createPublicClient({ + chain: optimism, + transport: http(), + }); + + const storageRegistry = getContract({ + address: STORAGE_REGISTRY_ADDRESS, + abi: storageRegistryABI, + client: publicClient, + }); + + const unitPrice = await storageRegistry.read.price([units]); + + return NextResponse.json({ + chainId: "eip155:10", // OP Mainnet 10 + method: "eth_sendTransaction", + params: { + abi: storageRegistryABI as Abi, + to: STORAGE_REGISTRY_ADDRESS, + data: calldata, + value: unitPrice.toString(), + }, + }); +} diff --git a/templates/next-starter-with-examples/app/examples/user-data/frames/route.ts b/templates/next-starter-with-examples/app/examples/user-data/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/user-data/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/examples/user-data/page.tsx b/templates/next-starter-with-examples/app/examples/user-data/page.tsx new file mode 100644 index 000000000..2c347dfcf --- /dev/null +++ b/templates/next-starter-with-examples/app/examples/user-data/page.tsx @@ -0,0 +1,93 @@ +import { + FrameButton, + FrameContainer, + FrameImage, + FrameReducer, + NextServerPageProps, + getFrameMessage, + getPreviousFrame, + useFramesReducer, +} from "frames.js/next/server"; +import Link from "next/link"; +import { currentURL } from "../../utils"; +import { DEFAULT_DEBUGGER_HUB_URL, createDebugUrl } from "../../debug"; + +type State = { + saidGm: boolean; +}; + +const initialState: State = { saidGm: false }; + +const reducer: FrameReducer = (state, action) => { + return { + saidGm: true, + }; +}; + +// This is a react server component only +export default async function Home({ + params, + searchParams, +}: NextServerPageProps) { + const url = currentURL("/examples/user-data"); + const previousFrame = getPreviousFrame(searchParams); + + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + if (frameMessage && !frameMessage?.isValid) { + throw new Error("Invalid frame payload"); + } + + const [state, dispatch] = useFramesReducer( + reducer, + initialState, + previousFrame + ); + + // Here: do a server side side effect either sync or async (using await), such as minting an NFT if you want. + // example: load the users credentials & check they have an NFT + console.log("info: state is:", state); + + // then, when done, return next frame + return ( +
+ GM user data example. Debug + + + {frameMessage ? ( +
+ GM, {frameMessage.requesterUserData?.displayName}! Your FID is{" "} + {frameMessage.requesterFid} + {", "} + {frameMessage.requesterFid < 20_000 + ? "you're OG!" + : "welcome to the Farcaster!"} +
+ ) : ( +
+ Say GM +
+ )} +
+ {!state.saidGm ? Say GM : null} +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/frames/route.ts b/templates/next-starter-with-examples/app/frames/route.ts new file mode 100644 index 000000000..2b10a621f --- /dev/null +++ b/templates/next-starter-with-examples/app/frames/route.ts @@ -0,0 +1 @@ +export { POST } from "frames.js/next/server"; diff --git a/templates/next-starter-with-examples/app/globals.css b/templates/next-starter-with-examples/app/globals.css new file mode 100644 index 000000000..6a7572500 --- /dev/null +++ b/templates/next-starter-with-examples/app/globals.css @@ -0,0 +1,76 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/templates/next-starter-with-examples/app/layout.tsx b/templates/next-starter-with-examples/app/layout.tsx new file mode 100644 index 000000000..e9a31acbb --- /dev/null +++ b/templates/next-starter-with-examples/app/layout.tsx @@ -0,0 +1,20 @@ +import type { Metadata } from "next"; +import "./globals.css"; + +export const metadata: Metadata = { + // without a title, warpcast won't validate your frame + title: "frames.js starter", + description: "...", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/templates/next-starter-with-examples/app/page.tsx b/templates/next-starter-with-examples/app/page.tsx new file mode 100644 index 000000000..c34727389 --- /dev/null +++ b/templates/next-starter-with-examples/app/page.tsx @@ -0,0 +1,118 @@ +import { + FrameButton, + FrameContainer, + FrameImage, + FrameInput, + FrameReducer, + NextServerPageProps, + getFrameMessage, + getPreviousFrame, + useFramesReducer, +} from "frames.js/next/server"; +import Link from "next/link"; +import { DEFAULT_DEBUGGER_HUB_URL, createDebugUrl } from "./debug"; +import { currentURL } from "./utils"; + +type State = { + active: string; + total_button_presses: number; +}; + +const initialState = { active: "1", total_button_presses: 0 }; + +const reducer: FrameReducer = (state, action) => { + return { + total_button_presses: state.total_button_presses + 1, + active: action.postBody?.untrustedData.buttonIndex + ? String(action.postBody?.untrustedData.buttonIndex) + : "1", + }; +}; + +// This is a react server component only +export default async function Home({ searchParams }: NextServerPageProps) { + const url = currentURL("/"); + const previousFrame = getPreviousFrame(searchParams); + + const frameMessage = await getFrameMessage(previousFrame.postBody, { + hubHttpUrl: DEFAULT_DEBUGGER_HUB_URL, + }); + + if (frameMessage && !frameMessage?.isValid) { + throw new Error("Invalid frame payload"); + } + + const [state, dispatch] = useFramesReducer( + reducer, + initialState, + previousFrame + ); + + // Here: do a server side side effect either sync or async (using await), such as minting an NFT if you want. + // example: load the users credentials & check they have an NFT + + console.log("info: state is:", state); + + // then, when done, return next frame + return ( +
+ frames.js starter kit. The Template Frame is on this page, it's in + the html meta tags (inspect source).{" "} + + Debug + {" "} + or see{" "} + + other examples + + + {/* */} + +
+
+ {frameMessage?.inputText ? frameMessage.inputText : "Hello world"} +
+ {frameMessage && ( +
+
+ Requester is @{frameMessage.requesterUserData?.username}{" "} +
+
+ Requester follows caster:{" "} + {frameMessage.requesterFollowsCaster ? "true" : "false"} +
+
+ Caster follows requester:{" "} + {frameMessage.casterFollowsRequester ? "true" : "false"} +
+
+ Requester liked cast:{" "} + {frameMessage.likedCast ? "true" : "false"} +
+
+ Requester recasted cast:{" "} + {frameMessage.recastedCast ? "true" : "false"} +
+
+ )} +
+
+ + + {state?.active === "1" ? "Active" : "Inactive"} + + + {state?.active === "2" ? "Active" : "Inactive"} + + + External + +
+
+ ); +} diff --git a/templates/next-starter-with-examples/app/utils.ts b/templates/next-starter-with-examples/app/utils.ts new file mode 100644 index 000000000..8b2edf9b5 --- /dev/null +++ b/templates/next-starter-with-examples/app/utils.ts @@ -0,0 +1,19 @@ +import { headers } from "next/headers"; + +export function currentURL(pathname: string): URL { + const headersList = headers(); + const host = headersList.get("x-forwarded-host") || headersList.get("host"); + const protocol = headersList.get("x-forwarded-proto") || "http"; + + try { + return new URL(pathname, `${protocol}://${host}`); + } catch (error) { + return new URL("http://localhost:3000"); + } +} + +export function vercelURL() { + return process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : undefined; +} diff --git a/templates/next-starter-with-examples/next.config.mjs b/templates/next-starter-with-examples/next.config.mjs new file mode 100644 index 000000000..8f885aef1 --- /dev/null +++ b/templates/next-starter-with-examples/next.config.mjs @@ -0,0 +1,19 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // prevent double render on dev mode, which causes 2 frames to exist + reactStrictMode: false, + images: { + remotePatterns: [ + { + hostname: "*", + protocol: "http", + }, + { + hostname: "*", + protocol: "https", + }, + ], + }, +}; + +export default nextConfig; diff --git a/templates/next-starter-with-examples/package.json b/templates/next-starter-with-examples/package.json new file mode 100644 index 000000000..e650af8f4 --- /dev/null +++ b/templates/next-starter-with-examples/package.json @@ -0,0 +1,42 @@ +{ + "name": "template-next-starter-with-examples", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "concurrently --kill-others \"next dev\" \"frames --url http://localhost:3000\"", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@farcaster/core": "^0.14.3", + "@noble/ed25519": "^2.0.0", + "@vercel/kv": "^1.0.1", + "@xmtp/frames-validator": "^0.5.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "frames.js": "^0.9.3", + "lucide-react": "^0.331.0", + "next": "^14.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwindcss-animate": "^1.0.7" + }, + "engines": { + "node": ">=18.17.0" + }, + "devDependencies": { + "@frames.js/debugger": "^0.1.9", + "@types/node": "^18.17.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "autoprefixer": "^10.0.1", + "concurrently": "^8.2.2", + "dotenv": "^16.4.5", + "eslint": "^8.56.0", + "eslint-config-next": "^14.1.0", + "postcss": "^8", + "tailwindcss": "^3.3.0", + "typescript": "^5.3.3" + } +} diff --git a/templates/next-starter-with-examples/postcss.config.js b/templates/next-starter-with-examples/postcss.config.js new file mode 100644 index 000000000..12a703d90 --- /dev/null +++ b/templates/next-starter-with-examples/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/templates/next-starter-with-examples/public/Inter-Regular.ttf b/templates/next-starter-with-examples/public/Inter-Regular.ttf new file mode 100644 index 000000000..5e4851f0a Binary files /dev/null and b/templates/next-starter-with-examples/public/Inter-Regular.ttf differ diff --git a/templates/next-starter-with-examples/public/next.svg b/templates/next-starter-with-examples/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/templates/next-starter-with-examples/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/next-starter-with-examples/public/vercel.svg b/templates/next-starter-with-examples/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/templates/next-starter-with-examples/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/next-starter-with-examples/tailwind.config.ts b/templates/next-starter-with-examples/tailwind.config.ts new file mode 100644 index 000000000..2c80f0c3f --- /dev/null +++ b/templates/next-starter-with-examples/tailwind.config.ts @@ -0,0 +1,90 @@ +import type { Config } from "tailwindcss"; + +const config = { + darkMode: ["class"], + content: [ + "./pages/**/*.{ts,tsx}", + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./@/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}", + // js files primarily because in dist + "./node_modules/frames.js/dist/render/next/*.{ts,tsx,js,css}", + "./node_modules/frames.js/dist/render/*.{ts,tsx,js,css}", + "./node_modules/frames.js/dist/**/*.{ts,tsx,js,css}", + + // monorepo weirdness + "../../node_modules/frames.js/dist/render/next/*.{ts,tsx,js,css}", + "../../node_modules/frames.js/dist/render/*.{ts,tsx,js,css}", + "../../node_modules/frames.js/dist/**/*.{ts,tsx,js,css}", + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} satisfies Config; + +export default config; diff --git a/templates/next-starter-with-examples/tsconfig.json b/templates/next-starter-with-examples/tsconfig.json new file mode 100644 index 000000000..26e4c0865 --- /dev/null +++ b/templates/next-starter-with-examples/tsconfig.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": false, + "isolatedModules": true, + "lib": [ + "es2022", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "Bundler", + "noEmit": true, + "noUncheckedIndexedAccess": true, + "plugins": [ + { + "name": "next", + }, + ], + "paths": { + "@/*": [ + "./@/*" + ] + }, + "jsx": "preserve", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2022", + "allowJs": true, + }, + "include": [ + "next-env.d.ts", + "next.config.js", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ], + "exclude": [ + "node_modules" + ], +} \ No newline at end of file diff --git a/templates/next-utils-starter/.env.sample b/templates/next-utils-starter/.env.sample new file mode 100644 index 000000000..c85e4f5b8 --- /dev/null +++ b/templates/next-utils-starter/.env.sample @@ -0,0 +1 @@ +NEXT_PUBLIC_HOST="http://localhost:3000" \ No newline at end of file diff --git a/templates/next-utils-starter/.eslintrc.js b/templates/next-utils-starter/.eslintrc.js new file mode 100644 index 000000000..00e4aaad1 --- /dev/null +++ b/templates/next-utils-starter/.eslintrc.js @@ -0,0 +1,5 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["next"], +}; diff --git a/templates/next-utils-starter/.gitignore b/templates/next-utils-starter/.gitignore new file mode 100644 index 000000000..574e5471e --- /dev/null +++ b/templates/next-utils-starter/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +.next +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts \ No newline at end of file diff --git a/templates/next-utils-starter/README.md b/templates/next-utils-starter/README.md new file mode 100644 index 000000000..415ff4eff --- /dev/null +++ b/templates/next-utils-starter/README.md @@ -0,0 +1,30 @@ +## Getting Started + +First, run the development server and debugger: + +```bash +yarn dev +``` + +This will also open the debugger in your browser. + +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. + +To create [API routes](https://nextjs.org/docs/app/building-your-application/routing/router-handlers) add an `api/` directory to the `app/` directory with a `route.ts` file. For individual endpoints, create a subfolder in the `api` directory, like `api/hello/route.ts` would map to [http://localhost:3000/api/hello](http://localhost:3000/api/hello). + +## 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/foundations/about-nextjs) - 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_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/templates/next-utils-starter/app/api/frame/route.ts b/templates/next-utils-starter/app/api/frame/route.ts new file mode 100644 index 000000000..28c07aff6 --- /dev/null +++ b/templates/next-utils-starter/app/api/frame/route.ts @@ -0,0 +1,55 @@ +import { + Frame, + getFrameHtml, + getFrameMessageFromRequestBody, + validateFrameMessage, +} from "frames.js"; +import { NextRequest, NextResponse } from "next/server"; +import { HOST, framePostUrl } from "../../constants"; + +export async function POST(request: NextRequest) { + const body = await request.json(); + + const untrustedMessage = getFrameMessageFromRequestBody(body); + + if (untrustedMessage.data?.frameActionBody?.buttonIndex === 2) { + const resp = NextResponse.redirect(`${HOST}/redirect`, 302); + return resp; + } + + const result = await validateFrameMessage(body); + + const { isValid, message } = result; + if (!isValid || !message) { + return new Response("Invalid message", { status: 400 }); + } + + const randomInt = Math.floor(Math.random() * 100); + const imageUrl = `https://picsum.photos/seed/${randomInt}/1146/600`; + + const frame: Frame = { + version: "vNext", + image: imageUrl, + buttons: [ + { + label: `Next (pressed by ${message?.data.fid})`, + action: "post", + }, + { + label: "Visit frames.js", + action: "post_redirect", + }, + ], + ogImage: imageUrl, + postUrl: framePostUrl, + }; + + const html = getFrameHtml(frame); + + return new Response(html, { + headers: { + "Content-Type": "text/html", + }, + status: 200, + }); +} diff --git a/templates/next-utils-starter/app/constants.ts b/templates/next-utils-starter/app/constants.ts new file mode 100644 index 000000000..05758ac4b --- /dev/null +++ b/templates/next-utils-starter/app/constants.ts @@ -0,0 +1,6 @@ +export const HOST = process.env["NEXT_PUBLIC_HOST"] || "http://localhost:3000"; + +export const ogImage = `${HOST}/image.png`; +export const frameImage = `${HOST}/image_frame.png`; +export const frameImageFlipped = `${HOST}/image_frame_flipped.png`; +export const framePostUrl = `${HOST}/api/frame`; diff --git a/templates/next-utils-starter/app/favicon.ico b/templates/next-utils-starter/app/favicon.ico new file mode 100644 index 000000000..3f804c026 Binary files /dev/null and b/templates/next-utils-starter/app/favicon.ico differ diff --git a/templates/next-utils-starter/app/layout.tsx b/templates/next-utils-starter/app/layout.tsx new file mode 100644 index 000000000..80399e5c8 --- /dev/null +++ b/templates/next-utils-starter/app/layout.tsx @@ -0,0 +1,67 @@ +import { type FrameFlattened, getFrameFlattened } from "frames.js"; +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import { framePostUrl } from "./constants"; + +const inter = Inter({ subsets: ["latin"] }); + +const imageUrl = "https://picsum.photos/seed/frames.js/1146/600"; + +/** + * Stripes undefined values from a `FrameFlattened` object and returns a new object with only the defined values + */ +function convertFlattenedFrameToMetadata( + frame: FrameFlattened +): Metadata["other"] { + const metadata: Metadata["other"] = {}; + + for (const [key, value] of Object.entries(frame)) { + if (value != null) { + metadata[key] = value; + } + } + + return metadata; +} + +export const metadata: Metadata = { + title: "Random Image Frame", + description: "This is an example of a simple frame using frames.js", + openGraph: { + images: [ + { + url: imageUrl, + }, + ], + }, + other: convertFlattenedFrameToMetadata( + getFrameFlattened({ + image: imageUrl, + version: "vNext", + buttons: [ + { + label: "Next", + action: "post", + }, + { + label: "Visit frames.js", + action: "post_redirect", + }, + ], + inputText: "Type something", + postUrl: framePostUrl, + }) + ), +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}): JSX.Element { + return ( + + {children} + + ); +} diff --git a/templates/next-utils-starter/app/page.module.css b/templates/next-utils-starter/app/page.module.css new file mode 100644 index 000000000..98481c6a2 --- /dev/null +++ b/templates/next-utils-starter/app/page.module.css @@ -0,0 +1,335 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.vercelLogo { + filter: invert(1); +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.hero { + display: flex; + position: relative; + place-items: center; +} + +.heroContent { + display: flex; + position: relative; + z-index: 0; + padding-bottom: 4rem; + flex-direction: column; + gap: 2rem; + justify-content: space-between; + align-items: center; + width: auto; + font-family: system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, + "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol", "Noto Color Emoji"; + padding-top: 48px; + + @media (min-width: 768px) { + padding-top: 4rem; + padding-bottom: 6rem; + } + @media (min-width: 1024px) { + padding-top: 5rem; + padding-bottom: 8rem; + } +} + +.logos { + display: flex; + z-index: 50; + justify-content: center; + align-items: center; + width: 100%; +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + max-width: 100%; + width: var(--max-width); +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +.circles { + position: absolute; + min-width: 614px; + min-height: 614px; + pointer-events: none; +} + +.logo { + z-index: 50; + width: 120px; + height: 120px; +} + +.logoGradientContainer { + display: flex; + position: absolute; + z-index: 50; + justify-content: center; + align-items: center; + width: 16rem; + height: 16rem; +} + +.turborepoWordmarkContainer { + display: flex; + z-index: 50; + padding-left: 1.5rem; + padding-right: 1.5rem; + flex-direction: column; + gap: 1.25rem; + justify-content: center; + align-items: center; + text-align: center; + + @media (min-width: 1024px) { + gap: 1.5rem; + } +} + +.turborepoWordmark { + width: 160px; + fill: white; + + @media (min-width: 768px) { + width: 200px; + } +} + +.code { + font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", + monospace; + font-weight: 700; +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +/* Gradients */ +.gradient { + position: absolute; + mix-blend-mode: normal; + will-change: filter; + pointer-events: none; +} + +.gradientSmall { + filter: blur(32px); +} + +.gradientLarge { + filter: blur(75px); +} + +.glowConic { + background-image: var(--glow-conic); +} + +.logoGradient { + opacity: 0.9; + width: 120px; + height: 120px; +} + +.backgroundGradient { + top: -500px; + width: 1000px; + height: 1000px; + opacity: 0.15; +} + +.button { + background-color: #ffffff; + border-radius: 8px; + border-style: none; + box-sizing: border-box; + color: #000000; + cursor: pointer; + display: inline-block; + font-size: 16px; + height: 40px; + line-height: 20px; + list-style: none; + margin: 0; + outline: none; + padding: 10px 16px; + position: relative; + text-align: center; + text-decoration: none; + transition: color 100ms; + vertical-align: baseline; + user-select: none; + -webkit-user-select: none; + touch-action: manipulation; +} + +.button:hover, +.button:focus { + background-color: #e5e4e2; +} diff --git a/templates/next-utils-starter/app/page.tsx b/templates/next-utils-starter/app/page.tsx new file mode 100644 index 000000000..c4d0364a1 --- /dev/null +++ b/templates/next-utils-starter/app/page.tsx @@ -0,0 +1,3 @@ +export default function Page(): JSX.Element { + return
Example
; +} diff --git a/templates/next-utils-starter/next.config.js b/templates/next-utils-starter/next.config.js new file mode 100644 index 000000000..d1e4e084a --- /dev/null +++ b/templates/next-utils-starter/next.config.js @@ -0,0 +1,2 @@ +/** @type {import('next').NextConfig} */ +module.exports = {}; diff --git a/templates/next-utils-starter/package.json b/templates/next-utils-starter/package.json new file mode 100644 index 000000000..f24b8c90d --- /dev/null +++ b/templates/next-utils-starter/package.json @@ -0,0 +1,32 @@ +{ + "name": "template-next-utils-starter", + "version": "", + "private": true, + "type": "module", + "scripts": { + "dev": "concurrently --kill-others \"next dev\" \"frames --url http://localhost:3000\"", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "frames.js": "^0.9.6", + "next": "^14.0.4", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@next/eslint-plugin-next": "^14.0.4", + "@frames.js/debugger": "^0.1.9", + "@types/eslint": "^8.56.1", + "@types/node": "^20.10.6", + "@types/react": "^18.2.46", + "@types/react-dom": "^18.2.18", + "concurrently": "^8.2.2", + "eslint": "^8.56.0", + "typescript": "^5.3.3" + }, + "engines": { + "node": ">=18.17.0" + } +} diff --git a/templates/next-utils-starter/public/image.png b/templates/next-utils-starter/public/image.png new file mode 100644 index 000000000..91777b90e Binary files /dev/null and b/templates/next-utils-starter/public/image.png differ diff --git a/templates/next-utils-starter/public/image_frame.png b/templates/next-utils-starter/public/image_frame.png new file mode 100644 index 000000000..96171a796 Binary files /dev/null and b/templates/next-utils-starter/public/image_frame.png differ diff --git a/templates/next-utils-starter/public/image_frame_flipped.png b/templates/next-utils-starter/public/image_frame_flipped.png new file mode 100644 index 000000000..b2cab28d8 Binary files /dev/null and b/templates/next-utils-starter/public/image_frame_flipped.png differ diff --git a/templates/next-utils-starter/tsconfig.json b/templates/next-utils-starter/tsconfig.json new file mode 100644 index 000000000..d0b91a2c3 --- /dev/null +++ b/templates/next-utils-starter/tsconfig.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": false, + "isolatedModules": true, + "lib": ["es2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "Bundler", + "noEmit": true, + "noUncheckedIndexedAccess": true, + "plugins": [ + { + "name": "next", + }, + ], + "paths": { + "@/*": ["./@/*"], + }, + "jsx": "preserve", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2022", + "allowJs": true, + }, + "include": [ + "next-env.d.ts", + "next.config.js", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ], + "exclude": ["node_modules"], +} diff --git a/templates/next/.gitignore b/templates/next/.gitignore new file mode 100644 index 000000000..574e5471e --- /dev/null +++ b/templates/next/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +.next +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts \ No newline at end of file diff --git a/templates/next/README.md b/templates/next/README.md new file mode 100644 index 000000000..1354bd541 --- /dev/null +++ b/templates/next/README.md @@ -0,0 +1,17 @@ +# Frames.js Next example + +Simple Frames.js app using Next.js. + +### Installation + +```sh +npm install +``` + +### Run in Debugger + +Following command will open frames debugger and also run the app in development mode. + +```sh +npm run dev +``` diff --git a/templates/next/app/frames/route.tsx b/templates/next/app/frames/route.tsx new file mode 100644 index 000000000..77dfeb590 --- /dev/null +++ b/templates/next/app/frames/route.tsx @@ -0,0 +1,54 @@ +import { farcasterHubContext } from "frames.js/middleware"; +import { createFrames, Button } from "frames.js/next"; + +const frames = createFrames({ + middleware: [ + farcasterHubContext({ + // remove if you aren't using @frames.js/debugger or you just don't want to use the debugger hub + ...(process.env.NODE_ENV === "production" + ? {} + : { + hubHttpUrl: "http://localhost:3010/hub", + }), + }), + ], +}); + +const handleRequest = frames(async (ctx) => { + return { + image: ctx.message ? ( +
+ GM, {ctx.message.requesterUserData?.displayName}! Your FID is{" "} + {ctx.message.requesterFid} + {", "} + {ctx.message.requesterFid < 20_000 + ? "you're OG!" + : "welcome to the Farcaster!"} +
+ ) : ( +
+ Say GM +
+ ), + buttons: !ctx.url.searchParams.has("saidGm") + ? [ + , + ] + : [], + }; +}); + +export const GET = handleRequest; +export const POST = handleRequest; diff --git a/templates/next/app/globals.css b/templates/next/app/globals.css new file mode 100644 index 000000000..8e0bb857b --- /dev/null +++ b/templates/next/app/globals.css @@ -0,0 +1,11 @@ +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} \ No newline at end of file diff --git a/templates/next/app/layout.tsx b/templates/next/app/layout.tsx new file mode 100644 index 000000000..3314e4780 --- /dev/null +++ b/templates/next/app/layout.tsx @@ -0,0 +1,22 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/templates/next/app/page.tsx b/templates/next/app/page.tsx new file mode 100644 index 000000000..0c8f292b2 --- /dev/null +++ b/templates/next/app/page.tsx @@ -0,0 +1,17 @@ +import { fetchMetadata } from "frames.js/next"; +import { Metadata } from "next"; + +export async function generateMetadata(): Promise { + return { + title: "Frames Next.js Example", + other: { + ...(await fetchMetadata( + new URL("/frames", process.env.VERCEL_URL || "http://localhost:3000") + )), + }, + }; +} + +export default async function Home() { + return
GM user data example.
; +} diff --git a/templates/next/next.config.js b/templates/next/next.config.js new file mode 100644 index 000000000..4678774e6 --- /dev/null +++ b/templates/next/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/templates/next/package.json b/templates/next/package.json new file mode 100644 index 000000000..ec8f7c6c1 --- /dev/null +++ b/templates/next/package.json @@ -0,0 +1,29 @@ +{ + "name": "template-next", + "version": "0.0.0", + "private": true, + "type": "module", + "dependencies": { + "frames.js": "^0.9.6", + "next": "^14.1.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/node": "^18.17.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@frames.js/debugger": "^", + "concurrently": "^8.2.2", + "typescript": "^5.3.3" + }, + "scripts": { + "dev": "concurrently \"next dev\" \"frames --url http://localhost:3000\"", + "start": "next start", + "build": "next build", + "lint": "next lint" + }, + "engines": { + "node": ">=18.17.0" + } +} diff --git a/templates/next/public/next.svg b/templates/next/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/templates/next/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/next/public/vercel.svg b/templates/next/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/templates/next/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/next/tsconfig.json b/templates/next/tsconfig.json new file mode 100644 index 000000000..862143548 --- /dev/null +++ b/templates/next/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "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": { + "@/*": ["./*"], + }, + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"], +} diff --git a/templates/remix/.gitignore b/templates/remix/.gitignore new file mode 100644 index 000000000..70583999f --- /dev/null +++ b/templates/remix/.gitignore @@ -0,0 +1,5 @@ +node_modules + +/.cache +/build +.env \ No newline at end of file diff --git a/templates/remix/README.md b/templates/remix/README.md new file mode 100644 index 000000000..875e2bf91 --- /dev/null +++ b/templates/remix/README.md @@ -0,0 +1,36 @@ +# Welcome to Remix + Frames.js + Vite! + +📖 See the [Remix docs](https://remix.run/docs), the [Remix Vite docs](https://remix.run/docs/en/main/future/vite) and [Frames.js docs](https://framesjs.org) for details on supported features. + +## Development + +Run the Frames.js debugger and Vite dev server: + +```shellscript +npm run dev +``` + +## Deployment + +First, build your app for production: + +```sh +npm run build +``` + +Then run the app in production mode: + +```sh +npm start +``` + +Now you'll need to pick a host to deploy it to. + +### DIY + +If you're familiar with deploying Node applications, the built-in Remix app server is production-ready. + +Make sure to deploy the output of `npm run build` + +- `build/server` +- `build/client` diff --git a/templates/remix/app/entry.client.tsx b/templates/remix/app/entry.client.tsx new file mode 100644 index 000000000..03b0ef097 --- /dev/null +++ b/templates/remix/app/entry.client.tsx @@ -0,0 +1,18 @@ +/** + * By default, Remix will handle hydrating your app on the client for you. + * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨ + * For more information, see https://remix.run/file-conventions/entry.client + */ + +import { RemixBrowser } from "@remix-run/react"; +import { startTransition, StrictMode } from "react"; +import { hydrateRoot } from "react-dom/client"; + +startTransition(() => { + hydrateRoot( + document, + + + + ); +}); \ No newline at end of file diff --git a/templates/remix/app/entry.server.tsx b/templates/remix/app/entry.server.tsx new file mode 100644 index 000000000..2dc2e5a4a --- /dev/null +++ b/templates/remix/app/entry.server.tsx @@ -0,0 +1,140 @@ +/** + * By default, Remix will handle generating the HTTP Response for you. + * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨ + * For more information, see https://remix.run/file-conventions/entry.server + */ + +import { PassThrough } from "node:stream"; + +import type { AppLoadContext, EntryContext } from "@remix-run/node"; +import { createReadableStreamFromReadable } from "@remix-run/node"; +import { RemixServer } from "@remix-run/react"; +import { isbot } from "isbot"; +import { renderToPipeableStream } from "react-dom/server"; + +const ABORT_DELAY = 5_000; + +export default function handleRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext, + // This is ignored so we can keep it in the template for visibility. Feel + // free to delete this parameter in your app if you're not using it! + // eslint-disable-next-line @typescript-eslint/no-unused-vars + loadContext: AppLoadContext +) { + return isbot(request.headers.get("user-agent") || "") + ? handleBotRequest( + request, + responseStatusCode, + responseHeaders, + remixContext + ) + : handleBrowserRequest( + request, + responseStatusCode, + responseHeaders, + remixContext + ); +} + +function handleBotRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext +) { + return new Promise((resolve, reject) => { + let shellRendered = false; + const { pipe, abort } = renderToPipeableStream( + , + { + onAllReady() { + shellRendered = true; + const body = new PassThrough(); + const stream = createReadableStreamFromReadable(body); + + responseHeaders.set("Content-Type", "text/html"); + + resolve( + new Response(stream, { + headers: responseHeaders, + status: responseStatusCode, + }) + ); + + pipe(body); + }, + onShellError(error: unknown) { + reject(error); + }, + onError(error: unknown) { + responseStatusCode = 500; + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error); + } + }, + } + ); + + setTimeout(abort, ABORT_DELAY); + }); +} + +function handleBrowserRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext +) { + return new Promise((resolve, reject) => { + let shellRendered = false; + const { pipe, abort } = renderToPipeableStream( + , + { + onShellReady() { + shellRendered = true; + const body = new PassThrough(); + const stream = createReadableStreamFromReadable(body); + + responseHeaders.set("Content-Type", "text/html"); + + resolve( + new Response(stream, { + headers: responseHeaders, + status: responseStatusCode, + }) + ); + + pipe(body); + }, + onShellError(error: unknown) { + reject(error); + }, + onError(error: unknown) { + responseStatusCode = 500; + // Log streaming rendering errors from inside the shell. Don't log + // errors encountered during initial shell rendering since they'll + // reject and get logged in handleDocumentRequest. + if (shellRendered) { + console.error(error); + } + }, + } + ); + + setTimeout(abort, ABORT_DELAY); + }); +} \ No newline at end of file diff --git a/templates/remix/app/root.tsx b/templates/remix/app/root.tsx new file mode 100644 index 000000000..4bdba274a --- /dev/null +++ b/templates/remix/app/root.tsx @@ -0,0 +1,29 @@ +import { + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from "@remix-run/react"; + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + + ); +} + +export default function App() { + return ; +} \ No newline at end of file diff --git a/templates/remix/app/routes/_index.tsx b/templates/remix/app/routes/_index.tsx new file mode 100644 index 000000000..fd60a1f50 --- /dev/null +++ b/templates/remix/app/routes/_index.tsx @@ -0,0 +1,40 @@ +import { fetchMetadata } from 'frames.js/remix'; +import type { LoaderFunctionArgs, MetaFunction } from "@remix-run/node"; + +export async function loader({ request}: LoaderFunctionArgs) { + return { + metadata: await fetchMetadata(new URL('/frames', request.url)), + } +} + +export const meta: MetaFunction = ({ data }) => { + return [ + { title: "New Remix App" }, + { name: "description", content: "Welcome to Remix!" }, + ...(data?.metadata ?? []) + ]; +}; + +export default function Index() { + return ( +
+

Welcome to Remix + Frames.js

+ +
+ ); +} \ No newline at end of file diff --git a/templates/remix/app/routes/frames._index.tsx b/templates/remix/app/routes/frames._index.tsx new file mode 100644 index 000000000..bc3764670 --- /dev/null +++ b/templates/remix/app/routes/frames._index.tsx @@ -0,0 +1,55 @@ +import { farcasterHubContext } from "frames.js/middleware"; +import { createFrames, Button } from "frames.js/remix"; + +const frames = createFrames({ + basePath: '/frames', + middleware: [ + farcasterHubContext({ + // remove if you aren't using @frames.js/debugger or you just don't want to use the debugger hub + ...(process.env.NODE_ENV === "production" + ? {} + : { + hubHttpUrl: "http://localhost:3010/hub", + }), + }), + ], +}); + +const handleRequest = frames(async (ctx) => { + return { + image: ctx.message ? ( +
+ GM, {ctx.message.requesterUserData?.displayName}! Your FID is{" "} + {ctx.message.requesterFid} + {", "} + {ctx.message.requesterFid < 20_000 + ? "you're OG!" + : "welcome to the Farcaster!"} +
+ ) : ( +
+ Say GM +
+ ), + buttons: !ctx.url.searchParams.has("saidGm") + ? [ + , + ] + : [], + }; +}); + +export const action = handleRequest; +export const loader = handleRequest; diff --git a/templates/remix/package.json b/templates/remix/package.json new file mode 100644 index 000000000..8a87821b3 --- /dev/null +++ b/templates/remix/package.json @@ -0,0 +1,36 @@ +{ + "name": "template-remix", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": ">=18.17.0" + }, + "dependencies": { + "@remix-run/node": "^2.8.1", + "@remix-run/react": "^2.8.1", + "@remix-run/serve": "^2.8.1", + "frames.js": "^0.9.6", + "isbot": "^4.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@frames.js/debugger": "^0.1.9", + "@remix-run/dev": "^2.8.1", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", + "concurrently": "^8.2.2", + "typescript": "^5.1.6", + "vite": "^5.1.0", + "vite-tsconfig-paths": "^4.2.1" + }, + "scripts": { + "build": "remix vite:build", + "dev": "concurrently \"remix vite:dev\" \"frames --url http://localhost:5173\"", + "start": "remix-serve ./build/server/index.js", + "typecheck": "tsc" + } +} diff --git a/templates/remix/tsconfig.json b/templates/remix/tsconfig.json new file mode 100644 index 000000000..9d87dd378 --- /dev/null +++ b/templates/remix/tsconfig.json @@ -0,0 +1,32 @@ +{ + "include": [ + "**/*.ts", + "**/*.tsx", + "**/.server/**/*.ts", + "**/.server/**/*.tsx", + "**/.client/**/*.ts", + "**/.client/**/*.tsx" + ], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["@remix-run/node", "vite/client"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "target": "ES2022", + "strict": true, + "allowJs": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + + // Vite takes care of building everything, not tsc. + "noEmit": true + } +} diff --git a/templates/remix/vite.config.ts b/templates/remix/vite.config.ts new file mode 100644 index 000000000..2b6aff987 --- /dev/null +++ b/templates/remix/vite.config.ts @@ -0,0 +1,10 @@ +import { vitePlugin as remix } from "@remix-run/dev"; +import { installGlobals } from "@remix-run/node"; +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +installGlobals(); + +export default defineConfig({ + plugins: [remix(), tsconfigPaths()], +}); diff --git a/turbo.json b/turbo.json index 0b9281649..21ba5d5de 100644 --- a/turbo.json +++ b/turbo.json @@ -15,6 +15,7 @@ } }, "globalEnv": [ + "NODE_ENV", "NEXT_PUBLIC_HOST", "FARCASTER_DEVELOPER_FID", "FARCASTER_DEVELOPER_MNEMONIC" diff --git a/yarn.lock b/yarn.lock index 1782f060c..c68988c96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,7 +38,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.7", "@babel/core@^7.22.11", "@babel/core@^7.23.3", "@babel/core@^7.23.9": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.7", "@babel/core@^7.21.8", "@babel/core@^7.22.11", "@babel/core@^7.23.3", "@babel/core@^7.23.5", "@babel/core@^7.23.9": version "7.24.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== @@ -68,7 +68,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": +"@babel/generator@^7.21.5", "@babel/generator@^7.24.1", "@babel/generator@^7.7.2": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== @@ -78,6 +78,13 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" @@ -89,6 +96,21 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" + integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" @@ -109,6 +131,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15": version "7.24.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" @@ -127,11 +156,27 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -139,6 +184,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" @@ -180,7 +232,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== @@ -206,6 +258,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-decorators@^7.22.10": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" + integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -220,7 +279,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.21.4", "@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== @@ -276,13 +335,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-simple-access" "^7.22.5" + "@babel/plugin-transform-react-jsx-self@^7.23.3": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" @@ -297,6 +365,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-transform-typescript@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz#5c05e28bb76c7dfe7d6c5bed9951324fd2d3ab07" + integrity sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-typescript" "^7.24.1" + +"@babel/preset-typescript@^7.21.5": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" + "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.1", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0", "@babel/runtime@^7.5.5": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" @@ -313,7 +402,7 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" -"@babel/traverse@^7.24.1": +"@babel/traverse@^7.23.2", "@babel/traverse@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== @@ -559,6 +648,31 @@ picocolors "^1.0.0" sisteransi "^1.0.5" +"@cloudflare/workerd-darwin-64@1.20240320.1": + version "1.20240320.1" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240320.1.tgz#3cedf21172f54fad6d0e668e60152603968f3adc" + integrity sha512-ioG5k2M17xyiAlK/k3L21NZLMVeSHMjwlmGtZyCyzSLL5/zGINcgZ5yPLV0UuWiysw07/6Jjzm5Sx94hzMVybg== + +"@cloudflare/workerd-darwin-arm64@1.20240320.1": + version "1.20240320.1" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240320.1.tgz#e90828f5ef2ec4b27f5b75178d21490aba631a72" + integrity sha512-Ga6RDdnFEIsN4WuWsaP9bLGvK9K7pEIVoSIgmw6vweVlD8UK/a2MPGrsF1ogwdeCTCOMY8wUh9poL/Yu48IPpg== + +"@cloudflare/workerd-linux-64@1.20240320.1": + version "1.20240320.1" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240320.1.tgz#45fbece24a51c6e7ed314e9a87a04c8dc4cb6891" + integrity sha512-KFof5H8eU0NXv+pUAU7Lk/OLtOmfsioTJqu0v6kPL7QsTGsgzj5sEQNcQ8DONSze549Yflu5W00qpA2cPz9eWQ== + +"@cloudflare/workerd-linux-arm64@1.20240320.1": + version "1.20240320.1" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240320.1.tgz#43f487d1a59019c9636fc31558f0e6ebcdbe4c5e" + integrity sha512-t+kGc6dGdkKvVMGcHCPhlCsUZF5dj8xbAFvLB7DAJ8T79ys30rmY2Lu/C8vKlhjH9TJhbzgKmPaJ0wC/K4euvw== + +"@cloudflare/workerd-windows-64@1.20240320.1": + version "1.20240320.1" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240320.1.tgz#c2c5e6e82056a49453ce06133f106c504273ac20" + integrity sha512-9xDylCOsuzWqGuANkuUByiJ5RHeMqgw37FiI7rn8I6zdGAc/alOB9B4Bh7B73WC2uEpFL+XCEjcHZ6NmsO4NaQ== + "@coinbase/wallet-sdk@3.9.1": version "3.9.1" resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.1.tgz#503a14671bb392d653623ef2340934e213ac971f" @@ -574,6 +688,13 @@ preact "^10.16.0" sha.js "^2.4.11" +"@cspotcode/source-map-support@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@emotion/babel-plugin@^11.11.0": version "11.11.0" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" @@ -691,6 +812,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== +"@esbuild/android-arm64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz#b11bd4e4d031bb320c93c83c137797b2be5b403b" + integrity sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg== + "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -701,6 +827,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== +"@esbuild/android-arm@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.6.tgz#ac6b5674da2149997f6306b3314dae59bbe0ac26" + integrity sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g== + "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -711,6 +842,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== +"@esbuild/android-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.6.tgz#18c48bf949046638fc209409ff684c6bb35a5462" + integrity sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ== + "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -721,6 +857,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== +"@esbuild/darwin-arm64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz#b3fe19af1e4afc849a07c06318124e9c041e0646" + integrity sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA== + "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -731,6 +872,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== +"@esbuild/darwin-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz#f4dacd1ab21e17b355635c2bba6a31eba26ba569" + integrity sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg== + "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -741,6 +887,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== +"@esbuild/freebsd-arm64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz#ea4531aeda70b17cbe0e77b0c5c36298053855b4" + integrity sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg== + "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -751,6 +902,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== +"@esbuild/freebsd-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz#1896170b3c9f63c5e08efdc1f8abc8b1ed7af29f" + integrity sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q== + "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -761,6 +917,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== +"@esbuild/linux-arm64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz#967dfb951c6b2de6f2af82e96e25d63747f75079" + integrity sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w== + "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -771,6 +932,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== +"@esbuild/linux-arm@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz#097a0ee2be39fed3f37ea0e587052961e3bcc110" + integrity sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw== + "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -781,6 +947,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== +"@esbuild/linux-ia32@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz#a38a789d0ed157495a6b5b4469ec7868b59e5278" + integrity sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ== + "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -791,6 +962,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== +"@esbuild/linux-loong64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz#ae3983d0fb4057883c8246f57d2518c2af7cf2ad" + integrity sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ== + "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -801,6 +977,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== +"@esbuild/linux-mips64el@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz#15fbbe04648d944ec660ee5797febdf09a9bd6af" + integrity sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA== + "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -811,6 +992,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== +"@esbuild/linux-ppc64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz#38210094e8e1a971f2d1fd8e48462cc65f15ef19" + integrity sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg== + "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -821,6 +1007,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== +"@esbuild/linux-riscv64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz#bc3c66d5578c3b9951a6ed68763f2a6856827e4a" + integrity sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ== + "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -831,6 +1022,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== +"@esbuild/linux-s390x@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz#d7ba7af59285f63cfce6e5b7f82a946f3e6d67fc" + integrity sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q== + "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -841,6 +1037,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== +"@esbuild/linux-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz#ba51f8760a9b9370a2530f98964be5f09d90fed0" + integrity sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw== + "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -851,6 +1052,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== +"@esbuild/netbsd-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz#e84d6b6fdde0261602c1e56edbb9e2cb07c211b9" + integrity sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A== + "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -861,6 +1067,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== +"@esbuild/openbsd-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz#cf4b9fb80ce6d280a673d54a731d9c661f88b083" + integrity sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw== + "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -871,6 +1082,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== +"@esbuild/sunos-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz#a6838e246079b24d962b9dcb8d208a3785210a73" + integrity sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw== + "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -881,6 +1097,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== +"@esbuild/win32-arm64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz#ace0186e904d109ea4123317a3ba35befe83ac21" + integrity sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg== + "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -891,6 +1112,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== +"@esbuild/win32-ia32@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz#7fb3f6d4143e283a7f7dffc98a6baf31bb365c7e" + integrity sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg== + "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -901,6 +1127,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== +"@esbuild/win32-x64@0.17.6": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz#563ff4277f1230a006472664fa9278a83dd124da" + integrity sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA== + "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -1027,11 +1258,68 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@frames.js/debugger@^": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@frames.js/debugger/-/debugger-0.1.9.tgz#d3d45ec1f565b5facfd87d41eb8c3b8e9e2ad2e1" + integrity sha512-g7019xfCLMNHoTyaI+TY2L0ZxZnZH2DEvZQAlIeMmRHW0zhwXoKrgGa8QmO0MQtcB6XA3smaO4bM/7U0Yij0pA== + dependencies: + "@farcaster/core" "^0.14.7" + "@noble/ed25519" "^2.0.0" + "@radix-ui/react-accordion" "^1.1.2" + "@radix-ui/react-checkbox" "^1.0.4" + "@radix-ui/react-hover-card" "^1.0.7" + "@radix-ui/react-popover" "^1.0.7" + "@radix-ui/react-slot" "^1.0.2" + "@radix-ui/react-switch" "^1.0.3" + "@radix-ui/react-tabs" "^1.0.4" + "@rainbow-me/rainbowkit" "^2.0.2" + "@tanstack/react-query" "^5.22.2" + "@types/node" "^18.17.0" + "@types/react" "^18.2.0" + "@types/react-dom" "^18.2.0" + "@types/yargs" "^17.0.32" + "@xmtp/frames-validator" "^0.5.2" + autoprefixer "^10.0.1" + class-variance-authority "^0.7.0" + clsx "^2.1.0" + eslint "^8.56.0" + eslint-config-next "^14.1.0" + frames.js "^0.9.0" + is-port-reachable "^4.0.0" + lucide-react "^0.344.0" + next "^14.1.3" + open "^10.0.3" + postcss "^8" + qrcode.react "^3.1.0" + react "^18.2.0" + react-dom "^18.2.0" + tailwind-merge "^2.2.1" + tailwindcss "^3.3.0" + tailwindcss-animate "^1.0.7" + typescript "^5.3.3" + viem "^2.7.12" + wagmi "^2.5.7" + yargs "^17.7.2" + "@hono/node-server@^1.2.3": version "1.8.2" resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.8.2.tgz#940b3a0dbd7adbc510b79b626f3603258493354b" integrity sha512-h8l2TBLCPHZBUrrkosZ6L5CpBLj6zdESyF4B+zngiCDF7aZFQJ0alVbLx7jn8PCVi9EyoFf8a4hOZFi1tD95EA== +"@hono/node-server@^1.8.2", "@hono/node-server@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@hono/node-server/-/node-server-1.9.0.tgz#b3f0fb41e40bbc46c9e940f43d6c917455eaeb59" + integrity sha512-oJjk7WXBlENeHhWiMqSyxPIZ3Kmf5ZYxqdlcSIXyN8Rn50bNJsPl99G4POBS03Jxh56FdfRJ0SEnC8mAVIiavQ== + +"@hono/vite-dev-server@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@hono/vite-dev-server/-/vite-dev-server-0.10.0.tgz#0e79ab02132cac4ffb62b6ca029d11bad8f0a0bb" + integrity sha512-JWqdgH59x/PKDrwVCS5EW4eOL4fV+JOuzlKgaHk5eQUgE9vkPwyWwmf8f8rXjsXt5zxOKS3XMlf8sZeglFg3hw== + dependencies: + "@hono/node-server" "^1.8.2" + miniflare "^3.20231218.2" + minimatch "^9.0.3" + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -1287,7 +1575,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== @@ -1302,6 +1590,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -1310,6 +1606,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jspm/core@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@jspm/core/-/core-2.0.1.tgz#3f08c59c60a5f5e994523ed6b0b665ec80adc94e" + integrity sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw== + "@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" @@ -1344,6 +1645,29 @@ globby "^11.0.0" read-yaml-file "^1.1.0" +"@mdx-js/mdx@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" + integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/mdx" "^2.0.0" + estree-util-build-jsx "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-util-to-js "^1.1.0" + estree-walker "^3.0.0" + hast-util-to-estree "^2.0.0" + markdown-extensions "^1.0.0" + periscopic "^3.0.0" + remark-mdx "^2.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + unified "^10.0.0" + unist-util-position-from-estree "^1.0.0" + unist-util-stringify-position "^3.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + "@mdx-js/mdx@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.1.tgz#617bd2629ae561fdca1bb88e3badd947f5a82191" @@ -1767,6 +2091,47 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/package-json@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-4.0.1.tgz#1a07bf0e086b640500791f6bf245ff43cc27fa37" + integrity sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q== + dependencies: + "@npmcli/git" "^4.1.0" + glob "^10.2.2" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + proc-log "^3.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + "@open-frames/proxy-client@^0.2.0": version "0.2.1" resolved "https://registry.yarnpkg.com/@open-frames/proxy-client/-/proxy-client-0.2.1.tgz#876c5a1cdf5acfe85b56d656f4cc73d15c9843a9" @@ -1886,6 +2251,11 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2350,7 +2720,73 @@ dependencies: merge-options "^3.0.4" -"@remix-run/node@^2.8.1": +"@remix-run/dev@^2.8.1": + version "2.8.1" + resolved "https://registry.yarnpkg.com/@remix-run/dev/-/dev-2.8.1.tgz#472b411499009e985999cc483e5853127896ed5f" + integrity sha512-qFt4jAsAJeIOyg6ngeSnTG/9Z5N9QJfeThP/8wRHc1crqYgTiEtcI3DZ8WlAXjVSF5emgn/ZZKqzLAI02OgMfQ== + dependencies: + "@babel/core" "^7.21.8" + "@babel/generator" "^7.21.5" + "@babel/parser" "^7.21.8" + "@babel/plugin-syntax-decorators" "^7.22.10" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/preset-typescript" "^7.21.5" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.22.5" + "@mdx-js/mdx" "^2.3.0" + "@npmcli/package-json" "^4.0.1" + "@remix-run/node" "2.8.1" + "@remix-run/router" "1.15.3-pre.0" + "@remix-run/server-runtime" "2.8.1" + "@types/mdx" "^2.0.5" + "@vanilla-extract/integration" "^6.2.0" + arg "^5.0.1" + cacache "^17.1.3" + chalk "^4.1.2" + chokidar "^3.5.1" + cross-spawn "^7.0.3" + dotenv "^16.0.0" + es-module-lexer "^1.3.1" + esbuild "0.17.6" + esbuild-plugins-node-modules-polyfill "^1.6.0" + execa "5.1.1" + exit-hook "2.2.1" + express "^4.17.1" + fs-extra "^10.0.0" + get-port "^5.1.1" + gunzip-maybe "^1.4.2" + jsesc "3.0.2" + json5 "^2.2.2" + lodash "^4.17.21" + lodash.debounce "^4.0.8" + minimatch "^9.0.0" + ora "^5.4.1" + picocolors "^1.0.0" + picomatch "^2.3.1" + pidtree "^0.6.0" + postcss "^8.4.19" + postcss-discard-duplicates "^5.1.0" + postcss-load-config "^4.0.1" + postcss-modules "^6.0.0" + prettier "^2.7.1" + pretty-ms "^7.0.1" + react-refresh "^0.14.0" + remark-frontmatter "4.0.1" + remark-mdx-frontmatter "^1.0.1" + semver "^7.3.7" + set-cookie-parser "^2.6.0" + tar-fs "^2.1.1" + tsconfig-paths "^4.0.0" + ws "^7.4.5" + +"@remix-run/express@2.8.1": + version "2.8.1" + resolved "https://registry.yarnpkg.com/@remix-run/express/-/express-2.8.1.tgz#d12c94354f8a3a5641c1b6f2f6b915f8dd51bff1" + integrity sha512-p1eo8uwZk8uLihSDpUnPOPsTDfghWikVPQfa+e0ZMk6tnJCjcpHAyENKDFtn9vDh9h7YNUg6A7+19CStHgxd7Q== + dependencies: + "@remix-run/node" "2.8.1" + +"@remix-run/node@2.8.1", "@remix-run/node@^2.8.1": version "2.8.1" resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-2.8.1.tgz#0244ead9a0267663cd394f3d462d4baaccaf5960" integrity sha512-ddCwBVlfLvRxTQJHPcaM1lhfMjsFYG3EGmYpWJIWnnzDX5EbX9pUNHBWisMuH1eA0c7pbw0PbW0UtCttKYx2qg== @@ -2364,11 +2800,40 @@ source-map-support "^0.5.21" stream-slice "^0.1.2" +"@remix-run/react@^2.8.1": + version "2.8.1" + resolved "https://registry.yarnpkg.com/@remix-run/react/-/react-2.8.1.tgz#89d7f6a6a5d706eb93b3bdeb92dcc3e338d7a0b4" + integrity sha512-HTPm1U8+xz2jPaVjZnssrckfmFMA8sUZUdaWnoF5lmLWdReqcQv+XlBhIrQQ3jO9L8iYYdnzaSZZcRFYSdpTYg== + dependencies: + "@remix-run/router" "1.15.3" + "@remix-run/server-runtime" "2.8.1" + react-router "6.22.3" + react-router-dom "6.22.3" + "@remix-run/router@1.15.3": version "1.15.3" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c" integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== +"@remix-run/router@1.15.3-pre.0": + version "1.15.3-pre.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3-pre.0.tgz#a77015ddaafcf0f0df538874f77abdbfcf86cc59" + integrity sha512-JUQb6sztqJpRbsdKpx3D4+6eaGmHU4Yb/QeKrES/ZbLuijlZMOmZ+gV0ohX5vrRDnJHJmcQPq3Tpk0GGPNM9gg== + +"@remix-run/serve@^2.8.1": + version "2.8.1" + resolved "https://registry.yarnpkg.com/@remix-run/serve/-/serve-2.8.1.tgz#b1f58ba2a0b310a1de0e2d6f336135a5a0f9287a" + integrity sha512-PyCV7IMnRshwfFw7JJ2hZJppX88VAhZyYjeTAmYb6PK7IDtdmqUf5eOrYDi8gCu914C+aZRu6blxpLRlpyCY8Q== + dependencies: + "@remix-run/express" "2.8.1" + "@remix-run/node" "2.8.1" + chokidar "^3.5.3" + compression "^1.7.4" + express "^4.17.1" + get-port "5.1.1" + morgan "^1.10.0" + source-map-support "^0.5.21" + "@remix-run/server-runtime@2.8.1": version "2.8.1" resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-2.8.1.tgz#621f52e271e8ae117e4882761e143fa7ce7f9d42" @@ -2882,7 +3347,7 @@ dependencies: "@types/estree" "*" -"@types/babel__core@^7.1.14", "@types/babel__core@^7.20.4": +"@types/babel__core@^7.1.14", "@types/babel__core@^7.20.4", "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -3024,6 +3489,13 @@ resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + "@types/hast@^3.0.0", "@types/hast@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" @@ -3073,6 +3545,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + "@types/mdast@^4.0.0": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" @@ -3085,6 +3564,11 @@ resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.11.tgz#21f4c166ed0e0a3a733869ba04cd8daea9834b8e" integrity sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw== +"@types/mdx@^2.0.5": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.12.tgz#38db34cc8999b982beaec01399620bee6c65ef2e" + integrity sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw== + "@types/methods@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@types/methods/-/methods-1.1.4.tgz#d3b7ac30ac47c91054ea951ce9eed07b1051e547" @@ -3154,7 +3638,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@^18.2.0", "@types/react-dom@^18.2.18": +"@types/react-dom@^18.2.0", "@types/react-dom@^18.2.18", "@types/react-dom@^18.2.7": version "18.2.22" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== @@ -3170,6 +3654,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.2.20", "@types/react@^18.2.45": + version "18.2.70" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.70.tgz#89a37f9e0a6a4931f4259c598f40fd44dd6abf71" + integrity sha512-hjlM2hho2vqklPhopNkXkdkeq6Lv8WSZTpr7956zY+3WS5cfYUewtCzsJLsbW5dEv3lfSeQ4W14ZFeKC437JRQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/scheduler@*": version "0.16.8" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" @@ -3236,7 +3729,7 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== -"@types/unist@^2.0.0": +"@types/unist@^2", "@types/unist@^2.0.0": version "2.0.10" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== @@ -3253,7 +3746,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^6.17.0", "@typescript-eslint/eslint-plugin@^6.5.0": +"@typescript-eslint/eslint-plugin@^6.17.0", "@typescript-eslint/eslint-plugin@^6.5.0", "@typescript-eslint/eslint-plugin@^6.7.4": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== @@ -3270,7 +3763,7 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^6.17.0", "@typescript-eslint/parser@^6.5.0": +"@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^6.17.0", "@typescript-eslint/parser@^6.5.0", "@typescript-eslint/parser@^6.7.4": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== @@ -3454,7 +3947,7 @@ dependencies: "@vanilla-extract/private" "^1.0.3" -"@vanilla-extract/integration@^6.3.0": +"@vanilla-extract/integration@^6.2.0", "@vanilla-extract/integration@^6.3.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@vanilla-extract/integration/-/integration-6.5.0.tgz#613407565b07dc60b123ca9080ea3f47cd2ce7bb" integrity sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ== @@ -3545,6 +4038,17 @@ "@types/babel__core" "^7.20.4" react-refresh "^0.14.0" +"@vitejs/plugin-react@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" + integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== + dependencies: + "@babel/core" "^7.23.5" + "@babel/plugin-transform-react-jsx-self" "^7.23.3" + "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.0" + "@wagmi/connectors@4.1.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.18.tgz#b95350ff2cb527093ff9dd11d382e0563ec546e3" @@ -3916,11 +4420,24 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.0.0, acorn@^8.11.3, acorn@^8.9.0: +acorn-walk@^8.2.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.0.0, acorn@^8.11.3, acorn@^8.8.0, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.12.4, ajv@~6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -3990,7 +4507,7 @@ anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arg@^5.0.2: +arg@^5.0.1, arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -4135,6 +4652,13 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +as-table@^1.0.36: + version "1.0.55" + resolved "https://registry.yarnpkg.com/as-table/-/as-table-1.0.55.tgz#dc984da3937745de902cea1d45843c01bdbbec4f" + integrity sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ== + dependencies: + printable-characters "^1.0.42" + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -4299,6 +4823,13 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + bcp-47-match@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz#603226f6e5d3914a581408be33b28a53144b09d0" @@ -4316,6 +4847,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bl@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" @@ -4397,6 +4937,13 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + integrity sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ== + dependencies: + pako "~0.2.0" + browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" @@ -4426,6 +4973,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -4446,6 +5001,13 @@ builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + bundle-name@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" @@ -4482,6 +5044,24 @@ cac@^6.7.12, cac@^6.7.14: resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== +cacache@^17.1.3: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -4532,6 +5112,14 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.300015 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== +capnp-ts@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/capnp-ts/-/capnp-ts-0.7.0.tgz#16fd8e76b667d002af8fcf4bf92bf15d1a7b54a9" + integrity sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g== + dependencies: + debug "^4.3.1" + tslib "^2.2.0" + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -4546,7 +5134,7 @@ chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4629,6 +5217,16 @@ chokidar@^3.5.1, chokidar@^3.5.3, chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chroma-js@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.4.2.tgz#dffc214ed0c11fa8eefca2c36651d8e57cbfb2b0" @@ -4665,6 +5263,18 @@ clean-regexp@^1.0.0: dependencies: escape-string-regexp "^1.0.5" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" @@ -4672,7 +5282,7 @@ cli-cursor@^4.0.0: dependencies: restore-cursor "^4.0.0" -cli-spinners@^2.9.0: +cli-spinners@^2.5.0, cli-spinners@^2.9.0: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== @@ -4877,6 +5487,11 @@ cookie@0.6.0, cookie@^0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookiejar@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" @@ -4927,6 +5542,13 @@ create-vocs@^1.0.0-alpha.4: fs-extra "^11.1.1" picocolors "^1.0.0" +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + cross-fetch@^3.1.4, cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" @@ -4950,7 +5572,7 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5054,6 +5676,11 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +data-uri-to-buffer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" + integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== + data-uri-to-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" @@ -5217,7 +5844,7 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -5304,6 +5931,11 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diff@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dijkstrajs@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" @@ -5375,11 +6007,21 @@ dotenv@16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -dotenv@^16.4.5: +dotenv@^16.0.0, dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +duplexify@^3.5.0, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + duplexify@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" @@ -5457,7 +6099,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5501,6 +6143,11 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5639,6 +6286,11 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" +es-module-lexer@^1.3.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.2.tgz#ba1a62255ff9b41023aaf9bd08c016a5f1a3fef3" + integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== + es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" @@ -5671,6 +6323,43 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-plugins-node-modules-polyfill@^1.6.0: + version "1.6.3" + resolved "https://registry.yarnpkg.com/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.3.tgz#8090fc4126b3d6a604ec01fd4646f407059301cf" + integrity sha512-nydQGT3RijD8mBd3Hek+2gSAxndgceZU9GIjYYiqU+7CE7veN8utTmupf0frcKpwIXCXWpRofL9CY9k0yU70CA== + dependencies: + "@jspm/core" "^2.0.1" + local-pkg "^0.5.0" + resolve.exports "^2.0.2" + +esbuild@0.17.6: + version "0.17.6" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.6.tgz#bbccd4433629deb6e0a83860b3b61da120ba4e01" + integrity sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q== + optionalDependencies: + "@esbuild/android-arm" "0.17.6" + "@esbuild/android-arm64" "0.17.6" + "@esbuild/android-x64" "0.17.6" + "@esbuild/darwin-arm64" "0.17.6" + "@esbuild/darwin-x64" "0.17.6" + "@esbuild/freebsd-arm64" "0.17.6" + "@esbuild/freebsd-x64" "0.17.6" + "@esbuild/linux-arm" "0.17.6" + "@esbuild/linux-arm64" "0.17.6" + "@esbuild/linux-ia32" "0.17.6" + "@esbuild/linux-loong64" "0.17.6" + "@esbuild/linux-mips64el" "0.17.6" + "@esbuild/linux-ppc64" "0.17.6" + "@esbuild/linux-riscv64" "0.17.6" + "@esbuild/linux-s390x" "0.17.6" + "@esbuild/linux-x64" "0.17.6" + "@esbuild/netbsd-x64" "0.17.6" + "@esbuild/openbsd-x64" "0.17.6" + "@esbuild/sunos-x64" "0.17.6" + "@esbuild/win32-arm64" "0.17.6" + "@esbuild/win32-ia32" "0.17.6" + "@esbuild/win32-x64" "0.17.6" + esbuild@^0.19.2, "esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": version "0.19.12" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" @@ -6070,6 +6759,13 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-attach-comments@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== + dependencies: + "@types/estree" "^1.0.0" + estree-util-attach-comments@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" @@ -6077,6 +6773,15 @@ estree-util-attach-comments@^3.0.0: dependencies: "@types/estree" "^1.0.0" +estree-util-build-jsx@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" + integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== + dependencies: + "@types/estree-jsx" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-walker "^3.0.0" + estree-util-build-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" @@ -6087,11 +6792,30 @@ estree-util-build-jsx@^3.0.0: estree-util-is-identifier-name "^3.0.0" estree-walker "^3.0.0" +estree-util-is-identifier-name@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-1.1.0.tgz#2e3488ea06d9ea2face116058864f6370b37456d" + integrity sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ== + +estree-util-is-identifier-name@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== + estree-util-is-identifier-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== +estree-util-to-js@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + estree-util-to-js@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" @@ -6101,6 +6825,13 @@ estree-util-to-js@^2.0.0: astring "^1.8.0" source-map "^0.7.0" +estree-util-value-to-estree@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz#1d3125594b4d6680f666644491e7ac1745a3df49" + integrity sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw== + dependencies: + is-plain-obj "^3.0.0" + estree-util-value-to-estree@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz#0b7b5d6b6a4aaad5c60999ffbc265a985df98ac5" @@ -6109,6 +6840,14 @@ estree-util-value-to-estree@^3.0.0: "@types/estree" "^1.0.0" is-plain-obj "^4.0.0" +estree-util-visit@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^2.0.0" + estree-util-visit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" @@ -6214,7 +6953,7 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0, execa@^5.1.1: +execa@5.1.1, execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -6244,6 +6983,11 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +exit-hook@2.2.1, exit-hook@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" + integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -6260,7 +7004,7 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -express@^4.19.1: +express@^4.17.1, express@^4.19.1: version "4.19.1" resolved "https://registry.yarnpkg.com/express/-/express-4.19.1.tgz#4700635795e911600a45596138cf5b0320e78256" integrity sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w== @@ -6333,7 +7077,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -6514,15 +7258,40 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +frames.js@^0.9.0, frames.js@^0.9.3, frames.js@^0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/frames.js/-/frames.js-0.9.6.tgz#dcf68f88a0237451dba11fbebcfd7df5a004c649" + integrity sha512-NtIs9kWdLnXBB3a7IAnYP3Iv4V+x1dHsKEwacVfWVaFd+3jnzBfiIbvo9dnMuYzFOOyaiPWmZYrff0aTygJP7A== + dependencies: + "@farcaster/core" "^0.14.7" + "@vercel/og" "^0.6.2" + cheerio "^1.0.0-rc.12" + protobufjs "^7.2.6" + viem "^2.7.8" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^11.1.1: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -6546,6 +7315,20 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -6581,6 +7364,13 @@ futoin-hkdf@^1.5.3: resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz#6c8024f2e1429da086d4e18289ef2239ad33ee35" integrity sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ== +generic-names@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-4.0.0.tgz#0bd8a2fd23fe8ea16cbd0a279acd69c06933d9a3" + integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== + dependencies: + loader-utils "^3.2.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6617,6 +7407,19 @@ get-port-please@^3.1.2: resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.2.tgz#502795e56217128e4183025c89a48c71652f4e49" integrity sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ== +get-port@5.1.1, get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-source@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/get-source/-/get-source-2.0.12.tgz#0b47d57ea1e53ce0d3a69f4f3d277eb8047da944" + integrity sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w== + dependencies: + data-uri-to-buffer "^2.0.0" + source-map "^0.6.1" + get-stdin@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" @@ -6672,7 +7475,12 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@10.3.10, glob@^10.3.10, glob@^10.3.7: +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@10.3.10, glob@^10.2.2, glob@^10.3.10, glob@^10.3.7: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -6737,6 +7545,11 @@ globby@^13.1.2, globby@^13.2.2: merge2 "^1.4.1" slash "^4.0.0" +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -6759,6 +7572,18 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +gunzip-maybe@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac" + integrity sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw== + dependencies: + browserify-zlib "^0.1.4" + is-deflate "^1.0.0" + is-gzip "^1.0.0" + peek-stream "^1.1.0" + pumpify "^1.3.3" + through2 "^2.0.3" + h3@^1.10.2, h3@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/h3/-/h3-1.11.1.tgz#e9414ae6f2a076a345ea07256b320edb29bab9f7" @@ -6892,6 +7717,27 @@ hast-util-select@^6.0.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" +hast-util-to-estree@^2.0.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" + integrity sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + estree-util-attach-comments "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + hast-util-whitespace "^2.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdxjs-esm "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.1" + unist-util-position "^4.0.0" + zwitch "^2.0.0" + hast-util-to-estree@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" @@ -6942,6 +7788,11 @@ hast-util-to-string@^3.0.0: dependencies: "@types/hast" "^3.0.0" +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== + hast-util-whitespace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" @@ -7006,6 +7857,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -7080,17 +7938,22 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + idb-keyval@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.0.5, ignore@^5.2.0, ignore@^5.2.4: +ignore@^5.0.5, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -7250,7 +8113,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.1.0, is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: +is-core-module@^2.1.0, is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== @@ -7276,6 +8139,11 @@ is-decimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== +is-deflate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" + integrity sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ== + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -7322,6 +8190,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== + is-hexadecimal@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" @@ -7334,6 +8207,11 @@ is-inside-container@^1.0.0: dependencies: is-docker "^3.0.0" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-interactive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" @@ -7376,6 +8254,11 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + is-plain-obj@^4.0.0, is-plain-obj@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" @@ -7451,6 +8334,11 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.3: dependencies: which-typed-array "^1.1.14" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" @@ -7512,6 +8400,11 @@ isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isbot@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/isbot/-/isbot-4.4.0.tgz#897ce9f2e498de6181027660ca80de8734d1ef81" + integrity sha512-8ZvOWUA68kyJO4hHJdWjyreq7TYNWTS9y15IzeqVdKxR9pPr3P/3r9AHcoIv9M0Rllkao5qWz2v1lmcyKIVCzQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7994,23 +8887,23 @@ js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: +js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" +jsesc@3.0.2, jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -8026,6 +8919,11 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" + integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== + json-rpc-engine@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" @@ -8070,7 +8968,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.2.3: +json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -8137,7 +9035,7 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.1.5: +kleur@^4.0.3, kleur@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== @@ -8254,6 +9152,19 @@ load-yaml-file@^0.2.0: pify "^4.0.1" strip-bom "^3.0.0" +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +local-pkg@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" + integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== + dependencies: + mlly "^1.4.2" + pkg-types "^1.0.3" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -8268,6 +9179,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.isequal@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -8293,6 +9214,14 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-symbols@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" @@ -8345,6 +9274,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + lucide-react@^0.331.0: version "0.331.0" resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.331.0.tgz#06a566303a4b2f4f84aadea6f5ba3312ed5e04ad" @@ -8384,6 +9318,11 @@ mark.js@^8.11.1: resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== +markdown-extensions@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" + integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== + markdown-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" @@ -8394,6 +9333,15 @@ markdown-table@^3.0.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + mdast-util-directive@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" @@ -8418,6 +9366,24 @@ mdast-util-find-and-replace@^3.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" +mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + mdast-util-from-markdown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" @@ -8436,6 +9402,15 @@ mdast-util-from-markdown@^2.0.0: micromark-util-types "^2.0.0" unist-util-stringify-position "^4.0.0" +mdast-util-frontmatter@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz#79c46d7414eb9d3acabe801ee4a70a70b75e5af1" + integrity sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-extension-frontmatter "^1.0.0" + mdast-util-frontmatter@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" @@ -8513,6 +9488,17 @@ mdast-util-gfm@^3.0.0: mdast-util-gfm-task-list-item "^2.0.0" mdast-util-to-markdown "^2.0.0" +mdast-util-mdx-expression@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + mdast-util-mdx-expression@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" @@ -8525,6 +9511,24 @@ mdast-util-mdx-expression@^2.0.0: mdast-util-from-markdown "^2.0.0" mdast-util-to-markdown "^2.0.0" +mdast-util-mdx-jsx@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz#7c1f07f10751a78963cfabee38017cbc8b7786d1" + integrity sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + mdast-util-from-markdown "^1.1.0" + mdast-util-to-markdown "^1.3.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^4.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + mdast-util-mdx-jsx@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz#daae777c72f9c4a106592e3025aa50fb26068e1b" @@ -8544,6 +9548,17 @@ mdast-util-mdx-jsx@^3.0.0: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +mdast-util-mdx@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" + integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdx-jsx "^2.0.0" + mdast-util-mdxjs-esm "^1.0.0" + mdast-util-to-markdown "^1.0.0" + mdast-util-mdx@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" @@ -8555,6 +9570,17 @@ mdast-util-mdx@^3.0.0: mdast-util-mdxjs-esm "^2.0.0" mdast-util-to-markdown "^2.0.0" +mdast-util-mdxjs-esm@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + mdast-util-mdxjs-esm@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" @@ -8567,6 +9593,14 @@ mdast-util-mdxjs-esm@^2.0.0: mdast-util-from-markdown "^2.0.0" mdast-util-to-markdown "^2.0.0" +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + mdast-util-phrasing@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" @@ -8575,6 +9609,20 @@ mdast-util-phrasing@^4.0.0: "@types/mdast" "^4.0.0" unist-util-is "^6.0.0" +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + mdast-util-to-hast@^13.0.0, mdast-util-to-hast@^13.0.2: version "13.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz#1ae54d903150a10fe04d59f03b2b95fd210b2124" @@ -8590,6 +9638,20 @@ mdast-util-to-hast@^13.0.0, mdast-util-to-hast@^13.0.2: unist-util-visit "^5.0.0" vfile "^6.0.0" +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + mdast-util-to-markdown@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" @@ -8604,6 +9666,13 @@ mdast-util-to-markdown@^2.0.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" @@ -8672,6 +9741,28 @@ micro-ftch@^0.3.1: resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromark-core-commonmark@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" @@ -8707,6 +9798,16 @@ micromark-extension-directive@^3.0.0: micromark-util-types "^2.0.0" parse-entities "^4.0.0" +micromark-extension-frontmatter@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz#2946643938e491374145d0c9aacc3249e38a865f" + integrity sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ== + dependencies: + fault "^2.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-extension-frontmatter@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" @@ -8796,6 +9897,20 @@ micromark-extension-gfm@^3.0.0: micromark-util-combine-extensions "^2.0.0" micromark-util-types "^2.0.0" +micromark-extension-mdx-expression@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz#5bc1f5fd90388e8293b3ef4f7c6f06c24aff6314" + integrity sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw== + dependencies: + "@types/estree" "^1.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-extension-mdx-expression@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" @@ -8810,6 +9925,22 @@ micromark-extension-mdx-expression@^3.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-extension-mdx-jsx@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz#e72d24b7754a30d20fb797ece11e2c4e2cae9e82" + integrity sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-extension-mdx-jsx@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" @@ -8826,6 +9957,13 @@ micromark-extension-mdx-jsx@^3.0.0: micromark-util-types "^2.0.0" vfile-message "^4.0.0" +micromark-extension-mdx-md@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz#595d4b2f692b134080dca92c12272ab5b74c6d1a" + integrity sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA== + dependencies: + micromark-util-types "^1.0.0" + micromark-extension-mdx-md@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" @@ -8833,6 +9971,21 @@ micromark-extension-mdx-md@^2.0.0: dependencies: micromark-util-types "^2.0.0" +micromark-extension-mdxjs-esm@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz#e4f8be9c14c324a80833d8d3a227419e2b25dec1" + integrity sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w== + dependencies: + "@types/estree" "^1.0.0" + micromark-core-commonmark "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.1.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-extension-mdxjs-esm@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" @@ -8848,6 +10001,20 @@ micromark-extension-mdxjs-esm@^3.0.0: unist-util-position-from-estree "^2.0.0" vfile-message "^4.0.0" +micromark-extension-mdxjs@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz#f78d4671678d16395efeda85170c520ee795ded8" + integrity sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^1.0.0" + micromark-extension-mdx-jsx "^1.0.0" + micromark-extension-mdx-md "^1.0.0" + micromark-extension-mdxjs-esm "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + micromark-extension-mdxjs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" @@ -8862,6 +10029,15 @@ micromark-extension-mdxjs@^3.0.0: micromark-util-combine-extensions "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-destination@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" @@ -8871,6 +10047,16 @@ micromark-factory-destination@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-factory-label@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" @@ -8881,6 +10067,20 @@ micromark-factory-label@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-mdx-expression@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz#57ba4571b69a867a1530f34741011c71c73a4976" + integrity sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA== + dependencies: + "@types/estree" "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-factory-mdx-expression@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" @@ -8895,6 +10095,14 @@ micromark-factory-mdx-expression@^2.0.0: unist-util-position-from-estree "^2.0.0" vfile-message "^4.0.0" +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-space@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" @@ -8903,6 +10111,16 @@ micromark-factory-space@^2.0.0: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-title@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" @@ -8913,6 +10131,16 @@ micromark-factory-title@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-whitespace@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" @@ -8923,6 +10151,14 @@ micromark-factory-whitespace@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-util-character@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" @@ -8931,6 +10167,13 @@ micromark-util-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-chunked@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" @@ -8938,6 +10181,15 @@ micromark-util-chunked@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-util-classify-character@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" @@ -8947,6 +10199,14 @@ micromark-util-classify-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + micromark-util-combine-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" @@ -8955,6 +10215,13 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" @@ -8962,6 +10229,16 @@ micromark-util-decode-numeric-character-reference@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-decode-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" @@ -8972,11 +10249,30 @@ micromark-util-decode-string@^2.0.0: micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + micromark-util-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== +micromark-util-events-to-acorn@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz#a4ab157f57a380e646670e49ddee97a72b58b557" + integrity sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^2.0.0" + estree-util-visit "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-util-events-to-acorn@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" @@ -8991,11 +10287,23 @@ micromark-util-events-to-acorn@^2.0.0: micromark-util-types "^2.0.0" vfile-message "^4.0.0" +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + micromark-util-html-tag-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-normalize-identifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" @@ -9003,6 +10311,13 @@ micromark-util-normalize-identifier@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + micromark-util-resolve-all@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" @@ -9010,6 +10325,15 @@ micromark-util-resolve-all@^2.0.0: dependencies: micromark-util-types "^2.0.0" +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-sanitize-uri@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" @@ -9019,6 +10343,16 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-util-subtokenize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" @@ -9029,16 +10363,49 @@ micromark-util-subtokenize@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + micromark-util-symbol@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + micromark-util-types@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromark@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" @@ -9112,6 +10479,24 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +miniflare@^3.20231218.2: + version "3.20240320.0" + resolved "https://registry.yarnpkg.com/miniflare/-/miniflare-3.20240320.0.tgz#45f601e61529c84c7b37248c8ca133eaafad76ec" + integrity sha512-4M2QRxs+J5sUsybBzKT++tlbrjjjGZdtWxKmj2sqLsT26dGaKDz7DxjAeF5XIhKa5cADcffygjxx4EvfWocMmw== + dependencies: + "@cspotcode/source-map-support" "0.8.1" + acorn "^8.8.0" + acorn-walk "^8.2.0" + capnp-ts "^0.7.0" + exit-hook "^2.2.1" + glob-to-regexp "^0.4.1" + stoppable "^1.1.0" + undici "^5.28.2" + workerd "1.20240320.1" + ws "^8.11.0" + youch "^3.2.2" + zod "^3.20.6" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -9122,7 +10507,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@9.0.3, minimatch@^9.0.1, minimatch@^9.0.3: +minimatch@9.0.3, minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== @@ -9150,7 +10535,40 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: version "7.0.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== @@ -9160,6 +10578,14 @@ minisearch@^6.3.0: resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.3.0.tgz#985a2f1ca3c73c2d65af94f0616bfe57164b0b6b" integrity sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ== +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mipd@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.5.tgz#367ee796531c23f0631f129038700b1406663aec" @@ -9172,6 +10598,16 @@ mixme@^0.5.1: resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.10.tgz#d653b2984b75d9018828f1ea333e51717ead5f51" integrity sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q== +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mlly@^1.2.0, mlly@^1.4.2, mlly@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.6.1.tgz#0983067dc3366d6314fc5e12712884e6978d028f" @@ -9187,6 +10623,17 @@ modern-ahocorasick@^1.0.0: resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + motion@10.16.2: version "10.16.2" resolved "https://registry.yarnpkg.com/motion/-/motion-10.16.2.tgz#7dc173c6ad62210a7e9916caeeaf22c51e598d21" @@ -9199,7 +10646,7 @@ motion@10.16.2: "@motionone/utils" "^10.15.1" "@motionone/vue" "^10.16.2" -mri@^1.2.0: +mri@^1.1.0, mri@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== @@ -9209,6 +10656,11 @@ mrmime@^1.0.0: resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9229,6 +10681,11 @@ multiformats@^9.4.2: resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -9263,7 +10720,7 @@ neverthrow@^6.0.0: resolved "https://registry.yarnpkg.com/neverthrow/-/neverthrow-6.1.0.tgz#51a6e9ce2e06600045b3c1b37aecc536d267bf95" integrity sha512-xNbNjp/6M5vUV+mststgneJN9eJeJCDSYSBTaf3vxgvcKooP+8L0ATFpM8DGfmH7UWKJeoa24Qi33tBP9Ya3zA== -next@^14.0.4, next@^14.1.0, next@^14.1.3: +next@^14.0.4, next@^14.1.0, next@^14.1.2, next@^14.1.3: version "14.1.4" resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== @@ -9351,6 +10808,16 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -9366,6 +10833,38 @@ not@^0.1.0: resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d" integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-pick-manifest@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -9497,6 +10996,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" @@ -9554,6 +11060,21 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ora@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/ora/-/ora-7.0.1.tgz#cdd530ecd865fe39e451a0e7697865669cb11930" @@ -9624,12 +11145,19 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@^0.2.5: +pako@^0.2.5, pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== @@ -9673,6 +11201,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" @@ -9741,6 +11274,15 @@ pathe@^1.1.0, pathe@^1.1.1, pathe@^1.1.2: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +peek-stream@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" + integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== + dependencies: + buffer-from "^1.0.0" + duplexify "^3.5.0" + through2 "^2.0.3" + periscopic@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" @@ -9760,6 +11302,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -9851,6 +11398,11 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + postcss-import@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" @@ -9875,6 +11427,48 @@ postcss-load-config@^4.0.1: lilconfig "^3.0.0" yaml "^2.3.4" +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-modules@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-6.0.0.tgz#cac283dbabbbdc2558c45391cbd0e2df9ec50118" + integrity sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ== + dependencies: + generic-names "^4.0.0" + icss-utils "^5.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + postcss-nested@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" @@ -9882,7 +11476,7 @@ postcss-nested@^6.0.1: dependencies: postcss-selector-parser "^6.0.11" -postcss-selector-parser@^6.0.11: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.16" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== @@ -9890,7 +11484,7 @@ postcss-selector-parser@^6.0.11: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -9904,7 +11498,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.3.6, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.36: +postcss@^8, postcss@^8.3.6, postcss@^8.4.19, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.36: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -9960,6 +11554,23 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + +printable-characters@^1.0.42: + version "1.0.42" + resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" + integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ== + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -9975,6 +11586,19 @@ process-warning@^1.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -10038,6 +11662,14 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -10046,6 +11678,15 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -10236,7 +11877,7 @@ react-remove-scroll@2.5.7: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" -react-router-dom@^6.20.0: +react-router-dom@6.22.3, react-router-dom@^6.20.0: version "6.22.3" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.3.tgz#9781415667fd1361a475146c5826d9f16752a691" integrity sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw== @@ -10321,7 +11962,7 @@ readable-stream@2.3.3: string_decoder "~1.0.3" util-deprecate "~1.0.1" -readable-stream@^2.3.3, readable-stream@^2.3.7: +readable-stream@^2.0.0, readable-stream@^2.3.3, readable-stream@^2.3.7, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -10446,6 +12087,16 @@ remark-directive@^3.0.0: micromark-extension-directive "^3.0.0" unified "^11.0.0" +remark-frontmatter@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz#84560f7ccef114ef076d3d3735be6d69f8922309" + integrity sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-frontmatter "^1.0.0" + micromark-extension-frontmatter "^1.0.0" + unified "^10.0.0" + remark-frontmatter@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" @@ -10468,6 +12119,16 @@ remark-gfm@^4.0.0: remark-stringify "^11.0.0" unified "^11.0.0" +remark-mdx-frontmatter@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/remark-mdx-frontmatter/-/remark-mdx-frontmatter-1.1.1.tgz#54cfb3821fbb9cb6057673e0570ae2d645f6fe32" + integrity sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA== + dependencies: + estree-util-is-identifier-name "^1.0.0" + estree-util-value-to-estree "^1.0.0" + js-yaml "^4.0.0" + toml "^3.0.0" + remark-mdx-frontmatter@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-mdx-frontmatter/-/remark-mdx-frontmatter-4.0.0.tgz#1d0287103ac73c5d493d2fad19dd805e69db55ca" @@ -10480,6 +12141,14 @@ remark-mdx-frontmatter@^4.0.0: unified "^11.0.0" yaml "^2.0.0" +remark-mdx@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" + integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== + dependencies: + mdast-util-mdx "^2.0.0" + micromark-extension-mdxjs "^1.0.0" + remark-mdx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.1.tgz#8f73dd635c1874e44426e243f72c0977cf60e212" @@ -10488,6 +12157,15 @@ remark-mdx@^3.0.0: mdast-util-mdx "^3.0.0" micromark-extension-mdxjs "^3.0.0" +remark-parse@^10.0.0: + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" + remark-parse@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" @@ -10498,6 +12176,16 @@ remark-parse@^11.0.0: micromark-util-types "^2.0.0" unified "^11.0.0" +remark-rehype@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" + remark-rehype@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.0.tgz#d5f264f42bcbd4d300f030975609d01a1697ccdc" @@ -10555,7 +12243,7 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve.exports@^2.0.0: +resolve.exports@^2.0.0, resolve.exports@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== @@ -10586,6 +12274,14 @@ resolve@~1.19.0: is-core-module "^2.1.0" path-parse "^1.0.6" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + restore-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" @@ -10594,6 +12290,11 @@ restore-cursor@^4.0.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -10664,6 +12365,13 @@ rxjs@^7.8.0, rxjs@^7.8.1: dependencies: tslib "^2.1.0" +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + safe-array-concat@^1.1.0, safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" @@ -10745,7 +12453,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -10786,7 +12494,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-cookie-parser@^2.4.8: +set-cookie-parser@^2.4.8, set-cookie-parser@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== @@ -10882,6 +12590,15 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +sirv@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -11054,6 +12771,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssri@^10.0.0: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + dependencies: + minipass "^7.0.3" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -11061,6 +12785,14 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stacktracey@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/stacktracey/-/stacktracey-2.1.8.tgz#bf9916020738ce3700d1323b32bd2c91ea71199d" + integrity sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw== + dependencies: + as-table "^1.0.36" + get-source "^2.0.12" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -11078,7 +12810,12 @@ stdin-discarder@^0.1.0: dependencies: bl "^5.0.0" -stream-shift@^1.0.2: +stoppable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" + integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== + +stream-shift@^1.0.0, stream-shift@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== @@ -11105,6 +12842,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -11266,7 +13008,7 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-to-object@^0.4.0: +style-to-object@^0.4.0, style-to-object@^0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== @@ -11423,6 +13165,39 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + term-size@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" @@ -11463,6 +13238,14 @@ thread-stream@^0.15.1: dependencies: real-require "^0.1.0" +through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + tiny-inflate@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" @@ -11502,6 +13285,11 @@ toml@^3.0.0: resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -11544,6 +13332,11 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +tsconfck@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.3.tgz#d9bda0e87d05b1c360e996c9050473c7e6f8084f" + integrity sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA== + tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -11554,12 +13347,21 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" +tsconfig-paths@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@1.14.1, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -11748,7 +13550,7 @@ typed-array-length@^1.0.5: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.3.3: +typescript@^5.1.6, typescript@^5.3.3: version "5.4.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== @@ -11790,7 +13592,7 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@^5.8.1: +undici@^5.28.2, undici@^5.8.1: version "5.28.3" resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== @@ -11821,7 +13623,7 @@ unicode-trie@^2.0.0: pako "^0.2.5" tiny-inflate "^1.0.0" -unified@^10.1.2: +unified@^10.0.0, unified@^10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== @@ -11847,6 +13649,32 @@ unified@^11.0.0, unified@^11.0.4: trough "^2.0.0" vfile "^6.0.0" +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" @@ -11854,6 +13682,13 @@ unist-util-is@^6.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== + dependencies: + "@types/unist" "^2.0.0" + unist-util-position-from-estree@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" @@ -11861,6 +13696,13 @@ unist-util-position-from-estree@^2.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-position@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" @@ -11868,6 +13710,14 @@ unist-util-position@^5.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-remove-position@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + unist-util-remove-position@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" @@ -11890,6 +13740,14 @@ unist-util-stringify-position@^4.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" @@ -11898,6 +13756,15 @@ unist-util-visit-parents@^6.0.0: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + unist-util-visit@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" @@ -12025,6 +13892,16 @@ uuid@^9.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + v8-to-istanbul@^9.0.1: version "9.2.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" @@ -12034,7 +13911,7 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^2.0.0" -validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -12042,6 +13919,13 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + valtio@1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.11.2.tgz#b8049c02dfe65620635d23ebae9121a741bb6530" @@ -12119,9 +14003,9 @@ viem@^1.0.0, viem@^1.1.4, viem@^1.12.2: ws "8.13.0" viem@^2.7.12, viem@^2.7.14, viem@^2.7.8: - version "2.8.16" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.8.16.tgz#30370390a6f109657b57c1a01b2793c4056b4e95" - integrity sha512-J8tu1aP7TfI2HT/IEmyJ+n+WInrA/cuMuJtfgvYhYgHBobxhYGc2SojHm5lZBWcWgErN1Ld7VcKUwTmPh4ToQA== + version "2.8.18" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.8.18.tgz#ffb051bf80381ffefc98087a20c177b25463c9f4" + integrity sha512-Kq3kwkKziJ8rQeLkmdbSLheHDnA+tx2EdLKLmQ3N4FVtjKYjBP9tPL1r+fI6KltVUM1TDOhIHOdslDSp57VMMg== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0" @@ -12143,10 +14027,30 @@ vite-node@^1.2.0: picocolors "^1.0.0" vite "^5.0.0" +vite-tsconfig-paths@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" + integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + vite@^5.0.0, vite@^5.0.11, vite@^5.0.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.2.tgz#b98f8de352d22e21d99508274ddd053ef82bf238" - integrity sha512-FWZbz0oSdLq5snUI0b6sULbz58iXFXdvkZfZWR/F0ZJuKTSPO7v72QPXt6KqYeMFb0yytNp6kZosxJ96Nr/wDQ== + version "5.2.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.3.tgz#198efc2fd4d80eac813b146a68a4b0dbde884fc2" + integrity sha512-+i1oagbvkVIhEy9TnEV+fgXsng13nZM90JQbrcPrf6DvW2mXARlz+DK7DLiDP+qeKoD1FCVx/1SpFL1CLq9Mhw== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.36" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vite@^5.1.0: + version "5.2.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.6.tgz#fc2ce309e0b4871e938cb0aca3b96c422c01f222" + integrity sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA== dependencies: esbuild "^0.20.1" postcss "^8.4.36" @@ -12383,6 +14287,24 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +workerd@1.20240320.1: + version "1.20240320.1" + resolved "https://registry.yarnpkg.com/workerd/-/workerd-1.20240320.1.tgz#f959a4805bf3bdbdf86d123482132fa30a3f34c9" + integrity sha512-nuavAGGjh0qqM6RF5zxTHyUwEqdLCHchodbrpbh/xlJpFGnJVY5C1YgSi2S9aLkJJoa0/25Ta/+EzXEbApA/3w== + optionalDependencies: + "@cloudflare/workerd-darwin-64" "1.20240320.1" + "@cloudflare/workerd-darwin-arm64" "1.20240320.1" + "@cloudflare/workerd-linux-64" "1.20240320.1" + "@cloudflare/workerd-linux-arm64" "1.20240320.1" + "@cloudflare/workerd-windows-64" "1.20240320.1" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -12428,11 +14350,16 @@ ws@8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@^7.5.1: +ws@^7.4.5, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.11.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + ws@~8.11.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" @@ -12443,7 +14370,7 @@ xmlhttprequest-ssl@~2.0.0: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== -xtend@^4.0.1: +xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -12536,6 +14463,20 @@ yoga-wasm-web@0.3.3, yoga-wasm-web@^0.3.3: resolved "https://registry.yarnpkg.com/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz#eb8e9fcb18e5e651994732f19a220cb885d932ba" integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== +youch@^3.2.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/youch/-/youch-3.3.3.tgz#50cfdf5bc395ce664a5073e31b712ff4a859d928" + integrity sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA== + dependencies: + cookie "^0.5.0" + mustache "^4.2.0" + stacktracey "^2.1.8" + +zod@^3.20.6: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + zustand@4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0"