diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index ea4a33f2..27cc6f60 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -78,4 +78,23 @@ jobs: env: FLEEK_TOKEN: ${{ secrets.FLEEK_TOKEN }} FLEEK_PROJECT_ID: cm2lvm8yh000030bm17kmomq9 - run: pnpm --dir apps/docs deploy:fleek \ No newline at end of file + run: pnpm --dir apps/docs deploy:fleek + + deploy-registry: + # if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js and pnpm + uses: ./.github/actions/setup-node-pnpm + + - name: Build registry + run: pnpm --filter @geist/registry build + + - name: Deploy registry + env: + FLEEK_TOKEN: ${{ secrets.FLEEK_TOKEN }} + FLEEK_PROJECT_ID: cm2lvm8yh000030bm17kmomq9 + run: pnpm --dir apps/registry deploy:fleek \ No newline at end of file diff --git a/.gitignore b/.gitignore index 36fac964..fd537953 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ apps/storybook/storybook-static/** .astro/ + + +apps/registry/public/r/ diff --git a/apps/registry/fleek.config.json b/apps/registry/fleek.config.json new file mode 100644 index 00000000..308b2dce --- /dev/null +++ b/apps/registry/fleek.config.json @@ -0,0 +1,8 @@ +{ + "sites": [ + { + "slug": "geist-ddev-kit-registry", + "distDir": "public/r" + } + ] +} diff --git a/apps/registry/package.json b/apps/registry/package.json new file mode 100644 index 00000000..9ce545f1 --- /dev/null +++ b/apps/registry/package.json @@ -0,0 +1,32 @@ +{ + "name": "@geist/registry", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts", + "./*.fixture": ["./src/*.fixture.ts"], + "./*": ["./src/*", "./src/*.tsx", "./src/*.ts"] + }, + "imports": { + "#*": ["./src/*", "./src/*.tsx"] + }, + "scripts": { + "build": "tsx src/build.mts", + "test": "vitest", + "serve": "http-server public/r -p 3000", + "deploy:fleek": "fleek --debug sites deploy" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "shadcn": "2.4.0-canary.6", + "tsx": "4.19.2", + "vitest": "^2.1.8", + "http-server": "14.1.1", + "@fleek-platform/cli": "^3.8.2" + }, + "dependencies": { + "ts-morph": "^24.0.0", + "pathe": "^2.0.3" + } +} diff --git a/apps/registry/registry.json b/apps/registry/registry.json new file mode 100644 index 00000000..ffb9a42e --- /dev/null +++ b/apps/registry/registry.json @@ -0,0 +1,334 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "shadcn", + "homepage": "https://ui.shadcn.com", + "items": [ + { + "title": "components/account/balance", + "description": "", + "author": "geist", + "name": "components/account/balance", + "type": "registry:component", + "files": [ + { + "path": "registry/components/account/balance.tsx", + "type": "registry:component" + }, + { + "path": "registry/lib/domain/amount.ts", + "type": "registry:lib" + }, + { + "path": "registry/components/token/token.tsx", + "type": "registry:component" + }, + { + "path": "registry/lib/token/config.ts", + "type": "registry:lib" + } + ], + "registryDependencies": [], + "dependencies": ["@radix-ui/themes", "viem", "wagmi"] + }, + { + "title": "components/attestations/attestation-badge", + "description": "", + "author": "geist", + "name": "components/attestations/attestation-badge", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/attestation-badge.tsx", + "type": "registry:component" + }, + { + "path": "registry/hooks/eas/use-get-attestations.ts", + "type": "registry:hook" + } + ], + "registryDependencies": ["badge"], + "dependencies": ["viem", "wagmi"] + }, + { + "title": "components/attestations/attestation-card", + "description": "", + "author": "geist", + "name": "components/attestations/attestation-card", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/attestation-card.tsx", + "type": "registry:component" + }, + { + "path": "registry/hooks/eas/use-get-attestation-with-uid.ts", + "type": "registry:hook" + }, + { + "path": "registry/lib/utils/hex.ts", + "type": "registry:lib" + }, + { + "path": "registry/components/attestations/attestation-schema-badge.tsx", + "type": "registry:component" + }, + { + "path": "registry/components/attestations/attestations.tsx", + "type": "registry:component" + } + ], + "registryDependencies": ["card", "separator", "skeleton"], + "dependencies": [ + "@radix-ui/react-label", + "date-fns", + "react", + "viem", + "wagmi" + ] + }, + { + "title": "components/attestations/attestation-form", + "description": "", + "author": "geist", + "name": "components/attestations/attestation-form", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/attestation-form.tsx", + "type": "registry:component" + }, + { + "path": "registry/lib/eas/easscan.ts", + "type": "registry:lib" + }, + { + "path": "registry/lib/utils/hex.ts", + "type": "registry:lib" + }, + { + "path": "registry/components/attestations/attestation-schema-badge.tsx", + "type": "registry:component" + } + ], + "registryDependencies": [ + "button", + "card", + "form", + "input", + "toast", + "use-toast" + ], + "dependencies": ["@hookform/resolvers", "react-hook-form", "viem", "zod"] + }, + { + "title": "components/attestations/attestation-schema-badge", + "description": "", + "author": "geist", + "name": "components/attestations/attestation-schema-badge", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/attestation-schema-badge.tsx", + "type": "registry:component" + }, + { + "path": "registry/lib/eas/easscan.ts", + "type": "registry:lib" + } + ], + "registryDependencies": ["badge"], + "dependencies": [] + }, + { + "title": "components/attestations/attestations-table", + "description": "", + "author": "geist", + "name": "components/attestations/attestations-table", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/attestations-table.tsx", + "type": "registry:component" + }, + { + "path": "registry/components/data-table.tsx", + "type": "registry:component" + }, + { + "path": "registry/hooks/eas/use-get-attestations.ts", + "type": "registry:hook" + }, + { + "path": "registry/lib/eas/easscan.ts", + "type": "registry:lib" + }, + { + "path": "registry/lib/utils/hex.ts", + "type": "registry:lib" + }, + { + "path": "registry/components/attestations/attestation-schema-badge.tsx", + "type": "registry:component" + }, + { + "path": "registry/components/attestations/attestations.tsx", + "type": "registry:component" + }, + { + "path": "registry/components/attestations/attestations.tsx", + "type": "registry:component" + } + ], + "registryDependencies": [], + "dependencies": ["@tanstack/react-table", "react", "viem", "wagmi"] + }, + { + "title": "components/attestations/attestations", + "description": "", + "author": "geist", + "name": "components/attestations/attestations", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/attestations.tsx", + "type": "registry:component" + }, + { + "path": "registry/hooks/eas/use-get-attestations.ts", + "type": "registry:hook" + } + ], + "registryDependencies": [], + "dependencies": ["date-fns", "viem"] + }, + { + "title": "components/attestations/upload-attestation", + "description": "", + "author": "geist", + "name": "components/attestations/upload-attestation", + "type": "registry:component", + "files": [ + { + "path": "registry/components/attestations/upload-attestation.tsx", + "type": "registry:component" + }, + { + "path": "registry/lib/domain/config.ts", + "type": "registry:lib" + }, + { + "path": "registry/hooks/eas/use-upload-attestation.ts", + "type": "registry:hook" + }, + { + "path": "registry/components/attestations/attestations.tsx", + "type": "registry:component" + } + ], + "registryDependencies": ["button"], + "dependencies": ["lucide-react"] + }, + { + "title": "components/data-table", + "description": "", + "author": "geist", + "name": "components/data-table", + "type": "registry:component", + "files": [ + { + "path": "registry/components/data-table.tsx", + "type": "registry:component" + } + ], + "registryDependencies": ["button", "table"], + "dependencies": ["@tanstack/react-table", "react"] + }, + { + "title": "components/file/file-input-field", + "description": "", + "author": "geist", + "name": "components/file/file-input-field", + "type": "registry:component", + "files": [ + { + "path": "registry/components/file/file-input-field.tsx", + "type": "registry:component" + } + ], + "registryDependencies": ["input"], + "dependencies": ["react-hook-form"] + }, + { + "title": "address-badge", + "description": "AddressBadge component to display an address with a copy button.", + "author": "geist", + "name": "components/identity/address-badge", + "type": "registry:component", + "files": [ + { + "path": "registry/components/identity/address-badge.tsx", + "type": "registry:component" + }, + { + "path": "registry/lib/utils/address.ts", + "type": "registry:lib" + } + ], + "registryDependencies": ["tooltip"], + "dependencies": ["lucide-react", "react", "viem", "wagmi"] + }, + { + "title": "components/identity/avatar-wagmi", + "description": "", + "author": "geist", + "name": "components/identity/avatar-wagmi", + "type": "registry:component", + "files": [ + { + "path": "registry/components/identity/avatar-wagmi.tsx", + "type": "registry:component" + }, + { + "path": "registry/components/identity/avatar.tsx", + "type": "registry:component" + } + ], + "registryDependencies": ["avatar", "skeleton"], + "dependencies": ["viem", "wagmi"] + }, + { + "title": "components/identity/avatar", + "description": "", + "author": "geist", + "name": "components/identity/avatar", + "type": "registry:component", + "files": [ + { + "path": "registry/components/identity/avatar.tsx", + "type": "registry:component" + }, + { + "path": "registry/hooks/identity/use-identity.ts", + "type": "registry:hook" + } + ], + "registryDependencies": ["avatar", "skeleton"], + "dependencies": [] + }, + { + "title": "components/identity/index", + "description": "", + "author": "geist", + "name": "components/identity/index", + "type": "registry:component", + "files": [ + { + "path": "registry/components/identity/index.ts", + "type": "registry:component" + } + ], + "registryDependencies": [], + "dependencies": [] + } + ] +} diff --git a/apps/registry/src/build.mts b/apps/registry/src/build.mts new file mode 100644 index 00000000..418ae87e --- /dev/null +++ b/apps/registry/src/build.mts @@ -0,0 +1,141 @@ +/** + * 1. Clone all packages into working area + * 2. iterate codebase and pre-process, rewrite paths + * 3. generate registry.json + * 4. use shadcn build to build the registry + * + * Note: shadcn do not export as ESM the build Command + */ + +import { execSync } from "node:child_process"; +import { Project, ScriptKind, SyntaxKind } from "ts-morph"; + +import { + cpSync, + existsSync, + mkdirSync, + mkdtempSync, + readFileSync, + readdirSync, + writeFileSync, +} from "node:fs"; +import { tmpdir } from "node:os"; +import path, { + relative, + join, + basename, + dirname, + resolve, + matchesGlob, +} from "node:path"; +import process from "node:process"; +import { parseItem } from "./parser"; + +console.log("Building shadcn done"); + +console.log("rewrite paths"); + +const project = new Project({ + compilerOptions: {}, +}); + +const createWorkingArea = async () => { + const dest = await mkdtempSync(join(tmpdir(), "geist-registry-")); + console.log("working area", dest); + + await cpSync( + join(import.meta.dirname, "../../../packages/ui-react/src"), + join(dest, "registry"), + { recursive: true }, + ); + + await cpSync( + join(import.meta.dirname, "../../../packages/domain/src"), + join(dest, "registry/lib/domain"), + { recursive: true }, + ); + + return dest; +}; + +const registryJsonPath = resolve(import.meta.dirname, "../registry.json"); + +console.log("creating working area"); +const sourceRootPath = await createWorkingArea(); + +// shim for nodev <22 +async function getFiles(dir: string): Promise { + let files: string[] = []; + const entries = await readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = join(dir, entry.name); + if (entry.isDirectory()) { + files = files.concat(await getFiles(fullPath)); + } else if ( + entry.isFile() && + matchesGlob(fullPath, "**/*.{ts,tsx}") && + !matchesGlob(fullPath, "**/*.{test,fixture}.*") && + !matchesGlob(fullPath, "**/shadcn/*") + ) { + files.push(fullPath); + } + } + return files; +} + +export const ensureDirectoriesExist = async (paths: string[]) => { + const uniqueDirs = new Set(paths.map((path) => dirname(path))); + + await Promise.all( + Array.from(uniqueDirs).map((dir) => mkdirSync(dir, { recursive: true })), + ); +}; + +const context = { + sourceRootPath, + registryLocalPath: join(import.meta.dirname, "../public/r"), + registryUrl: process.env.REGISTRY_URL || "https://example.com/r/", +}; + +console.log("Build Context", context); + +const files = await getFiles(context.sourceRootPath); + +const registryPaths = files.map((file) => + join( + context.registryLocalPath, + relative(context.sourceRootPath, file).replace("registry/", ""), + ), +); + +console.log("registryPaths", registryPaths); + +const registryTree = { + $schema: "https://ui.shadcn.com/schema/registry.json", + name: "shadcn", + homepage: "https://ui.shadcn.com", + items: [], +}; + +for (const file of files.slice(0, 14)) { + const { registryItem, sourceFile } = await parseItem(file, context, project); + registryTree.items.push(registryItem); + await sourceFile.save(); +} +writeFileSync(registryJsonPath, JSON.stringify(registryTree, null, 2)); + +// we create nested path for components by hacking `name` field, which shadcn wont pre-create the folders by default +console.log("pre-created registry folders"); + +await ensureDirectoriesExist(registryPaths); + +console.log("Building shadcn"); + +const command = ` +shadcn build -c ${context.sourceRootPath} ${registryJsonPath} -o ${context.registryLocalPath} +`; + +await execSync(command, { + // cwd: '', + stdio: "inherit", +}); diff --git a/apps/registry/src/parser.test.ts b/apps/registry/src/parser.test.ts new file mode 100644 index 00000000..abca185e --- /dev/null +++ b/apps/registry/src/parser.test.ts @@ -0,0 +1,74 @@ +import { describe, expect, it } from "vitest"; +import { getPackageName, parseImportPath } from "./parser"; + +describe("getPackageName", () => { + it("returns package name for valid scoped module specifier", () => { + // For example "@babel/core" should return "@babel/core" + expect(getPackageName("@babel/core")).toBe("@babel/core"); + }); + + it("returns package name for non-scoped ", () => { + // For example "lodash" does not start with "@", so it should return null. + expect(getPackageName("viem/ens")).toBe("viem"); + }); + + it("returns correct package name when there are extra segments", () => { + // Ensure it uses the first two segments only. + expect(getPackageName("@scope/pkg/extra")).toBe("@scope/pkg"); + }); +}); + +const context = { + sourceRootPath: "src", + registryUrl: "https://example.com/r/", + filePath: "", +}; + +describe("parseImportPath", () => { + it("returns parsed package from ESM", () => { + const { packageName } = parseImportPath("@zod/a/b", context); + expect(packageName).toBe("@zod/a"); + }); + it("returns lib for internal package", () => { + const { packageName, registryPath } = parseImportPath( + "@geist/domain/config", + context, + ); + expect(packageName).toBe(undefined); + expect(registryPath).toBe("registry/lib/domain/config"); + }); + it("returns parsed package from ESM non namespace", () => { + const { packageName } = parseImportPath("viem/ens", context); + expect(packageName).toBe("viem"); + }); + it("returns registry path from relative", () => { + const { packageName, registryPath } = parseImportPath("./c", { + ...context, + // filePath not include src/ + filePath: "a/b/d.tsx", + }); + expect(packageName).toBe(undefined); + expect(registryPath).toBe("a/b/c"); + }); + + it("returns registry dependency from shadcn components", () => { + const { packageName, shadcnPackage, registryPath } = parseImportPath( + "#components/shadcn/tooltip", + { + ...context, + filePath: "src/a/b/d.tsx", + }, + ); + expect(packageName).toBe(undefined); + expect(shadcnPackage).toBe("tooltip"); + expect(registryPath).toBe("registry/components/tooltip"); + }); + it("returns registry path from alias", () => { + const { packageName, registryPath } = parseImportPath("#lib/d/c.ts", { + ...context, + filePath: "src/a/b/d.tsx", + }); + expect(packageName).toBe(undefined); + expect(registryPath).toBe("registry/lib/d/c.ts"); + }); +}); diff --git a/apps/registry/src/parser.ts b/apps/registry/src/parser.ts new file mode 100644 index 00000000..76c85d9f --- /dev/null +++ b/apps/registry/src/parser.ts @@ -0,0 +1,225 @@ +// shadcn do not export as ESM the build command + +import { type Project, ScriptKind, type SourceFile } from "ts-morph"; + +import { mkdtempSync, readFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join, relative } from "node:path"; + +export const createTempSourceFile = async (filename: string) => { + const dir = await mkdtempSync(join(tmpdir(), "shadcn-")); + return join(dir, filename); +}; + +type Context = { + sourceRootPath: string; + registryUrl: string; +}; + +export const parseType = (folder?: string, input?: string) => { + if (folder === "lib") { + return { + type: "registry:lib", + ext: "ts", + }; + } else if (folder === "hooks") { + return { + type: "registry:hook", + ext: "ts", + }; + } + + return { + type: "registry:component", + ext: "tsx", + }; +}; + +const matchPath = (pathInput: string) => { + return pathInput.match( + /([?:\.\/|#])*(components|lib|hooks)\/(shadcn\/)*(.*)$/, + ); +}; + +/** + * derive registry name and names of files + * + * @param pathInput + * @param context + * @returns + */ +export const parseImportPath = ( + pathInput: string, + context: Context & { + filePath: string; + }, +) => { + if (pathInput.startsWith("@geist")) { + // internal package + pathInput = pathInput.replace("@geist/domain", "#lib/domain"); + } + + const pathRootMatch = matchPath(pathInput); + const { sourceRootPath, filePath, registryUrl } = context; + + let packageName; + let registryPath = pathInput; + let shadcnPackage; + + if (pathInput.startsWith("./")) { + registryPath = join(dirname(filePath), pathInput); + } else if (pathRootMatch?.[1] === "#") { + registryPath = pathInput.replace("#", "registry/"); + } else { + packageName = getPackageName(pathInput); + } + + if (pathRootMatch?.[3]) { + shadcnPackage = pathRootMatch[4]; + } + + if (pathRootMatch?.[0]) { + registryPath = `registry/${pathRootMatch[2]}/${pathRootMatch[4]}`; + } + + // re-match for relative path + + const { type, ext } = parseType(matchPath(registryPath)?.[2], pathInput); + return { packageName, shadcnPackage, type, registryPath, ext }; +}; + +export const getPackageName = (moduleSpecifier: string): string | null => { + const parts = moduleSpecifier.split("/"); + + if (moduleSpecifier.startsWith("@")) { + return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : moduleSpecifier; + } + + return `${parts[0]}`; +}; + +// normalize +export const createRegisterDependencyPath = ( + context: Context, + name: string, +) => { + return context.registryUrl + name + ".json"; +}; + +export const parseComments = async (sourceFile: SourceFile) => { + // use comments from default export + const comments = sourceFile + .getExportAssignments()?.[0] + ?.getLeadingCommentRanges(); + + if (comments?.length > 0) { + const comment = comments.pop(); + const commentBlock = comment?.getText() || ""; + + // Extract from the comment block top of file + const title = commentBlock.match(/@title:\s*(.*)/)?.[1]; + const description = commentBlock.match(/@description:\s*(.*)/)?.[1]; + + return { + title, + description, + }; + } + return {}; +}; + +export const parseItem = async ( + file: string, + context: Context, + project: Project, +) => { + console.log("parseItem:", file); + const { sourceRootPath, registryUrl } = context; + + const pathRootMatch = matchPath(file); + const { type, ext } = parseType(pathRootMatch?.[2]); + + const registryItemMetadata = { + title: "", + description: "", + target: "", + dependencies: new Set(), + registryDependencies: new Set(), + } as any; + + const registryFilePath = relative(sourceRootPath, file); + + const name = registryFilePath + .replace(/\.[^/.]+$/, "") + .replace("registry/", ""); + + const content = readFileSync(file, "utf-8"); + + const sourceFile = project.createSourceFile(file, content, { + scriptKind: ScriptKind.TSX, + overwrite: true, + }); + + const { title, description = "" } = await parseComments(sourceFile); + + const files = [] as { + path: string; + type: string; + }[]; + + const registryPath = relative(sourceRootPath, file); + + files.push({ + path: registryPath, + type, + }); + + for (const node of sourceFile.getImportDeclarations()) { + const currentImport = node.getModuleSpecifier().getLiteralValue(); + const { + packageName, + registryPath, + shadcnPackage, + type: itemType, + ext, + } = parseImportPath(currentImport, { + ...context, + filePath: registryFilePath, + }); + + if (shadcnPackage) { + registryItemMetadata.registryDependencies.add(shadcnPackage); + } else if (packageName) { + registryItemMetadata.dependencies.add(packageName); + } else { + // Note we workaround https://github.com/shadcn-ui/ui/issues/6678 by avoiding @/registry for non components + const importPath = + itemType === "registry:component" + ? registryPath.replace("registry/", "@/registry/") + : registryPath.replace("registry/", "@/"); + + console.log("import:", currentImport, "->", importPath); + + node.getModuleSpecifier().replaceWithText(`"${importPath}"`); + files.push({ + path: registryPath + "." + ext, + type: itemType, + }); + } + } + + registryItemMetadata.registryFilePath = registryFilePath; + + const registryItem = { + title: title || name || "", + description: description || "", + author: "geist", + name, + type, + files, + registryDependencies: Array.from(registryItemMetadata.registryDependencies), + dependencies: Array.from(registryItemMetadata.dependencies), + }; + + return { registryItem, sourceFile }; +}; diff --git a/package.json b/package.json index 8248a069..96e1edb7 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@testing-library/react": "^16.0.1", "@vitejs/plugin-react": "^4.3.2", "vite": "^5.4.1", - "vitest": "^2.1.8" + "vitest": "^2.1.8", + "tsx": "^4.1.4" } } diff --git a/packages/ui-react/package.json b/packages/ui-react/package.json index fb2df3e1..f5b4caa2 100644 --- a/packages/ui-react/package.json +++ b/packages/ui-react/package.json @@ -49,11 +49,10 @@ "@ipld/dag-ucan": "^3.4.0", "@lighthouse-web3/kavach": "^0.1.9", "@lighthouse-web3/sdk": "^0.3.7", + "@nanostores/react": "0.8.4", "@noble/ed25519": "2.1.0", "@noble/hashes": "^1.6.1", "@noble/secp256k1": "^2.1.0", - "nanostores": "0.11.3", - "@nanostores/react": "0.8.4", "@openzeppelin/merkle-tree": "^1.0.7", "@privy-io/react-auth": "^1.95.2", "@radix-ui/colors": "^3.0.0", @@ -114,10 +113,12 @@ "jsdom": "^25.0.1", "ky": "^1.7.2", "lodash": "^4.17.21", + "lodash.template": "^4.5.0", "lucide-react": "^0.446.0", "micro-eth-signer": "^0.12.0", "micro-packed": "^0.6.3", "multiformats": "^13.3.0", + "nanostores": "0.11.3", "postcss": "^8.4.24", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -125,10 +126,12 @@ "react-hook-form": "^7.53.0", "recharts": "^2.15.0", "sha256": "link:@noble/hashes/sha256", + "shadcn": "2.4.0-canary.6", "stream-browserify": "^3.0.0", "tailwind-merge": "^2.5.2", "tailwindcss": "^3.4.13", "tailwindcss-animate": "^1.0.7", + "ts-morph": "^24.0.0", "viem": "2.x", "wagmi": "^2.12.16", "zod": "^3.23.8" diff --git a/packages/ui-react/src/components/attestations/attestation-card.tsx b/packages/ui-react/src/components/attestations/attestation-card.tsx index 85ef17c9..fa44ccd2 100644 --- a/packages/ui-react/src/components/attestations/attestation-card.tsx +++ b/packages/ui-react/src/components/attestations/attestation-card.tsx @@ -14,7 +14,7 @@ import { } from "#components/shadcn/card"; import { Separator } from "#components/shadcn/separator"; import { Skeleton } from "#components/shadcn/skeleton"; -import { useGetAttestationWithUid } from "#hooks/eas/use-get-attestation-with-uid.js"; +import { useGetAttestationWithUid } from "#hooks/eas/use-get-attestation-with-uid"; import { getShortHex } from "#lib/utils/hex"; import { AttestationSchemaBadge } from "./attestation-schema-badge"; import { type AttestationMeta, asAttestationMeta } from "./attestations"; diff --git a/packages/ui-react/src/components/attestations/attestations.ts b/packages/ui-react/src/components/attestations/attestations.tsx similarity index 100% rename from packages/ui-react/src/components/attestations/attestations.ts rename to packages/ui-react/src/components/attestations/attestations.tsx diff --git a/packages/ui-react/src/components/identity/address-badge.test.tsx b/packages/ui-react/src/components/identity/address-badge.test.tsx index 46ebeba5..26684aa7 100644 --- a/packages/ui-react/src/components/identity/address-badge.test.tsx +++ b/packages/ui-react/src/components/identity/address-badge.test.tsx @@ -1,6 +1,6 @@ -import { AddressBadge } from "@geist/ui-react/components/identity/address-badge"; import { act, fireEvent, render, screen } from "@testing-library/react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { AddressBadge } from "#components/identity/address-badge"; vi.mock(import("viem"), async (importOriginal) => { const actual = await importOriginal(); diff --git a/packages/ui-react/src/components/identity/address-badge.tsx b/packages/ui-react/src/components/identity/address-badge.tsx index f435ccf8..5a8e9a69 100644 --- a/packages/ui-react/src/components/identity/address-badge.tsx +++ b/packages/ui-react/src/components/identity/address-badge.tsx @@ -64,3 +64,9 @@ export const AddressBadgeFromName = ({ name }: { name: string }) => { return ; }; + +/** + * @title: address-badge + * @description: AddressBadge component to display an address with a copy button. + */ +export default AddressBadge; diff --git a/packages/ui-react/src/components/token/token-chip-with-info.test.tsx b/packages/ui-react/src/components/token/token-chip-with-info.test.tsx index 40f82f26..a0af97fc 100644 --- a/packages/ui-react/src/components/token/token-chip-with-info.test.tsx +++ b/packages/ui-react/src/components/token/token-chip-with-info.test.tsx @@ -1,9 +1,9 @@ +import { render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; import { TokenChipWithInfo, type TokenChipWithInfoProps, -} from "@geist/ui-react/components/token/token-chip-with-info"; -import { render, screen } from "@testing-library/react"; -import { describe, expect, it, vi } from "vitest"; +} from "#components/token/token-chip-with-info"; vi.mock("@/components/ui/button", () => ({ Button: ({ diff --git a/packages/ui-react/src/components/token/token.ts b/packages/ui-react/src/components/token/token.tsx similarity index 97% rename from packages/ui-react/src/components/token/token.ts rename to packages/ui-react/src/components/token/token.tsx index 9caccabd..71b68420 100644 --- a/packages/ui-react/src/components/token/token.ts +++ b/packages/ui-react/src/components/token/token.tsx @@ -57,10 +57,11 @@ export const getTrustWalletIconUrl = (chain: Chain, address?: Address) => { return `${ROOT}/${twChainName}/assets/${getAddress(address)}/logo.png`; }; -const chunk = (arr: T[], size: number): T[][] => - Array.from({ length: Math.ceil(arr.length / size) }, (_, i) => +function chunk(arr: T[], size: number): T[][] { + return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) => arr.slice(i * size, i * size + size), ); +} export const fetchTokenInfoBulkAction = (config: Config, chainId: number) => async (tokens: TokenSelector[]) => { diff --git a/packages/ui-react/src/hooks/eas/sdk/use-attestation.ts b/packages/ui-react/src/hooks/eas/sdk/use-attestation.ts index c6dd5b8c..ccb49cac 100644 --- a/packages/ui-react/src/hooks/eas/sdk/use-attestation.ts +++ b/packages/ui-react/src/hooks/eas/sdk/use-attestation.ts @@ -1,6 +1,4 @@ import { SchemaEncoder } from "@ethereum-attestation-service/eas-sdk"; -import { NO_EXPIRATION } from "@geist/ui-react/lib/eas/request"; -import type { AttestationRequestData } from "@geist/ui-react/lib/eas/viem/onchain"; import { type Signer, ZeroHash } from "ethers"; import { useMemo } from "react"; import { @@ -13,7 +11,9 @@ import { zeroHash, } from "viem"; import { EAS_CONTRACT_ADDRESS } from "#lib/eas/abi"; +import { NO_EXPIRATION } from "#lib/eas/request"; import { createAttestationOnchain, createEAS } from "#lib/eas/sdk/eas"; +import type { AttestationRequestData } from "#lib/eas/viem/onchain"; export type UseAttestationEasSdkParams = { signer: Signer; diff --git a/packages/ui-react/src/hooks/eas/use-attestation.ts b/packages/ui-react/src/hooks/eas/use-attestation.ts index 1d2b8528..2e196bf8 100644 --- a/packages/ui-react/src/hooks/eas/use-attestation.ts +++ b/packages/ui-react/src/hooks/eas/use-attestation.ts @@ -1,11 +1,3 @@ -import { NO_EXPIRATION } from "@geist/ui-react/lib/eas/request"; -import { OffchainAttestationVersion } from "@geist/ui-react/lib/eas/sdk/offchain/offchain"; -import { signOffchainAttestation } from "@geist/ui-react/lib/eas/viem/offchain"; -import { - type AttestationRequestData, - makeOnchainAttestation, -} from "@geist/ui-react/lib/eas/viem/onchain"; -import { createTestClientConfig } from "@geist/ui-react/lib/test-utils-isomorphic"; import { useMemo } from "react"; import { type Account, @@ -17,7 +9,15 @@ import { stringToHex, zeroHash, } from "viem"; +import { NO_EXPIRATION } from "#lib/eas/request"; import { SchemaEncoder } from "#lib/eas/schema-encoder"; +import { OffchainAttestationVersion } from "#lib/eas/sdk/offchain/offchain"; +import { signOffchainAttestation } from "#lib/eas/viem/offchain"; +import { + type AttestationRequestData, + makeOnchainAttestation, +} from "#lib/eas/viem/onchain"; +import { createTestClientConfig } from "#lib/test-utils-isomorphic"; export type UseAttestationParams = { account: Account; diff --git a/packages/ui-react/src/hooks/eas/use-get-attestation-with-uid.tsx b/packages/ui-react/src/hooks/eas/use-get-attestation-with-uid.ts similarity index 100% rename from packages/ui-react/src/hooks/eas/use-get-attestation-with-uid.tsx rename to packages/ui-react/src/hooks/eas/use-get-attestation-with-uid.ts diff --git a/packages/ui-react/src/hooks/eas/use-get-attestations.int.test.tsx b/packages/ui-react/src/hooks/eas/use-get-attestations.int.test.tsx index 5331648a..71df2a9f 100644 --- a/packages/ui-react/src/hooks/eas/use-get-attestations.int.test.tsx +++ b/packages/ui-react/src/hooks/eas/use-get-attestations.int.test.tsx @@ -2,7 +2,7 @@ import { mainnet, optimism } from "viem/chains"; import { describe, expect, test } from "vitest"; import { useGetAttestations } from "./use-get-attestations"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { QueryClient, type QueryClientProvider } from "@tanstack/react-query"; import { renderHook, waitFor } from "@testing-library/react"; import type React from "react"; import type { Address } from "viem"; diff --git a/packages/ui-react/src/hooks/ens/use-efp-api.int.test.tsx b/packages/ui-react/src/hooks/ens/use-efp-api.int.test.tsx index 3fc21974..4d8fb5d2 100644 --- a/packages/ui-react/src/hooks/ens/use-efp-api.int.test.tsx +++ b/packages/ui-react/src/hooks/ens/use-efp-api.int.test.tsx @@ -9,7 +9,7 @@ import { } from "./use-efp-api"; import { BY_USER } from "@geist/domain/user.fixture"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { QueryClient, type QueryClientProvider } from "@tanstack/react-query"; import { renderHook, waitFor } from "@testing-library/react"; import type React from "react"; diff --git a/packages/ui-react/src/hooks/ens/use-efp-api.ts b/packages/ui-react/src/hooks/ens/use-efp-api.ts index 50002327..2d5ad4a5 100644 --- a/packages/ui-react/src/hooks/ens/use-efp-api.ts +++ b/packages/ui-react/src/hooks/ens/use-efp-api.ts @@ -1,5 +1,4 @@ import { useQuery } from "@tanstack/react-query"; -import type { Address } from "viem"; import type { AddressOrEns, EfpApiOptions, diff --git a/packages/ui-react/src/lib/eas/sdk/offchain/offchain-utils.ts b/packages/ui-react/src/lib/eas/sdk/offchain/offchain-utils.ts index 270e7c03..e3706bb3 100644 --- a/packages/ui-react/src/lib/eas/sdk/offchain/offchain-utils.ts +++ b/packages/ui-react/src/lib/eas/sdk/offchain/offchain-utils.ts @@ -5,7 +5,6 @@ import { OffchainAttestationVersion, } from "@ethereum-attestation-service/eas-sdk"; import { stringifyWithBigInt } from "@geist/domain/util"; -import { ZERO_ADDRESS } from "@geist/ui-react/lib/constants"; import { base64 } from "@scure/base"; import { zlibSync } from "fflate"; import { @@ -18,6 +17,7 @@ import { stringToHex, zeroHash, } from "viem"; +import { ZERO_ADDRESS } from "#lib/constants"; import { OFFCHAIN_ATTESTATION_TYPES } from "./offchain"; /** diff --git a/packages/ui-react/src/lib/eas/sdk/offchain/offchain.ts b/packages/ui-react/src/lib/eas/sdk/offchain/offchain.ts index 3d6a0172..f4f5521b 100644 --- a/packages/ui-react/src/lib/eas/sdk/offchain/offchain.ts +++ b/packages/ui-react/src/lib/eas/sdk/offchain/offchain.ts @@ -4,8 +4,8 @@ import type { OffchainAttestationType, SignedOffchainAttestation, } from "@ethereum-attestation-service/eas-sdk"; -import { ZERO_ADDRESS } from "@geist/ui-react/lib/constants"; import { type Address, verifyMessage, verifyTypedData } from "viem"; +import { ZERO_ADDRESS } from "#lib/constants"; import { getOffchainUID } from "#lib/eas/sdk/offchain/offchain-utils"; import { isDeepEqual } from "#lib/shadcn/utils"; import { diff --git a/packages/ui-react/src/lib/eas/viem/onchain.e2e.test.ts b/packages/ui-react/src/lib/eas/viem/onchain.e2e.test.ts index e85b48ae..3745ecfb 100644 --- a/packages/ui-react/src/lib/eas/viem/onchain.e2e.test.ts +++ b/packages/ui-react/src/lib/eas/viem/onchain.e2e.test.ts @@ -1,17 +1,17 @@ import { EAS, NO_EXPIRATION } from "@ethereum-attestation-service/eas-sdk"; import config from "@geist/domain/config"; -import { SignatureType } from "@geist/ui-react/lib/eas/request"; -import { - createTestClientConfig, - createTestEthersSigner, -} from "@geist/ui-react/lib/test-utils-isomorphic"; import { http, type Hex, createWalletClient, zeroHash } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { sepolia } from "viem/chains"; import { beforeEach, describe, expect, it, test } from "vitest"; import { SCHEMA_FIXTURE_IS_A_FRIEND } from "#lib/eas/attest.fixture"; +import { SignatureType } from "#lib/eas/request"; import { createEAS } from "#lib/eas/sdk/eas"; import { makeOnchainAttestation, revoke } from "#lib/eas/viem/onchain"; +import { + createTestClientConfig, + createTestEthersSigner, +} from "#lib/test-utils-isomorphic"; const chain = sepolia; export const EASContractAddress = "0xC2679fBD37d54388Ce493F1DB75320D236e1815e"; // Sepolia v0.26 diff --git a/packages/ui-react/src/lib/filecoin/akave/client.int.test.ts b/packages/ui-react/src/lib/filecoin/akave/client.int.test.ts index f2257bca..5b0d6ae5 100644 --- a/packages/ui-react/src/lib/filecoin/akave/client.int.test.ts +++ b/packages/ui-react/src/lib/filecoin/akave/client.int.test.ts @@ -1,9 +1,5 @@ import { faker } from "@faker-js/faker"; import rootConfig from "@geist/domain/config"; -import { - createTestContent, - createTestFile, -} from "@geist/ui-react/lib/test-utils-node"; import { afterAll, beforeAll, describe, expect, test } from "vitest"; import { AkaveBucket, @@ -13,6 +9,7 @@ import { uploadFileObject, uploadFileWithFormData, } from "#lib/filecoin/akave/client"; +import { createTestContent, createTestFile } from "#lib/test-utils-node"; describe( "with file", diff --git a/packages/ui-react/src/lib/filecoin/lighthouse.int.test.ts b/packages/ui-react/src/lib/filecoin/lighthouse.int.test.ts index de662948..74c438b0 100644 --- a/packages/ui-react/src/lib/filecoin/lighthouse.int.test.ts +++ b/packages/ui-react/src/lib/filecoin/lighthouse.int.test.ts @@ -11,7 +11,7 @@ import { import config from "@geist/domain/config"; import { BY_USER } from "@geist/domain/user.fixture"; -import { createTestFile } from "@geist/ui-react/lib/test-utils-node"; +import { createTestFile } from "#lib/test-utils-node"; /** * Test on mainnet */ diff --git a/packages/ui-react/tsconfig.json b/packages/ui-react/tsconfig.json index f5657640..d8a51905 100644 --- a/packages/ui-react/tsconfig.json +++ b/packages/ui-react/tsconfig.json @@ -6,7 +6,8 @@ "moduleResolution": "bundler", "paths": { "#*": ["src/*"] - } + }, + "target": "ES2022" }, "include": [ "src", diff --git a/packages/ui-react/tsconfig.scripts.json b/packages/ui-react/tsconfig.scripts.json new file mode 100644 index 00000000..d270a17d --- /dev/null +++ b/packages/ui-react/tsconfig.scripts.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "es6", + "module": "ESNext", + "moduleResolution": "node", + "esModuleInterop": true, + "isolatedModules": false + }, + "include": [".contentlayer/generated", "scripts/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f819d4e..a3ef2c40 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@vitejs/plugin-react': specifier: ^4.3.2 version: 4.3.2(vite@5.4.8(@types/node@22.10.2)(terser@5.34.1)) + tsx: + specifier: ^4.1.4 + version: 4.19.2 vite: specifier: ^5.4.1 version: 5.4.8(@types/node@22.10.2)(terser@5.34.1) @@ -88,6 +91,34 @@ importers: specifier: ^0.32.5 version: 0.32.6 + apps/registry: + dependencies: + pathe: + specifier: ^2.0.3 + version: 2.0.3 + ts-morph: + specifier: ^24.0.0 + version: 24.0.0 + devDependencies: + '@fleek-platform/cli': + specifier: ^3.8.2 + version: 3.8.2(@types/node@22.10.2)(encoding@0.1.13)(typescript@5.7.2) + '@types/node': + specifier: ^22.10.2 + version: 22.10.2 + http-server: + specifier: 14.1.1 + version: 14.1.1 + shadcn: + specifier: 2.4.0-canary.6 + version: 2.4.0-canary.6(typescript@5.7.2) + tsx: + specifier: 4.19.2 + version: 4.19.2 + vitest: + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.2)(happy-dom@15.11.6)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.34.1) + apps/storybook: dependencies: '@ethereumjs/rlp': @@ -811,6 +842,9 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.21 + lodash.template: + specifier: ^4.5.0 + version: 4.5.0 lucide-react: specifier: ^0.446.0 version: 0.446.0(react@18.3.1) @@ -847,6 +881,9 @@ importers: sha256: specifier: link:@noble/hashes/sha256 version: link:@noble/hashes/sha256 + shadcn: + specifier: 2.4.0-canary.6 + version: 2.4.0-canary.6(typescript@5.7.2) stream-browserify: specifier: ^3.0.0 version: 3.0.0 @@ -859,6 +896,9 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2))) + ts-morph: + specifier: ^24.0.0 + version: 24.0.0 viem: specifier: 2.x version: 2.21.16(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -964,6 +1004,10 @@ packages: resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} hasBin: true + '@antfu/ni@23.3.1': + resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} + hasBin: true + '@ardatan/relay-compiler@12.0.0': resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} hasBin: true @@ -5941,6 +5985,9 @@ packages: '@ts-morph/common@0.19.0': resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==} + '@ts-morph/common@0.25.0': + resolution: {integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -6135,9 +6182,6 @@ packages: '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} - '@types/node@22.7.4': - resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} - '@types/node@8.10.66': resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} @@ -7006,6 +7050,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -7501,6 +7549,9 @@ packages: code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} @@ -7690,6 +7741,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -8706,6 +8761,14 @@ packages: fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -9344,6 +9407,10 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -9379,9 +9446,18 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + http-response-object@3.0.2: resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -10240,9 +10316,11 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.ismatch@4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} @@ -10282,6 +10360,7 @@ packages: lodash.template@4.5.0: resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + deprecated: This package is deprecated. Use https://socket.dev/npm/package/eta instead. lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} @@ -11220,6 +11299,10 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -11571,6 +11654,10 @@ packages: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} + portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -12216,6 +12303,9 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -12388,6 +12478,9 @@ packages: resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} engines: {node: '>=14.0.0'} + secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -12475,6 +12568,10 @@ packages: resolution: {integrity: sha512-lVuOAnibJUFrl2KaFkO3w+9ObCFBH4aLWrs4xWd9ZHvGKVYopdGXOva9qNAo8XqdeKSOUm0Xv5CYImrV80pjkA==} hasBin: true + shadcn@2.4.0-canary.6: + resolution: {integrity: sha512-7bsqWU9j6HwAksSLbzRTsnztd6cWa3F3MHP74aLYghDjbgFhlWzSYV8DyXfXz6EKbNSZzgYIWJvlk9UZ9TzbGw==} + hasBin: true + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -13025,6 +13122,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} @@ -13132,6 +13233,9 @@ packages: ts-morph@18.0.0: resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==} + ts-morph@24.0.0: + resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} + ts-node@10.9.1: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -13355,9 +13459,6 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -13394,6 +13495,10 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + unique-names-generator@4.7.1: resolution: {integrity: sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==} engines: {node: '>=8'} @@ -13595,6 +13700,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + url@0.11.4: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} @@ -13964,6 +14072,10 @@ packages: resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} engines: {node: '>=4.0.0'} + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -14312,6 +14424,8 @@ snapshots: '@antfu/ni@0.21.12': {} + '@antfu/ni@23.3.1': {} + '@ardatan/relay-compiler@12.0.0(encoding@0.1.13)(graphql@16.9.0)': dependencies: '@babel/core': 7.25.2 @@ -15044,7 +15158,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@babel/parser@7.25.6': dependencies: @@ -16772,8 +16886,8 @@ snapshots: hast-util-to-html: 9.0.4 hast-util-to-text: 4.0.2 hastscript: 9.0.0 - postcss: 8.4.47 - postcss-nested: 6.2.0(postcss@8.4.47) + postcss: 8.5.2 + postcss-nested: 6.2.0(postcss@8.5.2) unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 @@ -17892,7 +18006,7 @@ snapshots: '@types/debug': 4.1.12 debug: 4.4.0(supports-color@8.1.1) pony-cause: 2.1.11 - semver: 7.6.3 + semver: 7.7.1 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -17906,7 +18020,7 @@ snapshots: '@types/debug': 4.1.12 debug: 4.4.0(supports-color@8.1.1) pony-cause: 2.1.11 - semver: 7.6.3 + semver: 7.7.1 uuid: 9.0.1 transitivePeerDependencies: - supports-color @@ -18328,7 +18442,7 @@ snapshots: '@privy-io/api-base@1.4.1': dependencies: - zod: 3.23.8 + zod: 3.24.2 '@privy-io/js-sdk-core@0.35.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(viem@2.21.16(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: @@ -18359,7 +18473,7 @@ snapshots: bs58: 5.0.0 ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) libphonenumber-js: 1.11.15 - zod: 3.23.8 + zod: 3.24.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -21046,7 +21160,7 @@ snapshots: '@storybook/theming': 8.3.4(storybook@8.3.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 - '@types/node': 22.7.4 + '@types/node': 22.10.2 acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) acorn-walk: 7.2.0 @@ -21168,11 +21282,17 @@ snapshots: '@ts-morph/common@0.19.0': dependencies: - fast-glob: 3.3.2 + fast-glob: 3.3.3 minimatch: 7.4.6 mkdirp: 2.1.6 path-browserify: 1.0.1 + '@ts-morph/common@0.25.0': + dependencies: + minimatch: 9.0.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.10 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -21402,10 +21522,6 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/node@22.7.4': - dependencies: - undici-types: 6.19.8 - '@types/node@8.10.66': {} '@types/parse-json@4.0.2': {} @@ -21549,7 +21665,7 @@ snapshots: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 debug: 4.4.0(supports-color@8.1.1) - fast-glob: 3.3.2 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 @@ -22359,7 +22475,7 @@ snapshots: lodash.ismatch: 4.4.0 remeda: 1.61.0 ts-toolbelt: 9.6.0 - zod: 3.23.8 + zod: 3.24.2 anser@1.4.10: {} @@ -22524,7 +22640,7 @@ snapshots: ast-types@0.16.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 astral-regex@1.0.0: {} @@ -22809,6 +22925,10 @@ snapshots: base64-js@1.5.1: {} + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + basic-ftp@5.0.5: {} bcp-47-match@2.0.3: {} @@ -23401,6 +23521,8 @@ snapshots: code-block-writer@12.0.0: {} + code-block-writer@13.0.3: {} + code-point-at@1.1.0: {} collapse-white-space@2.1.0: {} @@ -23594,6 +23716,8 @@ snapshots: core-util-is@1.0.3: {} + corser@2.0.1: {} + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 @@ -24246,7 +24370,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.23.1): dependencies: - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) esbuild: 0.23.1 transitivePeerDependencies: - supports-color @@ -24677,7 +24801,7 @@ snapshots: execa@7.2.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 4.3.1 is-stream: 3.0.0 @@ -24689,7 +24813,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -24859,6 +24983,10 @@ snapshots: transitivePeerDependencies: - encoding + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -24990,7 +25118,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 forever-agent@0.6.1: {} @@ -25225,7 +25353,7 @@ snapshots: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob: 7.2.3 ignore: 5.3.2 merge2: 1.4.1 @@ -25235,7 +25363,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -25794,6 +25922,10 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -25832,10 +25964,37 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9(debug@4.3.4) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + http-response-object@3.0.2: dependencies: '@types/node': 10.17.60 + http-server@14.1.1: + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.32 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + http-shutdown@1.2.2: {} http-signature@1.2.0: @@ -25856,7 +26015,7 @@ snapshots: https-proxy-agent@6.2.1: dependencies: agent-base: 7.1.1 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -26009,7 +26168,7 @@ snapshots: interface-datastore@6.1.1: dependencies: interface-store: 2.0.2 - nanoid: 3.3.7 + nanoid: 3.3.8 uint8arrays: 3.1.0 interface-store@2.0.2: {} @@ -28160,6 +28319,8 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + opener@1.5.2: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -28573,6 +28734,14 @@ snapshots: pony-cause@2.1.11: {} + portfinder@1.0.32: + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.4.47): @@ -28600,6 +28769,11 @@ snapshots: postcss: 8.4.47 postcss-selector-parser: 6.1.2 + postcss-nested@6.2.0(postcss@8.5.2): + dependencies: + postcss: 8.5.2 + postcss-selector-parser: 6.1.2 + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 @@ -29172,7 +29346,7 @@ snapshots: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.7.0 + tslib: 2.8.1 receptacle@1.3.2: dependencies: @@ -29452,6 +29626,8 @@ snapshots: require-main-filename@2.0.0: {} + requires-port@1.0.0: {} + resolve-from@3.0.0: {} resolve-from@4.0.0: {} @@ -29676,6 +29852,8 @@ snapshots: node-addon-api: 5.1.0 node-gyp-build: 4.8.2 + secure-compare@3.0.1: {} + secure-json-parse@2.7.0: {} secure-password-utilities@0.2.1: {} @@ -29800,6 +29978,34 @@ snapshots: - supports-color - typescript + shadcn@2.4.0-canary.6(typescript@5.7.2): + dependencies: + '@antfu/ni': 23.3.1 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.7.2) + deepmerge: 4.3.1 + diff: 5.2.0 + execa: 7.2.0 + fast-glob: 3.3.3 + fs-extra: 11.2.0 + https-proxy-agent: 6.2.1 + kleur: 4.1.5 + node-fetch: 3.3.2 + ora: 6.3.1 + postcss: 8.5.2 + prompts: 2.4.2 + recast: 0.23.9 + stringify-object: 5.0.0 + ts-morph: 18.0.0 + tsconfig-paths: 4.2.0 + zod: 3.24.2 + transitivePeerDependencies: + - supports-color + - typescript + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -30486,6 +30692,11 @@ snapshots: tinyexec@0.3.2: {} + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + tinygradient@1.1.5: dependencies: '@types/tinycolor2': 1.4.6 @@ -30576,6 +30787,11 @@ snapshots: '@ts-morph/common': 0.19.0 code-block-writer: 12.0.0 + ts-morph@24.0.0: + dependencies: + '@ts-morph/common': 0.25.0 + code-block-writer: 13.0.3 + ts-node@10.9.1(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -30767,8 +30983,6 @@ snapshots: uncrypto@0.1.3: {} - undici-types@6.19.8: {} - undici-types@6.20.0: {} undici@5.28.4: @@ -30814,6 +31028,10 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + union@0.5.0: + dependencies: + qs: 6.13.0 + unique-names-generator@4.7.1: {} unique-string@2.0.0: @@ -30971,6 +31189,8 @@ snapshots: dependencies: punycode: 2.3.1 + url-join@4.0.1: {} + url@0.11.4: dependencies: punycode: 1.4.1 @@ -31417,6 +31637,10 @@ snapshots: transitivePeerDependencies: - supports-color + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3