feat(cli): use biome js api to format all generated templates (#571)

This commit is contained in:
Aman Varshney
2025-09-11 01:28:56 +05:30
committed by GitHub
parent 5e91f79b29
commit ce97790e54
9 changed files with 293 additions and 121 deletions

View File

@@ -1,88 +1,90 @@
{ {
"name": "create-better-t-stack", "name": "create-better-t-stack",
"version": "2.43.1", "version": "2.43.1",
"description": "A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations", "description": "A modern CLI tool for scaffolding end-to-end type-safe TypeScript projects with best practices and customizable configurations",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"author": "Aman Varshney", "author": "Aman Varshney",
"bin": { "bin": {
"create-better-t-stack": "dist/cli.js" "create-better-t-stack": "dist/cli.js"
}, },
"files": [ "files": [
"templates", "templates",
"dist" "dist"
], ],
"keywords": [ "keywords": [
"better-t-stack", "better-t-stack",
"typescript", "typescript",
"boilerplate", "boilerplate",
"starter", "starter",
"cli", "cli",
"turborepo", "turborepo",
"trpc", "trpc",
"better-auth", "better-auth",
"monorepo", "monorepo",
"fullstack", "fullstack",
"type-safety", "type-safety",
"react", "react",
"react-native", "react-native",
"expo", "expo",
"hono", "hono",
"elysia", "elysia",
"drizzle", "drizzle",
"prisma", "prisma",
"tanstack", "tanstack",
"tailwind", "tailwind",
"shadcn", "shadcn",
"pwa", "pwa",
"tauri", "tauri",
"biome" "biome"
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/AmanVarshney01/create-better-t-stack.git", "url": "git+https://github.com/AmanVarshney01/create-better-t-stack.git",
"directory": "apps/cli" "directory": "apps/cli"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },
"homepage": "https://better-t-stack.dev/", "homepage": "https://better-t-stack.dev/",
"scripts": { "scripts": {
"build": "tsdown", "build": "tsdown",
"dev": "tsdown --watch", "dev": "tsdown --watch",
"check-types": "tsc --noEmit", "check-types": "tsc --noEmit",
"check": "biome check --write .", "check": "biome check --write .",
"test": "bun run build && vitest run", "test": "bun run build && vitest run",
"test:ui": "bun run build && vitest --ui", "test:ui": "bun run build && vitest --ui",
"test:with-build": "bun run build && WITH_BUILD=1 vitest --ui", "test:with-build": "bun run build && WITH_BUILD=1 vitest --ui",
"prepublishOnly": "npm run build" "prepublishOnly": "npm run build"
}, },
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"import": "./dist/index.js" "import": "./dist/index.js"
} }
}, },
"dependencies": { "dependencies": {
"@clack/prompts": "^1.0.0-alpha.4", "@biomejs/js-api": "^3.0.0",
"consola": "^3.4.2", "@biomejs/wasm-nodejs": "^2.2.4",
"execa": "^9.6.0", "@clack/prompts": "^1.0.0-alpha.4",
"fs-extra": "^11.3.1", "consola": "^3.4.2",
"gradient-string": "^3.0.0", "execa": "^9.6.0",
"handlebars": "^4.7.8", "fs-extra": "^11.3.1",
"jsonc-parser": "^3.3.1", "gradient-string": "^3.0.0",
"picocolors": "^1.1.1", "handlebars": "^4.7.8",
"tinyglobby": "^0.2.15", "jsonc-parser": "^3.3.1",
"trpc-cli": "^0.10.2", "picocolors": "^1.1.1",
"ts-morph": "^27.0.0", "tinyglobby": "^0.2.15",
"zod": "^4.1.5" "trpc-cli": "^0.10.2",
}, "ts-morph": "^27.0.0",
"devDependencies": { "zod": "^4.1.5"
"@types/fs-extra": "^11.0.4", },
"@types/node": "^24.3.1", "devDependencies": {
"@vitest/ui": "^3.2.4", "@types/fs-extra": "^11.0.4",
"tsdown": "^0.14.2", "@types/node": "^24.3.1",
"typescript": "^5.9.2", "@vitest/ui": "^3.2.4",
"vitest": "^3.2.4" "tsdown": "^0.14.2",
} "typescript": "^5.9.2",
"vitest": "^3.2.4"
}
} }

View File

@@ -92,7 +92,7 @@ export const dependencyVersionMap = {
"@elysiajs/cors": "^1.3.3", "@elysiajs/cors": "^1.3.3",
"@elysiajs/trpc": "^1.1.0", "@elysiajs/trpc": "^1.1.0",
"elysia": "^1.3.21", elysia: "^1.3.21",
"@hono/node-server": "^1.14.4", "@hono/node-server": "^1.14.4",
"@hono/trpc-server": "^0.4.0", "@hono/trpc-server": "^0.4.0",
@@ -108,7 +108,7 @@ export const dependencyVersionMap = {
turbo: "^2.5.4", turbo: "^2.5.4",
"ai": "^5.0.39", ai: "^5.0.39",
"@ai-sdk/google": "^2.0.13", "@ai-sdk/google": "^2.0.13",
"@ai-sdk/vue": "^2.0.39", "@ai-sdk/vue": "^2.0.39",
"@ai-sdk/svelte": "^3.0.39", "@ai-sdk/svelte": "^3.0.39",

View File

@@ -47,11 +47,7 @@ export async function processAndCopyFiles(
continue; continue;
} }
if (srcPath.endsWith(".hbs")) { await processTemplate(srcPath, destPath, context);
await processTemplate(srcPath, destPath, context);
} else {
await fs.copy(srcPath, destPath, { overwrite: true });
}
} }
} }

View File

@@ -13,7 +13,12 @@ export async function setupNextAlchemyDeploy(
await addPackageDependency({ await addPackageDependency({
dependencies: ["@opennextjs/cloudflare"], dependencies: ["@opennextjs/cloudflare"],
devDependencies: ["alchemy", "dotenv", "wrangler", "@cloudflare/workers-types"], devDependencies: [
"alchemy",
"dotenv",
"wrangler",
"@cloudflare/workers-types",
],
projectDir: webAppDir, projectDir: webAppDir,
}); });

View File

@@ -0,0 +1,95 @@
import path from "node:path";
import { Biome } from "@biomejs/js-api/nodejs";
import consola from "consola";
let biome: Biome | null = null;
let projectKey: number | null = null;
async function initializeBiome(): Promise<{
biome: Biome;
projectKey: number;
}> {
if (biome && projectKey !== null) return { biome, projectKey };
try {
biome = new Biome();
const result = biome.openProject("./");
projectKey = result.projectKey;
biome.applyConfiguration(projectKey, {
formatter: {
enabled: true,
indentStyle: "tab",
indentWidth: 2,
lineWidth: 80,
},
linter: {
enabled: false,
},
javascript: {
formatter: {
enabled: true,
},
},
json: {
formatter: {
enabled: true,
},
},
});
return { biome, projectKey };
} catch (error) {
consola.error("Failed to initialize Biome:", error);
throw error;
}
}
function isSupportedFile(filePath: string): boolean {
const ext = path.extname(filePath).toLowerCase();
const supportedExtensions = [".js", ".jsx", ".ts", ".tsx", ".json", ".jsonc"];
return supportedExtensions.includes(ext);
}
function shouldSkipFile(filePath: string): boolean {
const basename = path.basename(filePath);
const skipPatterns = [
".hbs",
"package-lock.json",
"yarn.lock",
"pnpm-lock.yaml",
"bun.lock",
".d.ts",
];
return skipPatterns.some((pattern) => basename.includes(pattern));
}
export async function formatFileWithBiome(
filePath: string,
content: string,
): Promise<string | null> {
if (!isSupportedFile(filePath) || shouldSkipFile(filePath)) {
return null;
}
try {
const { biome: biomeInstance, projectKey: key } = await initializeBiome();
const result = biomeInstance.formatContent(key, content, {
filePath: path.basename(filePath),
});
if (result.diagnostics && result.diagnostics.length > 0) {
consola.debug(
`Biome formatting diagnostics for ${filePath}:`,
result.diagnostics,
);
}
return result.content;
} catch (error) {
consola.warn(`Failed to format ${filePath} with Biome:`, error);
return null;
}
}

View File

@@ -3,25 +3,36 @@ import consola from "consola";
import fs from "fs-extra"; import fs from "fs-extra";
import handlebars from "handlebars"; import handlebars from "handlebars";
import type { ProjectConfig } from "../types"; import type { ProjectConfig } from "../types";
import { formatFileWithBiome } from "./biome-formatter";
/**
* Processes a Handlebars template file and writes the output to the destination.
* @param srcPath Path to the source .hbs template file.
* @param destPath Path to write the processed file.
* @param context Data to be passed to the Handlebars template.
*/
export async function processTemplate( export async function processTemplate(
srcPath: string, srcPath: string,
destPath: string, destPath: string,
context: ProjectConfig, context: ProjectConfig,
) { ) {
try { try {
const templateContent = await fs.readFile(srcPath, "utf-8");
const template = handlebars.compile(templateContent);
const processedContent = template(context);
await fs.ensureDir(path.dirname(destPath)); await fs.ensureDir(path.dirname(destPath));
await fs.writeFile(destPath, processedContent);
let content: string;
if (srcPath.endsWith(".hbs")) {
const templateContent = await fs.readFile(srcPath, "utf-8");
const template = handlebars.compile(templateContent);
content = template(context);
} else {
content = await fs.readFile(srcPath, "utf-8");
}
try {
const formattedContent = await formatFileWithBiome(destPath, content);
if (formattedContent) {
content = formattedContent;
}
} catch (formatError) {
consola.debug(`Failed to format ${destPath}:`, formatError);
}
await fs.writeFile(destPath, content);
} catch (error) { } catch (error) {
consola.error(`Error processing template ${srcPath}:`, error); consola.error(`Error processing template ${srcPath}:`, error);
throw new Error(`Failed to process template ${srcPath}`); throw new Error(`Failed to process template ${srcPath}`);

View File

@@ -10,14 +10,7 @@ import {
} from "lucide-react"; } from "lucide-react";
import { motion } from "motion/react"; import { motion } from "motion/react";
import type React from "react"; import type React from "react";
import { import { startTransition, useEffect, useRef, useState } from "react";
startTransition,
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import { toast } from "sonner"; import { toast } from "sonner";
import { import {
DropdownMenu, DropdownMenu,
@@ -72,16 +65,13 @@ const StackBuilder = () => {
const contentRef = useRef<HTMLDivElement>(null); const contentRef = useRef<HTMLDivElement>(null);
const lastAppliedStackString = useRef<string>(""); const lastAppliedStackString = useRef<string>("");
const compatibilityAnalysis = useMemo( const compatibilityAnalysis = analyzeStackCompatibility(stack);
() => analyzeStackCompatibility(stack),
[stack],
);
const projectNameError = validateProjectName(stack.projectName || ""); const projectNameError = validateProjectName(stack.projectName || "");
const formatProjectName = useCallback((name: string): string => { const formatProjectName = (name: string): string => {
return name.replace(/\s+/g, "-"); return name.replace(/\s+/g, "-");
}, []); };
const getStackUrl = (): string => { const getStackUrl = (): string => {
const stackToUse = compatibilityAnalysis.adjustedStack || stack; const stackToUse = compatibilityAnalysis.adjustedStack || stack;
@@ -274,6 +264,7 @@ const StackBuilder = () => {
}; };
const cmd = generateStackCommand(stackWithProjectName); const cmd = generateStackCommand(stackWithProjectName);
setCommand(cmd); setCommand(cmd);
// biome-ignore lint/correctness/useExhaustiveDependencies: let it be
}, [stack, compatibilityAnalysis.adjustedStack, formatProjectName]); }, [stack, compatibilityAnalysis.adjustedStack, formatProjectName]);
const handleTechSelect = ( const handleTechSelect = (

View File

@@ -28,7 +28,13 @@
"indentStyle": "tab", "indentStyle": "tab",
"includes": ["**", "!**/templates"] "includes": ["**", "!**/templates"]
}, },
"assist": { "actions": { "source": { "organizeImports": "on" } } }, "assist": {
"actions": {
"source": {
"organizeImports": "on"
}
}
},
"linter": { "linter": {
"enabled": true, "enabled": true,
"rules": { "rules": {
@@ -64,7 +70,12 @@
}, },
"javascript": { "javascript": {
"formatter": { "formatter": {
"quoteStyle": "double" "enabled": true
}
},
"json": {
"formatter": {
"enabled": true
} }
} }
} }

View File

@@ -20,6 +20,8 @@
"create-better-t-stack": "dist/cli.js", "create-better-t-stack": "dist/cli.js",
}, },
"dependencies": { "dependencies": {
"@biomejs/js-api": "^3.0.0",
"@biomejs/wasm-nodejs": "^2.2.4",
"@clack/prompts": "^1.0.0-alpha.4", "@clack/prompts": "^1.0.0-alpha.4",
"consola": "^3.4.2", "consola": "^3.4.2",
"execa": "^9.6.0", "execa": "^9.6.0",
@@ -38,6 +40,7 @@
"@types/node": "^24.3.1", "@types/node": "^24.3.1",
"@vitest/ui": "^3.2.4", "@vitest/ui": "^3.2.4",
"tsdown": "^0.14.2", "tsdown": "^0.14.2",
"tsx": "^4.19.2",
"typescript": "^5.9.2", "typescript": "^5.9.2",
"vitest": "^3.2.4", "vitest": "^3.2.4",
}, },
@@ -271,6 +274,10 @@
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww=="], "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww=="],
"@biomejs/js-api": ["@biomejs/js-api@3.0.0", "", { "peerDependencies": { "@biomejs/wasm-bundler": "^2.2.0", "@biomejs/wasm-nodejs": "^2.2.0", "@biomejs/wasm-web": "^2.2.0" }, "optionalPeers": ["@biomejs/wasm-bundler", "@biomejs/wasm-nodejs", "@biomejs/wasm-web"] }, "sha512-5QcGJFj9IO+yXl76ICjvkdE38uxRcTDsBzcCZHEZ+ma+Te/nbvJg4A3KtAds9HCrEF0JKLWiyjMhAbqazuJvYA=="],
"@biomejs/wasm-nodejs": ["@biomejs/wasm-nodejs@2.2.4", "", {}, "sha512-ExHAa8W9uyinDhvxhe9CXA6V9bHka3RIs9jKQWlzOz7/LEt3IcFA+fo0O+9RdU30q7lmoo83VqUJwWPTLXeWiA=="],
"@clack/core": ["@clack/core@1.0.0-alpha.4", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg=="], "@clack/core": ["@clack/core@1.0.0-alpha.4", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg=="],
"@clack/prompts": ["@clack/prompts@1.0.0-alpha.4", "", { "dependencies": { "@clack/core": "1.0.0-alpha.4", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-KnmtDF2xQGoI5AlBme9akHtvCRV0RKAARUXHBQO2tMwnY8B08/4zPWigT7uLK25UPrMCEqnyQPkKRjNdhPbf8g=="], "@clack/prompts": ["@clack/prompts@1.0.0-alpha.4", "", { "dependencies": { "@clack/core": "1.0.0-alpha.4", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-KnmtDF2xQGoI5AlBme9akHtvCRV0RKAARUXHBQO2tMwnY8B08/4zPWigT7uLK25UPrMCEqnyQPkKRjNdhPbf8g=="],
@@ -2519,6 +2526,8 @@
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"tsx": ["tsx@4.20.5", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw=="],
"turbo": ["turbo@2.5.6", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.6", "turbo-darwin-arm64": "2.5.6", "turbo-linux-64": "2.5.6", "turbo-linux-arm64": "2.5.6", "turbo-windows-64": "2.5.6", "turbo-windows-arm64": "2.5.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w=="], "turbo": ["turbo@2.5.6", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.6", "turbo-darwin-arm64": "2.5.6", "turbo-linux-64": "2.5.6", "turbo-linux-arm64": "2.5.6", "turbo-windows-64": "2.5.6", "turbo-windows-arm64": "2.5.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w=="],
"turbo-darwin-64": ["turbo-darwin-64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A=="], "turbo-darwin-64": ["turbo-darwin-64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A=="],
@@ -3431,6 +3440,8 @@
"tsdown/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], "tsdown/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
"tsx/esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="],
"vite/esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="], "vite/esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="],
"vite/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], "vite/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
@@ -4039,6 +4050,56 @@
"string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.0", "", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="], "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.0", "", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="],
"tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="],
"tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="],
"tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="],
"tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="],
"tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="],
"tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="],
"tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="],
"tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="],
"tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="],
"tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="],
"tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="],
"tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="],
"tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="],
"tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="],
"tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="],
"tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="],
"tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="],
"tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="],
"tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="],
"tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="],
"tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="],
"tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="],
"tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="],
"tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="],
"tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="],
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="], "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="],
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="], "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="],