|
| 1 | +/** |
| 2 | + * Curated list of popular libraries in the TypeScript web ecosystem, |
| 3 | + * surfaced as a multi-select checkbox in the prompt flow. |
| 4 | + * |
| 5 | + * Bias: things people actually reach for in 2026, one or two per slot. |
| 6 | + * Not exhaustive — users can always add more via the npm search step. |
| 7 | + */ |
| 8 | + |
| 9 | +export type Category = |
| 10 | + | "Framework" |
| 11 | + | "UI components" |
| 12 | + | "Styling" |
| 13 | + | "Server framework" |
| 14 | + | "API layer" |
| 15 | + | "Database / ORM" |
| 16 | + | "Auth" |
| 17 | + | "State / data" |
| 18 | + | "Forms" |
| 19 | + | "Validation" |
| 20 | + | "Animation" |
| 21 | + | "Testing" |
| 22 | + | "Lint & format" |
| 23 | + | "Email" |
| 24 | + | "Payments" |
| 25 | + | "AI" |
| 26 | + | "i18n" |
| 27 | + | "Observability" |
| 28 | + | "Tooling"; |
| 29 | + |
| 30 | +export interface CuratedLibrary { |
| 31 | + /** npm package name — written verbatim into the spec */ |
| 32 | + name: string; |
| 33 | + /** short hint shown next to the name */ |
| 34 | + description: string; |
| 35 | + category: Category; |
| 36 | +} |
| 37 | + |
| 38 | +export const CURATED: CuratedLibrary[] = [ |
| 39 | + // Framework |
| 40 | + { name: "next", description: "React framework, App Router", category: "Framework" }, |
| 41 | + { name: "@tanstack/start", description: "TanStack full-stack framework", category: "Framework" }, |
| 42 | + { name: "react-router", description: "React Router (Remix successor)", category: "Framework" }, |
| 43 | + { name: "astro", description: "Content / island framework", category: "Framework" }, |
| 44 | + { name: "nuxt", description: "Vue framework", category: "Framework" }, |
| 45 | + { name: "@sveltejs/kit", description: "SvelteKit", category: "Framework" }, |
| 46 | + { name: "solid-start", description: "SolidJS framework", category: "Framework" }, |
| 47 | + { name: "vite", description: "Plain Vite SPA starter (no meta-framework)", category: "Framework" }, |
| 48 | + |
| 49 | + // UI components |
| 50 | + { name: "shadcn-ui", description: "Copy-paste React components on Radix + Tailwind", category: "UI components" }, |
| 51 | + { name: "@radix-ui/react", description: "Unstyled accessible primitives", category: "UI components" }, |
| 52 | + { name: "@headlessui/react", description: "Unstyled accessible components", category: "UI components" }, |
| 53 | + { name: "@mantine/core", description: "Batteries-included React components", category: "UI components" }, |
| 54 | + |
| 55 | + // Styling |
| 56 | + { name: "tailwindcss", description: "Utility-first CSS", category: "Styling" }, |
| 57 | + { name: "unocss", description: "On-demand atomic CSS", category: "Styling" }, |
| 58 | + { name: "@vanilla-extract/css", description: "Type-safe CSS-in-TS, zero runtime", category: "Styling" }, |
| 59 | + { name: "@pandacss/dev", description: "Style props at build time", category: "Styling" }, |
| 60 | + |
| 61 | + // Server framework |
| 62 | + { name: "hono", description: "Small, fast, edge-friendly server framework", category: "Server framework" }, |
| 63 | + { name: "elysia", description: "Bun-native server framework", category: "Server framework" }, |
| 64 | + { name: "fastify", description: "Schema-driven Node server framework", category: "Server framework" }, |
| 65 | + { name: "express", description: "Classic Node server framework", category: "Server framework" }, |
| 66 | + { name: "@nestjs/core", description: "NestJS — opinionated, decorator-based", category: "Server framework" }, |
| 67 | + |
| 68 | + // API layer |
| 69 | + { name: "@trpc/server", description: "tRPC — typesafe RPC", category: "API layer" }, |
| 70 | + { name: "@orpc/server", description: "oRPC — OpenAPI-compatible typesafe RPC", category: "API layer" }, |
| 71 | + |
| 72 | + // Database / ORM |
| 73 | + { name: "drizzle-orm", description: "TypeScript-first ORM / query builder", category: "Database / ORM" }, |
| 74 | + { name: "prisma", description: "Schema-first ORM", category: "Database / ORM" }, |
| 75 | + { name: "kysely", description: "Type-safe SQL query builder", category: "Database / ORM" }, |
| 76 | + { name: "convex", description: "Realtime backend / DB (BaaS)", category: "Database / ORM" }, |
| 77 | + |
| 78 | + // Auth |
| 79 | + { name: "better-auth", description: "Modern, framework-agnostic auth", category: "Auth" }, |
| 80 | + { name: "next-auth", description: "Auth.js (was NextAuth)", category: "Auth" }, |
| 81 | + { name: "@clerk/nextjs", description: "Hosted auth", category: "Auth" }, |
| 82 | + { name: "@workos-inc/authkit-nextjs", description: "WorkOS AuthKit", category: "Auth" }, |
| 83 | + |
| 84 | + // State / data |
| 85 | + { name: "zustand", description: "Tiny global state", category: "State / data" }, |
| 86 | + { name: "jotai", description: "Atomic state", category: "State / data" }, |
| 87 | + { name: "@tanstack/react-query", description: "Async / server state", category: "State / data" }, |
| 88 | + { name: "swr", description: "Data fetching with cache", category: "State / data" }, |
| 89 | + { name: "@reduxjs/toolkit", description: "Redux with less boilerplate", category: "State / data" }, |
| 90 | + |
| 91 | + // Forms |
| 92 | + { name: "react-hook-form", description: "Performant React forms", category: "Forms" }, |
| 93 | + { name: "@tanstack/react-form", description: "Headless form library", category: "Forms" }, |
| 94 | + |
| 95 | + // Validation |
| 96 | + { name: "zod", description: "Schema validation", category: "Validation" }, |
| 97 | + { name: "valibot", description: "Modular schema validation", category: "Validation" }, |
| 98 | + { name: "arktype", description: "TS-syntax schema validation", category: "Validation" }, |
| 99 | + |
| 100 | + // Animation |
| 101 | + { name: "motion", description: "Framer Motion (renamed `motion`)", category: "Animation" }, |
| 102 | + { name: "gsap", description: "Animation library", category: "Animation" }, |
| 103 | + |
| 104 | + // Testing |
| 105 | + { name: "vitest", description: "Vite-native test runner", category: "Testing" }, |
| 106 | + { name: "playwright", description: "Browser end-to-end testing", category: "Testing" }, |
| 107 | + |
| 108 | + // Lint & format |
| 109 | + { name: "@biomejs/biome", description: "Fast linter + formatter (Rust)", category: "Lint & format" }, |
| 110 | + { name: "eslint", description: "Linter", category: "Lint & format" }, |
| 111 | + { name: "prettier", description: "Code formatter", category: "Lint & format" }, |
| 112 | + |
| 113 | + // Email |
| 114 | + { name: "react-email", description: "Email components in React", category: "Email" }, |
| 115 | + { name: "resend", description: "Transactional email API", category: "Email" }, |
| 116 | + |
| 117 | + // Payments |
| 118 | + { name: "stripe", description: "Payments", category: "Payments" }, |
| 119 | + { name: "@polar-sh/sdk", description: "Polar payments", category: "Payments" }, |
| 120 | + |
| 121 | + // AI |
| 122 | + { name: "ai", description: "Vercel AI SDK", category: "AI" }, |
| 123 | + { name: "@anthropic-ai/sdk", description: "Anthropic SDK", category: "AI" }, |
| 124 | + { name: "openai", description: "OpenAI SDK", category: "AI" }, |
| 125 | + |
| 126 | + // i18n |
| 127 | + { name: "next-intl", description: "i18n for Next.js", category: "i18n" }, |
| 128 | + { name: "@inlang/paraglide-js", description: "Type-safe i18n (Paraglide)", category: "i18n" }, |
| 129 | + |
| 130 | + // Observability |
| 131 | + { name: "@sentry/node", description: "Sentry error + perf monitoring", category: "Observability" }, |
| 132 | + { name: "posthog-js", description: "Product analytics", category: "Observability" }, |
| 133 | + |
| 134 | + // Tooling |
| 135 | + { name: "storybook", description: "Component workbench", category: "Tooling" }, |
| 136 | + { name: "@t3-oss/env-nextjs", description: "Type-safe env vars (T3 Env)", category: "Tooling" }, |
| 137 | +]; |
0 commit comments