Skip to main content

End-to-End Type Safety: The Complete Guide for 2026

mubaidr
Sunday, February 22, 2026
TypeScriptType SafetyFull-StackZodAPI Design
End-to-End Type Safety - Connected type chain from database to frontend on blue gradient

End-to-End Type Safety: The Complete Guide for 2026

Type safety has evolved dramatically. In 2026, having TypeScript on the frontend isn't enough—true type safety spans your entire stack, from database to UI. This comprehensive guide shows you how to achieve end-to-end type safety and eliminate an entire class of runtime errors.

What is End-to-End Type Safety?

End-to-end type safety means maintaining type consistency across all layers of your application:

  • Database: Schema types and constraints
  • Backend: API routes, business logic, validation
  • Frontend: API clients, components, state management
  • Shared: Common types, utilities, constants

When done right, changing a database field triggers type errors in your frontend code, catching bugs before they reach production.

The Modern Type-Safe Stack (2026)

Core Technologies

// Database: Drizzle ORM with PostgreSQL
// Backend: Hono or Express with TypeScript
// Validation: Zod for runtime validation
// Frontend: Nuxt 4 or Next.js 16
// API Client: TanStack Query with generated types

Why This Stack?

  1. TypeScript First: Everything is typed from the ground up
  2. Runtime Validation: Zod ensures data matches types at runtime
  3. Type Inference: Minimal manual type definitions
  4. Developer Experience: Excellent IDE support and error messages

Setting Up End-to-End Types

Step 1: Database Layer

Start with strongly-typed database schemas:

// db/schema/users.ts
import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core"
import { createInsertSchema, createSelectSchema } from "drizzle-zod"
import { z } from "zod"

export const users = pgTable("users", {
  id: uuid("id").primaryKey().defaultRandom(),
  email: text("email").notNull().unique(),
  name: text("name").notNull(),
  createdAt: timestamp("created_at").defaultNow().notNull(),
})

// Generate Zod schemas from database schema
export const insertUserSchema = createInsertSchema(users)
export const selectUserSchema = createSelectSchema(users)

// Export types
export type User = typeof users.$inferSelect
export type NewUser = typeof users.$inferInsert

Step 2: API Layer with Type-Safe Routes

// server/routes/api/users.ts
import { Hono } from "hono"
import { zValidator } from "@hono/zod-validator"
import { insertUserSchema, selectUserSchema } from "@/db/schema"

const app = new Hono()

// Type-safe route with validation
app.post("/users", zValidator("json", insertUserSchema), async (c) => {
  const data = c.req.valid("json")
  // data is fully typed as NewUser

  const user = await db.insert(users).values(data).returning()

  return c.json({
    data: user[0],
    meta: {
      timestamp: new Date().toISOString(),
      version: "v1",
    },
  })
})

// Export route type
export type UsersRoutes = typeof app

Step 3: Type-Safe API Client

// lib/api/client.ts
import type { UsersRoutes } from "@/server/routes/api/users"
import type { SelectUserSchema } from "@/db/schema"

// Infer types from routes
type UsersApi = typeof UsersRoutes

async function api<T>(endpoint: string, options?: RequestInit): Promise<T> {
  const response = await fetch(`/api/${endpoint}`, options)

  if (!response.ok) {
    throw new Error(`API Error: ${response.status}`)
  }

  return response.json()
}

// Fully typed API calls
export const usersApi = {
  getAll: () => api<SelectUserSchema[]>("/api/users"),
  getById: (id: string) => api<SelectUserSchema>(`/api/users/${id}`),
  create: (data: NewUser) =>
    api<SelectUserSchema>("/api/users", {
      method: "POST",
      body: JSON.stringify(data),
      headers: { "Content-Type": "application/json" },
    }),
}

Step 4: Frontend with Auto-Generated Types

// app/pages/users.vue
<script setup lang="ts">
import { usersApi } from '@/lib/api/client'
import type { User } from '@/db/schema'

// Fully typed with inference
const { data: users, error } = await useAsyncData('users', () =>
  usersApi.getAll()
)

// Type-safe component
const UserCard = defineComponent<{ user: User }>({
  props: {
    user: {
      type: Object as PropType<User>,
      required: true
    }
  },
  setup({ user }) {
    return () => h('div', user.name)
  }
})
</script>

Advanced Type Safety Patterns

1. Shared Type Definitions

// shared/types/common.ts
import { z } from "zod"

// Common response structure
export const apiResponseSchema = <T extends z.ZodType>(dataSchema: T) =>
  z.object({
    data: dataSchema,
    meta: z.object({
      timestamp: z.string().datetime(),
      version: z.string(),
      requestId: z.string().uuid(),
    }),
  })

export type ApiResponse<T> = z.infer<ReturnType<typeof apiResponseSchema<T>>>

2. Type-Safe Environment Variables

// lib/env.ts
import { z } from "zod"

const envSchema = z.object({
  DATABASE_URL: z.string().url(),
  API_KEY: z.string().min(1),
  NODE_ENV: z.enum(["development", "production", "test"]),
})

export const env = envSchema.parse(process.env)
export type Env = z.infer<typeof envSchema>

3. Database Migrations with Type Safety

// db/migrations/001_create_users.ts
import { sql } from "drizzle-orm"

export async function up() {
  await sql`
    CREATE TABLE users (
      id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
      email TEXT NOT NULL UNIQUE,
      name TEXT NOT NULL,
      created_at TIMESTAMPTZ DEFAULT NOW()
    )
  `
}

export async function down() {
  await sql`DROP TABLE users`
}

Real-World Example: E-Commerce Product API

Database Schema

// db/schema/products.ts
export const products = pgTable("products", {
  id: uuid("id").primaryKey(),
  name: text("name").notNull(),
  description: text("description"),
  price: numeric("price").notNull(),
  inventory: integer("inventory").default(0),
  categoryId: uuid("category_id").references(() => categories.id),
})

API Route

// server/routes/api/products.ts
app.get(
  "/products/:id",
  zValidator("param", z.object({ id: z.string().uuid() })),
  async (c) => {
    const { id } = c.req.valid("param")

    const product = await db.query.products.findFirst({
      where: eq(products.id, id),
      with: {
        category: true,
        images: true,
      },
    })

    if (!product) {
      return c.json({ error: "Product not found" }, 404)
    }

    return c.json({ data: product })
  },
)

Frontend Component

<!-- app/components/ProductCard.vue -->
<script setup lang="ts">
import type { Product } from "@/db/schema"

const props = defineProps<{
  product: Product
}>()

const formattedPrice = computed(() =>
  new Intl.NumberFormat("en-US", {
    style: "currency",
    currency: "USD",
  }).format(Number(props.product.price)),
)
</script>

<template>
  <div class="product-card">
    <h3>{{ product.name }}</h3>
    <p>{{ formattedPrice }}</p>
  </div>
</template>

Common Pitfalls and Solutions

Pitfall 1: Type Widening

// ❌ Bad: Type is widened to string
const id = query.id // string

// ✅ Good: Preserve literal type
const id = query.id as string & {}

Pitfall 2: Missing Runtime Validation

// ❌ Bad: TypeScript types only exist at compile time
interface User {
  id: string
  email: string
}

function createUser(data: unknown) {
  const user = data as User // Unsafe!
}

// ✅ Good: Validate at runtime with Zod
const userSchema = z.object({
  id: z.string().uuid(),
  email: z.string().email(),
})

function createUser(data: unknown) {
  const user = userSchema.parse(data) // Safe!
  return user
}

Pitfall 3: Inconsistent Types Across Services

Solution: Use a shared types package:

# packages/types/package.json
{
  "name": "@myapp/types",
  "exports": {
    ".": "./dist/index.js",
    "./schema": "./dist/schema.js"
  }
}

Tools and Libraries for 2026

Type Generation

  • drizzle-kit: Database schema to TypeScript types
  • openapi-typescript: OpenAPI/Swagger to TypeScript
  • graphql-codegen: GraphQL to TypeScript
  • tRPC: End-to-end typesafe APIs

Validation

  • Zod: TypeScript-first schema validation
  • Valibot: Lightweight alternative to Zod
  • ArkType: High-performance validation

API Clients

  • TanStack Query: Data fetching with types
  • SWR: React Hooks for data fetching
  • TRPC Client: End-to-end typesafe RPC

Testing Type Safety

// tests/types.test.ts
import { expectTypeOf } from "expect-type"
import { usersApi } from "@/lib/api/client"

test("usersApi.getAll returns User[]", () => {
  expectTypeOf(usersApi.getAll()).resolves.toEqualTypeOf<User[]>()
})

test("usersApi.create accepts NewUser", () => {
  expectTypeOf(usersApi.create).parameter(0).toEqualTypeOf<NewUser>()
})

Performance Considerations

Type safety doesn't have to impact performance:

  1. Tree-shaking: Unused types are removed in production
  2. Type-only imports: Use import type to avoid runtime overhead
  3. Zod optimization: Use z.safeParse() for better performance
  4. Code splitting: Split types by feature/route

Conclusion

End-to-end type safety is no longer optional in 2026—it's a fundamental requirement for building reliable, maintainable applications. By leveraging modern tools like TypeScript, Zod, and type-safe frameworks, you can catch errors before they reach production and provide a better developer experience.

Start small by adding types to your most critical paths, then gradually expand coverage. The investment pays dividends in reduced bugs, better documentation, and improved developer confidence.


Ready to implement end-to-end type safety? Start with your database schema and work outward. Each layer builds on the previous one, creating a solid foundation for your entire application.

Full-stack engineer leading teams to build scalable systems & tools, with solid DevOps expertise.

Muhammad Ubaid R.

\n",[161,1516,1517,1522,1541,1563,1583,1587,1592,1633,1645,1649,1653,1658,1686,1695,1704,1728,1739,1744,1749,1764,1795,1799,1805],{"__ignoreMap":159},[164,1518,1519],{"class":166,"line":167},[164,1520,1521],{"class":170},"// app/pages/users.vue\n",[164,1523,1524,1526,1529,1531,1533,1536,1538],{"class":166,"line":174},[164,1525,1122],{"class":255},[164,1527,1528],{"class":259},"script setup lang",[164,1530,359],{"class":255},[164,1532,368],{"class":255},[164,1534,1535],{"class":288},"ts",[164,1537,368],{"class":255},[164,1539,1540],{"class":255},">\n",[164,1542,1543,1545,1547,1550,1552,1554,1557,1560],{"class":166,"line":16},[164,1544,252],{"class":251},[164,1546,256],{"class":255},[164,1548,1549],{"class":259}," usersApi",[164,1551,279],{"class":255},[164,1553,282],{"class":251},[164,1555,1556],{"class":255}," '",[164,1558,1559],{"class":288},"@/lib/api/client",[164,1561,1562],{"class":255},"'\n",[164,1564,1565,1567,1569,1571,1573,1575,1577,1579,1581],{"class":166,"line":185},[164,1566,252],{"class":251},[164,1568,594],{"class":251},[164,1570,256],{"class":255},[164,1572,598],{"class":259},[164,1574,279],{"class":255},[164,1576,282],{"class":251},[164,1578,1556],{"class":255},[164,1580,710],{"class":288},[164,1582,1562],{"class":255},[164,1584,1585],{"class":166,"line":191},[164,1586,343],{"emptyLinePlaceholder":342},[164,1588,1589],{"class":166,"line":346},[164,1590,1591],{"class":170},"// Fully typed with inference\n",[164,1593,1594,1596,1598,1600,1602,1604,1606,1609,1611,1613,1615,1618,1620,1623,1625,1627,1629,1631],{"class":166,"line":381},[164,1595,721],{"class":352},[164,1597,256],{"class":255},[164,1599,807],{"class":384},[164,1601,388],{"class":255},[164,1603,607],{"class":259},[164,1605,263],{"class":255},[164,1607,1608],{"class":259}," error ",[164,1610,529],{"class":255},[164,1612,601],{"class":255},[164,1614,853],{"class":251},[164,1616,1617],{"class":362}," useAsyncData",[164,1619,365],{"class":259},[164,1621,1622],{"class":255},"'",[164,1624,371],{"class":288},[164,1626,1622],{"class":255},[164,1628,263],{"class":255},[164,1630,1313],{"class":255},[164,1632,1404],{"class":352},[164,1634,1635,1638,1640,1643],{"class":166,"line":424},[164,1636,1637],{"class":259}," usersApi",[164,1639,405],{"class":255},[164,1641,1642],{"class":362},"getAll",[164,1644,734],{"class":259},[164,1646,1647],{"class":166,"line":461},[164,1648,532],{"class":259},[164,1650,1651],{"class":166,"line":490},[164,1652,343],{"emptyLinePlaceholder":342},[164,1654,1655],{"class":166,"line":526},[164,1656,1657],{"class":170},"// Type-safe component\n",[164,1659,1660,1662,1665,1667,1670,1673,1675,1677,1679,1682,1684],{"class":166,"line":535},[164,1661,721],{"class":352},[164,1663,1664],{"class":259}," UserCard ",[164,1666,359],{"class":255},[164,1668,1669],{"class":362}," defineComponent",[164,1671,1672],{"class":255},"<{",[164,1674,848],{"class":384},[164,1676,388],{"class":255},[164,1678,598],{"class":597},[164,1680,1681],{"class":255}," }>",[164,1683,365],{"class":259},[164,1685,906],{"class":255},[164,1687,1688,1691,1693],{"class":166,"line":29},[164,1689,1690],{"class":384}," props",[164,1692,388],{"class":255},[164,1694,378],{"class":255},[164,1696,1697,1700,1702],{"class":166,"line":545},[164,1698,1699],{"class":384}," user",[164,1701,388],{"class":255},[164,1703,378],{"class":255},[164,1705,1706,1709,1711,1714,1717,1720,1722,1725],{"class":166,"line":562},[164,1707,1708],{"class":384}," type",[164,1710,388],{"class":255},[164,1712,1713],{"class":259}," Object ",[164,1715,1716],{"class":251},"as",[164,1718,1719],{"class":597}," PropType",[164,1721,1122],{"class":255},[164,1723,1724],{"class":597},"User",[164,1726,1727],{"class":255},">,\n",[164,1729,1730,1733,1735],{"class":166,"line":578},[164,1731,1732],{"class":384}," required",[164,1734,388],{"class":255},[164,1736,1738],{"class":1737},"sfNiH"," true\n",[164,1740,1741],{"class":166,"line":583},[164,1742,1743],{"class":255}," }\n",[164,1745,1746],{"class":166,"line":589},[164,1747,1748],{"class":255}," },\n",[164,1750,1751,1754,1757,1759,1762],{"class":166,"line":615},[164,1752,1753],{"class":384}," setup",[164,1755,1756],{"class":255},"({",[164,1758,848],{"class":791},[164,1760,1761],{"class":255}," })",[164,1763,378],{"class":255},[164,1765,1766,1769,1771,1773,1776,1778,1780,1783,1785,1787,1789,1791,1793],{"class":166,"line":978},[164,1767,1768],{"class":251}," return",[164,1770,1313],{"class":255},[164,1772,797],{"class":352},[164,1774,1775],{"class":362}," h",[164,1777,365],{"class":384},[164,1779,1622],{"class":255},[164,1781,1782],{"class":288},"div",[164,1784,1622],{"class":255},[164,1786,263],{"class":255},[164,1788,848],{"class":259},[164,1790,405],{"class":255},[164,1792,475],{"class":259},[164,1794,532],{"class":384},[164,1796,1797],{"class":166,"line":984},[164,1798,1260],{"class":255},[164,1800,1801,1803],{"class":166,"line":992},[164,1802,529],{"class":255},[164,1804,532],{"class":259},[164,1806,1807,1810,1813],{"class":166,"line":999},[164,1808,1809],{"class":255},"(dataSchema: T) =>\n z.object({\n data: dataSchema,\n meta: z.object({\n timestamp: z.string().datetime(),\n version: z.string(),\n requestId: z.string().uuid(),\n }),\n })\n\nexport type ApiResponse = z.infer>>\n",[161,1827,1828,1833,1851,1855,1860,1900,1914,1925,1941,1965,1981,2005,2013,2019,2023],{"__ignoreMap":159},[164,1829,1830],{"class":166,"line":167},[164,1831,1832],{"class":170},"// shared/types/common.ts\n",[164,1834,1835,1837,1839,1841,1843,1845,1847,1849],{"class":166,"line":174},[164,1836,252],{"class":251},[164,1838,256],{"class":255},[164,1840,326],{"class":259},[164,1842,279],{"class":255},[164,1844,282],{"class":251},[164,1846,285],{"class":255},[164,1848,335],{"class":288},[164,1850,292],{"class":255},[164,1852,1853],{"class":166,"line":16},[164,1854,343],{"emptyLinePlaceholder":342},[164,1856,1857],{"class":166,"line":185},[164,1858,1859],{"class":170},"// Common response structure\n",[164,1861,1862,1864,1866,1869,1871,1874,1876,1879,1881,1883,1886,1888,1891,1893,1896,1898],{"class":166,"line":191},[164,1863,349],{"class":251},[164,1865,353],{"class":352},[164,1867,1868],{"class":259}," apiResponseSchema ",[164,1870,359],{"class":255},[164,1872,1873],{"class":255}," <",[164,1875,1125],{"class":597},[164,1877,1878],{"class":352}," extends",[164,1880,326],{"class":597},[164,1882,405],{"class":255},[164,1884,1885],{"class":597},"ZodType",[164,1887,1128],{"class":255},[164,1889,1890],{"class":791},"dataSchema",[164,1892,388],{"class":255},[164,1894,1895],{"class":597}," T",[164,1897,402],{"class":255},[164,1899,1404],{"class":352},[164,1901,1902,1905,1907,1910,1912],{"class":166,"line":346},[164,1903,1904],{"class":259}," z",[164,1906,405],{"class":255},[164,1908,1909],{"class":362},"object",[164,1911,365],{"class":259},[164,1913,906],{"class":255},[164,1915,1916,1918,1920,1923],{"class":166,"line":381},[164,1917,911],{"class":384},[164,1919,388],{"class":255},[164,1921,1922],{"class":259}," dataSchema",[164,1924,421],{"class":255},[164,1926,1927,1929,1931,1933,1935,1937,1939],{"class":166,"line":424},[164,1928,932],{"class":384},[164,1930,388],{"class":255},[164,1932,326],{"class":259},[164,1934,405],{"class":255},[164,1936,1909],{"class":362},[164,1938,365],{"class":259},[164,1940,906],{"class":255},[164,1942,1943,1945,1947,1949,1951,1954,1956,1958,1961,1963],{"class":166,"line":461},[164,1944,941],{"class":384},[164,1946,388],{"class":255},[164,1948,326],{"class":259},[164,1950,405],{"class":255},[164,1952,1953],{"class":362},"string",[164,1955,411],{"class":259},[164,1957,405],{"class":255},[164,1959,1960],{"class":362},"datetime",[164,1962,411],{"class":259},[164,1964,421],{"class":255},[164,1966,1967,1969,1971,1973,1975,1977,1979],{"class":166,"line":490},[164,1968,964],{"class":384},[164,1970,388],{"class":255},[164,1972,326],{"class":259},[164,1974,405],{"class":255},[164,1976,1953],{"class":362},[164,1978,411],{"class":259},[164,1980,421],{"class":255},[164,1982,1983,1986,1988,1990,1992,1994,1996,1998,2001,2003],{"class":166,"line":526},[164,1984,1985],{"class":384}," requestId",[164,1987,388],{"class":255},[164,1989,326],{"class":259},[164,1991,405],{"class":255},[164,1993,1953],{"class":362},[164,1995,411],{"class":259},[164,1997,405],{"class":255},[164,1999,2000],{"class":362},"uuid",[164,2002,411],{"class":259},[164,2004,421],{"class":255},[164,2006,2007,2009,2011],{"class":166,"line":535},[164,2008,1498],{"class":255},[164,2010,402],{"class":259},[164,2012,421],{"class":255},[164,2014,2015,2017],{"class":166,"line":29},[164,2016,987],{"class":255},[164,2018,532],{"class":259},[164,2020,2021],{"class":166,"line":545},[164,2022,343],{"emptyLinePlaceholder":342},[164,2024,2025,2027,2029,2032,2034,2036,2038,2040,2042,2044,2047,2049,2052,2055,2058,2060,2062],{"class":166,"line":562},[164,2026,349],{"class":251},[164,2028,594],{"class":352},[164,2030,2031],{"class":597}," ApiResponse",[164,2033,1122],{"class":255},[164,2035,1125],{"class":597},[164,2037,1160],{"class":255},[164,2039,601],{"class":255},[164,2041,326],{"class":597},[164,2043,405],{"class":255},[164,2045,2046],{"class":597},"infer",[164,2048,1122],{"class":255},[164,2050,2051],{"class":597},"ReturnType",[164,2053,2054],{"class":255},">>\n",[149,2066,2068],{"id":2067},"_2-type-safe-environment-variables","2. Type-Safe Environment Variables",[154,2070,2072],{"className":156,"code":2071,"language":158,"meta":159,"style":159},"// lib/env.ts\nimport { z } from \"zod\"\n\nconst envSchema = z.object({\n DATABASE_URL: z.string().url(),\n API_KEY: z.string().min(1),\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]),\n})\n\nexport const env = envSchema.parse(process.env)\nexport type Env = z.infer\n",[161,2073,2074,2079,2097,2101,2120,2144,2173,2220,2226,2230,2257],{"__ignoreMap":159},[164,2075,2076],{"class":166,"line":167},[164,2077,2078],{"class":170},"// lib/env.ts\n",[164,2080,2081,2083,2085,2087,2089,2091,2093,2095],{"class":166,"line":174},[164,2082,252],{"class":251},[164,2084,256],{"class":255},[164,2086,326],{"class":259},[164,2088,279],{"class":255},[164,2090,282],{"class":251},[164,2092,285],{"class":255},[164,2094,335],{"class":288},[164,2096,292],{"class":255},[164,2098,2099],{"class":166,"line":16},[164,2100,343],{"emptyLinePlaceholder":342},[164,2102,2103,2105,2108,2110,2112,2114,2116,2118],{"class":166,"line":185},[164,2104,721],{"class":352},[164,2106,2107],{"class":259}," envSchema ",[164,2109,359],{"class":255},[164,2111,326],{"class":259},[164,2113,405],{"class":255},[164,2115,1909],{"class":362},[164,2117,365],{"class":259},[164,2119,906],{"class":255},[164,2121,2122,2125,2127,2129,2131,2133,2135,2137,2140,2142],{"class":166,"line":191},[164,2123,2124],{"class":384}," DATABASE_URL",[164,2126,388],{"class":255},[164,2128,326],{"class":259},[164,2130,405],{"class":255},[164,2132,1953],{"class":362},[164,2134,411],{"class":259},[164,2136,405],{"class":255},[164,2138,2139],{"class":362},"url",[164,2141,411],{"class":259},[164,2143,421],{"class":255},[164,2145,2146,2149,2151,2153,2155,2157,2159,2161,2164,2166,2169,2171],{"class":166,"line":346},[164,2147,2148],{"class":384}," API_KEY",[164,2150,388],{"class":255},[164,2152,326],{"class":259},[164,2154,405],{"class":255},[164,2156,1953],{"class":362},[164,2158,411],{"class":259},[164,2160,405],{"class":255},[164,2162,2163],{"class":362},"min",[164,2165,365],{"class":259},[164,2167,2168],{"class":921},"1",[164,2170,402],{"class":259},[164,2172,421],{"class":255},[164,2174,2175,2178,2180,2182,2184,2187,2190,2192,2195,2197,2199,2201,2204,2206,2208,2210,2213,2215,2218],{"class":166,"line":381},[164,2176,2177],{"class":384}," NODE_ENV",[164,2179,388],{"class":255},[164,2181,326],{"class":259},[164,2183,405],{"class":255},[164,2185,2186],{"class":362},"enum",[164,2188,2189],{"class":259},"([",[164,2191,368],{"class":255},[164,2193,2194],{"class":288},"development",[164,2196,368],{"class":255},[164,2198,263],{"class":255},[164,2200,285],{"class":255},[164,2202,2203],{"class":288},"production",[164,2205,368],{"class":255},[164,2207,263],{"class":255},[164,2209,285],{"class":255},[164,2211,2212],{"class":288},"test",[164,2214,368],{"class":255},[164,2216,2217],{"class":259},"])",[164,2219,421],{"class":255},[164,2221,2222,2224],{"class":166,"line":424},[164,2223,529],{"class":255},[164,2225,532],{"class":259},[164,2227,2228],{"class":166,"line":461},[164,2229,343],{"emptyLinePlaceholder":342},[164,2231,2232,2234,2236,2239,2241,2244,2246,2249,2252,2254],{"class":166,"line":490},[164,2233,349],{"class":251},[164,2235,353],{"class":352},[164,2237,2238],{"class":259}," env ",[164,2240,359],{"class":255},[164,2242,2243],{"class":259}," envSchema",[164,2245,405],{"class":255},[164,2247,2248],{"class":362},"parse",[164,2250,2251],{"class":259},"(process",[164,2253,405],{"class":255},[164,2255,2256],{"class":259},"env)\n",[164,2258,2259,2261,2263,2266,2268,2270,2272,2274,2276,2278],{"class":166,"line":526},[164,2260,349],{"class":251},[164,2262,594],{"class":352},[164,2264,2265],{"class":597}," Env",[164,2267,601],{"class":255},[164,2269,326],{"class":597},[164,2271,405],{"class":255},[164,2273,2046],{"class":597},[164,2275,2054],{"class":255},[164,2277,2243],{"class":259},[164,2279,1540],{"class":255},[149,2281,2283],{"id":2282},"_3-database-migrations-with-type-safety","3. Database Migrations with Type Safety",[154,2285,2287],{"className":156,"code":2286,"language":158,"meta":159,"style":159},"// db/migrations/001_create_users.ts\nimport { sql } from \"drizzle-orm\"\n\nexport async function up() {\n await sql`\n CREATE TABLE users (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n email TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n created_at TIMESTAMPTZ DEFAULT NOW()\n )\n `\n}\n\nexport async function down() {\n await sql`DROP TABLE users`\n}\n",[161,2288,2289,2294,2314,2318,2333,2343,2348,2353,2358,2363,2368,2373,2378,2382,2386,2401,2414],{"__ignoreMap":159},[164,2290,2291],{"class":166,"line":167},[164,2292,2293],{"class":170},"// db/migrations/001_create_users.ts\n",[164,2295,2296,2298,2300,2303,2305,2307,2309,2312],{"class":166,"line":174},[164,2297,252],{"class":251},[164,2299,256],{"class":255},[164,2301,2302],{"class":259}," sql",[164,2304,279],{"class":255},[164,2306,282],{"class":251},[164,2308,285],{"class":255},[164,2310,2311],{"class":288},"drizzle-orm",[164,2313,292],{"class":255},[164,2315,2316],{"class":166,"line":16},[164,2317,343],{"emptyLinePlaceholder":342},[164,2319,2320,2322,2324,2326,2329,2331],{"class":166,"line":185},[164,2321,349],{"class":251},[164,2323,785],{"class":352},[164,2325,1116],{"class":352},[164,2327,2328],{"class":362}," up",[164,2330,411],{"class":255},[164,2332,378],{"class":255},[164,2334,2335,2338,2340],{"class":166,"line":191},[164,2336,2337],{"class":251}," await",[164,2339,2302],{"class":362},[164,2341,2342],{"class":255},"`\n",[164,2344,2345],{"class":166,"line":346},[164,2346,2347],{"class":288}," CREATE TABLE users (\n",[164,2349,2350],{"class":166,"line":381},[164,2351,2352],{"class":288}," id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n",[164,2354,2355],{"class":166,"line":424},[164,2356,2357],{"class":288}," email TEXT NOT NULL UNIQUE,\n",[164,2359,2360],{"class":166,"line":461},[164,2361,2362],{"class":288}," name TEXT NOT NULL,\n",[164,2364,2365],{"class":166,"line":490},[164,2366,2367],{"class":288}," created_at TIMESTAMPTZ DEFAULT NOW()\n",[164,2369,2370],{"class":166,"line":526},[164,2371,2372],{"class":288}," )\n",[164,2374,2375],{"class":166,"line":535},[164,2376,2377],{"class":255}," `\n",[164,2379,2380],{"class":166,"line":29},[164,2381,1281],{"class":255},[164,2383,2384],{"class":166,"line":545},[164,2385,343],{"emptyLinePlaceholder":342},[164,2387,2388,2390,2392,2394,2397,2399],{"class":166,"line":562},[164,2389,349],{"class":251},[164,2391,785],{"class":352},[164,2393,1116],{"class":352},[164,2395,2396],{"class":362}," down",[164,2398,411],{"class":255},[164,2400,378],{"class":255},[164,2402,2403,2405,2407,2409,2412],{"class":166,"line":578},[164,2404,2337],{"class":251},[164,2406,2302],{"class":362},[164,2408,1181],{"class":255},[164,2410,2411],{"class":288},"DROP TABLE users",[164,2413,2342],{"class":255},[164,2415,2416],{"class":166,"line":583},[164,2417,1281],{"class":255},[98,2419,2421],{"id":2420},"real-world-example-e-commerce-product-api","Real-World Example: E-Commerce Product API",[149,2423,2425],{"id":2424},"database-schema","Database Schema",[154,2427,2429],{"className":156,"code":2428,"language":158,"meta":159,"style":159},"// db/schema/products.ts\nexport const products = pgTable(\"products\", {\n id: uuid(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n price: numeric(\"price\").notNull(),\n inventory: integer(\"inventory\").default(0),\n categoryId: uuid(\"category_id\").references(() => categories.id),\n})\n",[161,2430,2431,2436,2462,2488,2514,2536,2565,2599,2640],{"__ignoreMap":159},[164,2432,2433],{"class":166,"line":167},[164,2434,2435],{"class":170},"// db/schema/products.ts\n",[164,2437,2438,2440,2442,2445,2447,2449,2451,2453,2456,2458,2460],{"class":166,"line":174},[164,2439,349],{"class":251},[164,2441,353],{"class":352},[164,2443,2444],{"class":259}," products ",[164,2446,359],{"class":255},[164,2448,260],{"class":362},[164,2450,365],{"class":259},[164,2452,368],{"class":255},[164,2454,2455],{"class":288},"products",[164,2457,368],{"class":255},[164,2459,263],{"class":255},[164,2461,378],{"class":255},[164,2463,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486],{"class":166,"line":16},[164,2465,385],{"class":384},[164,2467,388],{"class":255},[164,2469,276],{"class":362},[164,2471,365],{"class":259},[164,2473,368],{"class":255},[164,2475,397],{"class":288},[164,2477,368],{"class":255},[164,2479,402],{"class":259},[164,2481,405],{"class":255},[164,2483,408],{"class":362},[164,2485,411],{"class":259},[164,2487,421],{"class":255},[164,2489,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512],{"class":166,"line":185},[164,2491,464],{"class":384},[164,2493,388],{"class":255},[164,2495,266],{"class":362},[164,2497,365],{"class":259},[164,2499,368],{"class":255},[164,2501,475],{"class":288},[164,2503,368],{"class":255},[164,2505,402],{"class":259},[164,2507,405],{"class":255},[164,2509,447],{"class":362},[164,2511,411],{"class":259},[164,2513,421],{"class":255},[164,2515,2516,2519,2521,2523,2525,2527,2530,2532,2534],{"class":166,"line":191},[164,2517,2518],{"class":384}," description",[164,2520,388],{"class":255},[164,2522,266],{"class":362},[164,2524,365],{"class":259},[164,2526,368],{"class":255},[164,2528,2529],{"class":288},"description",[164,2531,368],{"class":255},[164,2533,402],{"class":259},[164,2535,421],{"class":255},[164,2537,2538,2541,2543,2546,2548,2550,2553,2555,2557,2559,2561,2563],{"class":166,"line":346},[164,2539,2540],{"class":384}," price",[164,2542,388],{"class":255},[164,2544,2545],{"class":362}," numeric",[164,2547,365],{"class":259},[164,2549,368],{"class":255},[164,2551,2552],{"class":288},"price",[164,2554,368],{"class":255},[164,2556,402],{"class":259},[164,2558,405],{"class":255},[164,2560,447],{"class":362},[164,2562,411],{"class":259},[164,2564,421],{"class":255},[164,2566,2567,2570,2572,2575,2577,2579,2582,2584,2586,2588,2591,2593,2595,2597],{"class":166,"line":381},[164,2568,2569],{"class":384}," inventory",[164,2571,388],{"class":255},[164,2573,2574],{"class":362}," integer",[164,2576,365],{"class":259},[164,2578,368],{"class":255},[164,2580,2581],{"class":288},"inventory",[164,2583,368],{"class":255},[164,2585,402],{"class":259},[164,2587,405],{"class":255},[164,2589,2590],{"class":362},"default",[164,2592,365],{"class":259},[164,2594,922],{"class":921},[164,2596,402],{"class":259},[164,2598,421],{"class":255},[164,2600,2601,2604,2606,2608,2610,2612,2615,2617,2619,2621,2624,2626,2628,2630,2633,2635,2638],{"class":166,"line":424},[164,2602,2603],{"class":384}," categoryId",[164,2605,388],{"class":255},[164,2607,276],{"class":362},[164,2609,365],{"class":259},[164,2611,368],{"class":255},[164,2613,2614],{"class":288},"category_id",[164,2616,368],{"class":255},[164,2618,402],{"class":259},[164,2620,405],{"class":255},[164,2622,2623],{"class":362},"references",[164,2625,365],{"class":259},[164,2627,411],{"class":255},[164,2629,797],{"class":352},[164,2631,2632],{"class":259}," categories",[164,2634,405],{"class":255},[164,2636,2637],{"class":259},"id)",[164,2639,421],{"class":255},[164,2641,2642,2644],{"class":166,"line":461},[164,2643,529],{"class":255},[164,2645,532],{"class":259},[149,2647,2649],{"id":2648},"api-route","API Route",[154,2651,2653],{"className":156,"code":2652,"language":158,"meta":159,"style":159},"// server/routes/api/products.ts\napp.get(\n \"/products/:id\",\n zValidator(\"param\", z.object({ id: z.string().uuid() })),\n async (c) => {\n const { id } = c.req.valid(\"param\")\n\n const product = await db.query.products.findFirst({\n where: eq(products.id, id),\n with: {\n category: true,\n images: true,\n },\n })\n\n if (!product) {\n return c.json({ error: \"Product not found\" }, 404)\n }\n\n return c.json({ data: product })\n },\n)\n",[161,2654,2655,2660,2672,2684,2738,2753,2786,2790,2821,2847,2856,2868,2879,2884,2890,2894,2910,2945,2949,2953,2977,2981],{"__ignoreMap":159},[164,2656,2657],{"class":166,"line":167},[164,2658,2659],{"class":170},"// server/routes/api/products.ts\n",[164,2661,2662,2664,2666,2669],{"class":166,"line":174},[164,2663,748],{"class":259},[164,2665,405],{"class":255},[164,2667,2668],{"class":362},"get",[164,2670,2671],{"class":259},"(\n",[164,2673,2674,2677,2680,2682],{"class":166,"line":16},[164,2675,2676],{"class":255}," \"",[164,2678,2679],{"class":288},"/products/:id",[164,2681,368],{"class":255},[164,2683,421],{"class":255},[164,2685,2686,2689,2691,2693,2696,2698,2700,2702,2704,2706,2708,2711,2714,2716,2718,2720,2722,2724,2726,2728,2731,2733,2736],{"class":166,"line":185},[164,2687,2688],{"class":362}," zValidator",[164,2690,365],{"class":259},[164,2692,368],{"class":255},[164,2694,2695],{"class":288},"param",[164,2697,368],{"class":255},[164,2699,263],{"class":255},[164,2701,326],{"class":259},[164,2703,405],{"class":255},[164,2705,1909],{"class":362},[164,2707,365],{"class":259},[164,2709,2710],{"class":255},"{",[164,2712,2713],{"class":384}," id",[164,2715,388],{"class":255},[164,2717,326],{"class":259},[164,2719,405],{"class":255},[164,2721,1953],{"class":362},[164,2723,411],{"class":259},[164,2725,405],{"class":255},[164,2727,2000],{"class":362},[164,2729,2730],{"class":259},"() ",[164,2732,529],{"class":255},[164,2734,2735],{"class":259},"))",[164,2737,421],{"class":255},[164,2739,2740,2743,2745,2747,2749,2751],{"class":166,"line":191},[164,2741,2742],{"class":352}," async",[164,2744,788],{"class":255},[164,2746,792],{"class":791},[164,2748,402],{"class":255},[164,2750,797],{"class":352},[164,2752,378],{"class":255},[164,2754,2755,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784],{"class":166,"line":346},[164,2756,2757],{"class":352}," const",[164,2759,256],{"class":255},[164,2761,2713],{"class":259},[164,2763,279],{"class":255},[164,2765,601],{"class":255},[164,2767,812],{"class":259},[164,2769,405],{"class":255},[164,2771,817],{"class":259},[164,2773,405],{"class":255},[164,2775,822],{"class":362},[164,2777,365],{"class":384},[164,2779,368],{"class":255},[164,2781,2695],{"class":288},[164,2783,368],{"class":255},[164,2785,532],{"class":384},[164,2787,2788],{"class":166,"line":381},[164,2789,343],{"emptyLinePlaceholder":342},[164,2791,2792,2794,2797,2799,2801,2803,2805,2808,2810,2812,2814,2817,2819],{"class":166,"line":424},[164,2793,2757],{"class":352},[164,2795,2796],{"class":259}," product",[164,2798,601],{"class":255},[164,2800,853],{"class":251},[164,2802,856],{"class":259},[164,2804,405],{"class":255},[164,2806,2807],{"class":259},"query",[164,2809,405],{"class":255},[164,2811,2455],{"class":259},[164,2813,405],{"class":255},[164,2815,2816],{"class":362},"findFirst",[164,2818,365],{"class":384},[164,2820,906],{"class":255},[164,2822,2823,2826,2828,2831,2833,2835,2837,2839,2841,2843,2845],{"class":166,"line":461},[164,2824,2825],{"class":384}," where",[164,2827,388],{"class":255},[164,2829,2830],{"class":362}," eq",[164,2832,365],{"class":384},[164,2834,2455],{"class":259},[164,2836,405],{"class":255},[164,2838,397],{"class":259},[164,2840,263],{"class":255},[164,2842,2713],{"class":259},[164,2844,402],{"class":384},[164,2846,421],{"class":255},[164,2848,2849,2852,2854],{"class":166,"line":490},[164,2850,2851],{"class":384}," with",[164,2853,388],{"class":255},[164,2855,378],{"class":255},[164,2857,2858,2861,2863,2866],{"class":166,"line":526},[164,2859,2860],{"class":384}," category",[164,2862,388],{"class":255},[164,2864,2865],{"class":1737}," true",[164,2867,421],{"class":255},[164,2869,2870,2873,2875,2877],{"class":166,"line":535},[164,2871,2872],{"class":384}," images",[164,2874,388],{"class":255},[164,2876,2865],{"class":1737},[164,2878,421],{"class":255},[164,2880,2881],{"class":166,"line":29},[164,2882,2883],{"class":255}," },\n",[164,2885,2886,2888],{"class":166,"line":545},[164,2887,1498],{"class":255},[164,2889,532],{"class":384},[164,2891,2892],{"class":166,"line":562},[164,2893,343],{"emptyLinePlaceholder":342},[164,2895,2896,2899,2901,2903,2906,2908],{"class":166,"line":578},[164,2897,2898],{"class":251}," if",[164,2900,788],{"class":384},[164,2902,1212],{"class":255},[164,2904,2905],{"class":259},"product",[164,2907,1223],{"class":384},[164,2909,906],{"class":255},[164,2911,2912,2915,2917,2919,2921,2923,2925,2928,2930,2932,2935,2937,2940,2943],{"class":166,"line":583},[164,2913,2914],{"class":251}," return",[164,2916,812],{"class":259},[164,2918,405],{"class":255},[164,2920,773],{"class":362},[164,2922,365],{"class":384},[164,2924,2710],{"class":255},[164,2926,2927],{"class":384}," error",[164,2929,388],{"class":255},[164,2931,285],{"class":255},[164,2933,2934],{"class":288},"Product not found",[164,2936,368],{"class":255},[164,2938,2939],{"class":255}," },",[164,2941,2942],{"class":921}," 404",[164,2944,532],{"class":384},[164,2946,2947],{"class":166,"line":589},[164,2948,1743],{"class":255},[164,2950,2951],{"class":166,"line":615},[164,2952,343],{"emptyLinePlaceholder":342},[164,2954,2955,2957,2959,2961,2963,2965,2967,2969,2971,2973,2975],{"class":166,"line":978},[164,2956,1768],{"class":251},[164,2958,812],{"class":259},[164,2960,405],{"class":255},[164,2962,773],{"class":362},[164,2964,365],{"class":384},[164,2966,2710],{"class":255},[164,2968,807],{"class":384},[164,2970,388],{"class":255},[164,2972,2796],{"class":259},[164,2974,279],{"class":255},[164,2976,532],{"class":384},[164,2978,2979],{"class":166,"line":984},[164,2980,1748],{"class":255},[164,2982,2983],{"class":166,"line":992},[164,2984,532],{"class":259},[149,2986,2988],{"id":2987},"frontend-component","Frontend Component",[154,2990,2994],{"className":2991,"code":2992,"language":2993,"meta":159,"style":159},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\n\n\n\n","vue",[161,2995,2996,3001,3023,3044,3048,3063,3073,3080,3084,3102,3128,3144,3159,3189,3193,3201,3205,3214,3235,3253,3270,3279],{"__ignoreMap":159},[164,2997,2998],{"class":166,"line":167},[164,2999,3000],{"class":170},"\n",[164,3002,3003,3005,3007,3010,3013,3015,3017,3019,3021],{"class":166,"line":174},[164,3004,1122],{"class":255},[164,3006,1812],{"class":384},[164,3008,3009],{"class":352}," setup",[164,3011,3012],{"class":352}," lang",[164,3014,359],{"class":255},[164,3016,368],{"class":255},[164,3018,1535],{"class":288},[164,3020,368],{"class":255},[164,3022,1540],{"class":255},[164,3024,3025,3027,3029,3031,3034,3036,3038,3040,3042],{"class":166,"line":16},[164,3026,252],{"class":251},[164,3028,594],{"class":251},[164,3030,256],{"class":255},[164,3032,3033],{"class":259}," Product",[164,3035,279],{"class":255},[164,3037,282],{"class":251},[164,3039,285],{"class":255},[164,3041,710],{"class":288},[164,3043,292],{"class":255},[164,3045,3046],{"class":166,"line":185},[164,3047,343],{"emptyLinePlaceholder":342},[164,3049,3050,3052,3055,3057,3060],{"class":166,"line":191},[164,3051,721],{"class":352},[164,3053,3054],{"class":259}," props ",[164,3056,359],{"class":255},[164,3058,3059],{"class":362}," defineProps",[164,3061,3062],{"class":255},"<{\n",[164,3064,3065,3068,3070],{"class":166,"line":346},[164,3066,3067],{"class":384}," product",[164,3069,388],{"class":255},[164,3071,3072],{"class":597}," Product\n",[164,3074,3075,3078],{"class":166,"line":381},[164,3076,3077],{"class":255},"}>",[164,3079,734],{"class":259},[164,3081,3082],{"class":166,"line":424},[164,3083,343],{"emptyLinePlaceholder":342},[164,3085,3086,3088,3091,3093,3096,3098,3100],{"class":166,"line":461},[164,3087,721],{"class":352},[164,3089,3090],{"class":259}," formattedPrice ",[164,3092,359],{"class":255},[164,3094,3095],{"class":362}," computed",[164,3097,365],{"class":259},[164,3099,411],{"class":255},[164,3101,1404],{"class":352},[164,3103,3104,3107,3110,3112,3115,3117,3119,3122,3124,3126],{"class":166,"line":490},[164,3105,3106],{"class":255}," new",[164,3108,3109],{"class":259}," Intl",[164,3111,405],{"class":255},[164,3113,3114],{"class":362},"NumberFormat",[164,3116,365],{"class":259},[164,3118,368],{"class":255},[164,3120,3121],{"class":288},"en-US",[164,3123,368],{"class":255},[164,3125,263],{"class":255},[164,3127,378],{"class":255},[164,3129,3130,3133,3135,3137,3140,3142],{"class":166,"line":526},[164,3131,3132],{"class":384}," style",[164,3134,388],{"class":255},[164,3136,285],{"class":255},[164,3138,3139],{"class":288},"currency",[164,3141,368],{"class":255},[164,3143,421],{"class":255},[164,3145,3146,3149,3151,3153,3155,3157],{"class":166,"line":535},[164,3147,3148],{"class":384}," currency",[164,3150,388],{"class":255},[164,3152,285],{"class":255},[164,3154,41],{"class":288},[164,3156,368],{"class":255},[164,3158,421],{"class":255},[164,3160,3161,3163,3165,3167,3170,3172,3175,3178,3180,3182,3184,3187],{"class":166,"line":29},[164,3162,987],{"class":255},[164,3164,402],{"class":259},[164,3166,405],{"class":255},[164,3168,3169],{"class":362},"format",[164,3171,365],{"class":259},[164,3173,3174],{"class":362},"Number",[164,3176,3177],{"class":259},"(props",[164,3179,405],{"class":255},[164,3181,2905],{"class":259},[164,3183,405],{"class":255},[164,3185,3186],{"class":259},"price))",[164,3188,421],{"class":255},[164,3190,3191],{"class":166,"line":545},[164,3192,532],{"class":259},[164,3194,3195,3197,3199],{"class":166,"line":562},[164,3196,1809],{"class":255},[164,3198,1812],{"class":384},[164,3200,1540],{"class":255},[164,3202,3203],{"class":166,"line":578},[164,3204,343],{"emptyLinePlaceholder":342},[164,3206,3207,3209,3212],{"class":166,"line":583},[164,3208,1122],{"class":255},[164,3210,3211],{"class":384},"template",[164,3213,1540],{"class":255},[164,3215,3216,3219,3221,3224,3226,3228,3231,3233],{"class":166,"line":589},[164,3217,3218],{"class":255}," <",[164,3220,1782],{"class":384},[164,3222,3223],{"class":352}," class",[164,3225,359],{"class":255},[164,3227,368],{"class":255},[164,3229,3230],{"class":288},"product-card",[164,3232,368],{"class":255},[164,3234,1540],{"class":255},[164,3236,3237,3240,3242,3244,3247,3249,3251],{"class":166,"line":615},[164,3238,3239],{"class":255}," <",[164,3241,149],{"class":384},[164,3243,1160],{"class":255},[164,3245,3246],{"class":259},"{{ product.name }}",[164,3248,1809],{"class":255},[164,3250,149],{"class":384},[164,3252,1540],{"class":255},[164,3254,3255,3257,3259,3261,3264,3266,3268],{"class":166,"line":978},[164,3256,3239],{"class":255},[164,3258,102],{"class":384},[164,3260,1160],{"class":255},[164,3262,3263],{"class":259},"{{ formattedPrice }}",[164,3265,1809],{"class":255},[164,3267,102],{"class":384},[164,3269,1540],{"class":255},[164,3271,3272,3275,3277],{"class":166,"line":984},[164,3273,3274],{"class":255}," {\n expectTypeOf(usersApi.getAll()).resolves.toEqualTypeOf()\n})\n\ntest(\"usersApi.create accepts NewUser\", () => {\n expectTypeOf(usersApi.create).parameter(0).toEqualTypeOf()\n})\n",[161,3763,3764,3769,3789,3807,3811,3832,3869,3875,3879,3900,3939],{"__ignoreMap":159},[164,3765,3766],{"class":166,"line":167},[164,3767,3768],{"class":170},"// tests/types.test.ts\n",[164,3770,3771,3773,3775,3778,3780,3782,3784,3787],{"class":166,"line":174},[164,3772,252],{"class":251},[164,3774,256],{"class":255},[164,3776,3777],{"class":259}," expectTypeOf",[164,3779,279],{"class":255},[164,3781,282],{"class":251},[164,3783,285],{"class":255},[164,3785,3786],{"class":288},"expect-type",[164,3788,292],{"class":255},[164,3790,3791,3793,3795,3797,3799,3801,3803,3805],{"class":166,"line":16},[164,3792,252],{"class":251},[164,3794,256],{"class":255},[164,3796,1549],{"class":259},[164,3798,279],{"class":255},[164,3800,282],{"class":251},[164,3802,285],{"class":255},[164,3804,1559],{"class":288},[164,3806,292],{"class":255},[164,3808,3809],{"class":166,"line":185},[164,3810,343],{"emptyLinePlaceholder":342},[164,3812,3813,3815,3817,3819,3822,3824,3826,3828,3830],{"class":166,"line":191},[164,3814,2212],{"class":362},[164,3816,365],{"class":259},[164,3818,368],{"class":255},[164,3820,3821],{"class":288},"usersApi.getAll returns User[]",[164,3823,368],{"class":255},[164,3825,263],{"class":255},[164,3827,1313],{"class":255},[164,3829,797],{"class":352},[164,3831,378],{"class":255},[164,3833,3834,3837,3839,3842,3844,3846,3849,3851,3854,3856,3859,3861,3863,3865,3867],{"class":166,"line":346},[164,3835,3836],{"class":362}," expectTypeOf",[164,3838,365],{"class":384},[164,3840,3841],{"class":259},"usersApi",[164,3843,405],{"class":255},[164,3845,1642],{"class":362},[164,3847,3848],{"class":384},"())",[164,3850,405],{"class":255},[164,3852,3853],{"class":259},"resolves",[164,3855,405],{"class":255},[164,3857,3858],{"class":362},"toEqualTypeOf",[164,3860,1122],{"class":255},[164,3862,1724],{"class":597},[164,3864,1325],{"class":384},[164,3866,1160],{"class":255},[164,3868,734],{"class":384},[164,3870,3871,3873],{"class":166,"line":381},[164,3872,529],{"class":255},[164,3874,532],{"class":259},[164,3876,3877],{"class":166,"line":424},[164,3878,343],{"emptyLinePlaceholder":342},[164,3880,3881,3883,3885,3887,3890,3892,3894,3896,3898],{"class":166,"line":461},[164,3882,2212],{"class":362},[164,3884,365],{"class":259},[164,3886,368],{"class":255},[164,3888,3889],{"class":288},"usersApi.create accepts NewUser",[164,3891,368],{"class":255},[164,3893,263],{"class":255},[164,3895,1313],{"class":255},[164,3897,797],{"class":352},[164,3899,378],{"class":255},[164,3901,3902,3904,3906,3908,3910,3913,3915,3917,3920,3922,3924,3926,3928,3930,3932,3935,3937],{"class":166,"line":490},[164,3903,3836],{"class":362},[164,3905,365],{"class":384},[164,3907,3841],{"class":259},[164,3909,405],{"class":255},[164,3911,3912],{"class":259},"create",[164,3914,402],{"class":384},[164,3916,405],{"class":255},[164,3918,3919],{"class":362},"parameter",[164,3921,365],{"class":384},[164,3923,922],{"class":921},[164,3925,402],{"class":384},[164,3927,405],{"class":255},[164,3929,3858],{"class":362},[164,3931,1122],{"class":255},[164,3933,3934],{"class":597},"NewUser",[164,3936,1160],{"class":255},[164,3938,734],{"class":384},[164,3940,3941,3943],{"class":166,"line":526},[164,3942,529],{"class":255},[164,3944,532],{"class":259},[98,3946,3948],{"id":3947},"performance-considerations","Performance Considerations",[102,3950,3951],{},"Type safety doesn't have to impact performance:",[200,3953,3954,3960,3970,3979],{},[116,3955,3956,3959],{},[119,3957,3958],{},"Tree-shaking",": Unused types are removed in production",[116,3961,3962,3965,3966,3969],{},[119,3963,3964],{},"Type-only imports",": Use ",[161,3967,3968],{},"import type"," to avoid runtime overhead",[116,3971,3972,3965,3975,3978],{},[119,3973,3974],{},"Zod optimization",[161,3976,3977],{},"z.safeParse()"," for better performance",[116,3980,3981,3984],{},[119,3982,3983],{},"Code splitting",": Split types by feature/route",[98,3986,3988],{"id":3987},"conclusion","Conclusion",[102,3990,3991],{},"End-to-end type safety is no longer optional in 2026—it's a fundamental requirement for building reliable, maintainable applications. By leveraging modern tools like TypeScript, Zod, and type-safe frameworks, you can catch errors before they reach production and provide a better developer experience.",[102,3993,3994],{},"Start small by adding types to your most critical paths, then gradually expand coverage. The investment pays dividends in reduced bugs, better documentation, and improved developer confidence.",[3996,3997],"hr",{},[102,3999,4000,4003],{},[119,4001,4002],{},"Ready to implement end-to-end type safety?"," Start with your database schema and work outward. Each layer builds on the previous one, creating a solid foundation for your entire application.",[4005,4006,4007],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":159,"searchDepth":174,"depth":174,"links":4009},[4010,4011,4012,4016,4022,4027,4032,4037,4042,4043,4044],{"id":100,"depth":174,"text":91},{"id":107,"depth":174,"text":108},{"id":146,"depth":174,"text":147,"children":4013},[4014,4015],{"id":151,"depth":16,"text":152},{"id":197,"depth":16,"text":198},{"id":228,"depth":174,"text":229,"children":4017},[4018,4019,4020,4021],{"id":232,"depth":16,"text":233},{"id":636,"depth":16,"text":637},{"id":1027,"depth":16,"text":1028},{"id":1510,"depth":16,"text":1511},{"id":1817,"depth":174,"text":1818,"children":4023},[4024,4025,4026],{"id":1821,"depth":16,"text":1822},{"id":2067,"depth":16,"text":2068},{"id":2282,"depth":16,"text":2283},{"id":2420,"depth":174,"text":2421,"children":4028},[4029,4030,4031],{"id":2424,"depth":16,"text":2425},{"id":2648,"depth":16,"text":2649},{"id":2987,"depth":16,"text":2988},{"id":3289,"depth":174,"text":3290,"children":4033},[4034,4035,4036],{"id":3293,"depth":16,"text":3294},{"id":3360,"depth":16,"text":3361},{"id":3586,"depth":16,"text":3587},{"id":3675,"depth":174,"text":3676,"children":4038},[4039,4040,4041],{"id":3679,"depth":16,"text":3680},{"id":3709,"depth":16,"text":3710},{"id":3733,"depth":16,"text":3734},{"id":3757,"depth":174,"text":3758},{"id":3947,"depth":174,"text":3948},{"id":3987,"depth":174,"text":3988},"2026-02-22","Master end-to-end type safety in 2026 with TypeScript, Zod, and modern tools that eliminate runtime errors across your entire stack.","md",{"readingTime":4049},"11 min read","/blog/27-end-to-end-type-safety-guide-2026",{"title":91,"description":4046},"TypeScript Mastery","Advanced TypeScript patterns for full-stack development",{"src":4055,"mime":4056,"alt":4057,"width":4058,"height":4059},"/img/blog/27-end-to-end-type-safety-guide-2026/banner.svg","svg","End-to-End Type Safety - Connected type chain from database to frontend on blue gradient",1200,630,"blog/27-end-to-end-type-safety-guide-2026",[4062,4063,4064,3717,4065],"TypeScript","Type Safety","Full-Stack","API Design","N8RnEQivPlHqHoUy1OdwWQLnfChWlNh-gR5oMZhHnsA",[4068,4791,5933,10083,19298],{"id":4069,"title":4070,"abstract":92,"author":93,"authorUrl":92,"body":4071,"date":4775,"dateUpdated":4775,"description":4776,"excerpt":92,"extension":4047,"featured":342,"headline":92,"image":92,"meta":4777,"navigation":342,"ogImage":92,"path":4779,"seo":4780,"series":4052,"seriesDescription":4781,"seriesOrder":167,"socialImage":4782,"stem":4785,"tags":4786,"__hash__":4790},"blog/blog/18-typescript-2026-new-features.md","TypeScript 2026: New Features Every Developer Should Know",{"type":95,"value":4072,"toc":4745},[4073,4076,4079,4082,4086,4089,4093,4096,4261,4264,4268,4271,4275,4278,4282,4289,4293,4296,4300,4303,4307,4310,4432,4436,4439,4443,4446,4450,4453,4457,4460,4464,4467,4471,4474,4478,4481,4485,4489,4492,4678,4682,4685,4689,4692,4696,4699,4731,4733,4736,4739,4742],[98,4074,4070],{"id":4075},"typescript-2026-new-features-every-developer-should-know",[102,4077,4078],{},"TypeScript continues to evolve at a remarkable pace, and 2026 has brought some of the most significant updates since the language's inception. As someone who's been using TypeScript since version 3.0, I'm genuinely excited about how these new features are transforming the way we write type-safe code.",[102,4080,4081],{},"In this comprehensive guide, we'll explore the game-changing TypeScript features released in 2026, understand their practical applications, and see how they can improve your development workflow. Whether you're building Nuxt applications, Node.js backends, or full-stack solutions, these features will become essential tools in your toolkit.",[98,4083,4085],{"id":4084},"enhanced-type-inference","Enhanced Type Inference",[102,4087,4088],{},"TypeScript 5.8's improved type inference engine is nothing short of revolutionary. The compiler now understands context better than ever, reducing the need for explicit type annotations while maintaining complete type safety.",[149,4090,4092],{"id":4091},"const-type-parameters","Const Type Parameters",[102,4094,4095],{},"One of the most requested features has finally arrived. Const type parameters allow you to preserve literal types in generic functions, eliminating a whole class of type errors that previously required workarounds.",[154,4097,4099],{"className":156,"code":4098,"language":158,"meta":159,"style":159},"// Before TypeScript 5.8\nfunction wrap(value: T): { value: T } {\n return { value }\n}\nconst result = wrap(\"hello\") // Type: { value: string }\n\n// With const type parameters\nfunction wrap(value: T): { value: T } {\n return { value }\n}\nconst result = wrap(\"hello\") // Type: { value: 'hello' }\n",[161,4100,4101,4106,4141,4152,4156,4181,4185,4190,4224,4234,4238],{"__ignoreMap":159},[164,4102,4103],{"class":166,"line":167},[164,4104,4105],{"class":170},"// Before TypeScript 5.8\n",[164,4107,4108,4110,4113,4115,4117,4119,4122,4124,4126,4128,4130,4133,4135,4137,4139],{"class":166,"line":174},[164,4109,3410],{"class":352},[164,4111,4112],{"class":362}," wrap",[164,4114,1122],{"class":255},[164,4116,1125],{"class":597},[164,4118,1128],{"class":255},[164,4120,4121],{"class":791},"value",[164,4123,388],{"class":255},[164,4125,1895],{"class":597},[164,4127,1150],{"class":255},[164,4129,256],{"class":255},[164,4131,4132],{"class":384}," value",[164,4134,388],{"class":255},[164,4136,1895],{"class":597},[164,4138,279],{"class":255},[164,4140,378],{"class":255},[164,4142,4143,4145,4147,4149],{"class":166,"line":16},[164,4144,895],{"class":251},[164,4146,256],{"class":255},[164,4148,4132],{"class":259},[164,4150,4151],{"class":255}," }\n",[164,4153,4154],{"class":166,"line":185},[164,4155,1281],{"class":255},[164,4157,4158,4160,4163,4165,4167,4169,4171,4174,4176,4178],{"class":166,"line":191},[164,4159,721],{"class":352},[164,4161,4162],{"class":259}," result ",[164,4164,359],{"class":255},[164,4166,4112],{"class":362},[164,4168,365],{"class":259},[164,4170,368],{"class":255},[164,4172,4173],{"class":288},"hello",[164,4175,368],{"class":255},[164,4177,1223],{"class":259},[164,4179,4180],{"class":170},"// Type: { value: string }\n",[164,4182,4183],{"class":166,"line":346},[164,4184,343],{"emptyLinePlaceholder":342},[164,4186,4187],{"class":166,"line":381},[164,4188,4189],{"class":170},"// With const type parameters\n",[164,4191,4192,4194,4196,4198,4200,4202,4204,4206,4208,4210,4212,4214,4216,4218,4220,4222],{"class":166,"line":424},[164,4193,3410],{"class":352},[164,4195,4112],{"class":362},[164,4197,1122],{"class":255},[164,4199,721],{"class":352},[164,4201,1895],{"class":597},[164,4203,1128],{"class":255},[164,4205,4121],{"class":791},[164,4207,388],{"class":255},[164,4209,1895],{"class":597},[164,4211,1150],{"class":255},[164,4213,256],{"class":255},[164,4215,4132],{"class":384},[164,4217,388],{"class":255},[164,4219,1895],{"class":597},[164,4221,279],{"class":255},[164,4223,378],{"class":255},[164,4225,4226,4228,4230,4232],{"class":166,"line":461},[164,4227,895],{"class":251},[164,4229,256],{"class":255},[164,4231,4132],{"class":259},[164,4233,4151],{"class":255},[164,4235,4236],{"class":166,"line":490},[164,4237,1281],{"class":255},[164,4239,4240,4242,4244,4246,4248,4250,4252,4254,4256,4258],{"class":166,"line":526},[164,4241,721],{"class":352},[164,4243,4162],{"class":259},[164,4245,359],{"class":255},[164,4247,4112],{"class":362},[164,4249,365],{"class":259},[164,4251,368],{"class":255},[164,4253,4173],{"class":288},[164,4255,368],{"class":255},[164,4257,1223],{"class":259},[164,4259,4260],{"class":170},"// Type: { value: 'hello' }\n",[102,4262,4263],{},"This feature is particularly valuable when working with configuration objects, API responses, and any scenario where preserving literal types provides better type safety.",[149,4265,4267],{"id":4266},"improved-control-flow-analysis","Improved Control Flow Analysis",[102,4269,4270],{},"TypeScript 2026 introduces enhanced control flow analysis that tracks variable types through more complex code paths. This means fewer type assertions and better autocomplete in your IDE.",[98,4272,4274],{"id":4273},"module-resolution-improvements","Module Resolution Improvements",[102,4276,4277],{},"The new module resolution strategy, called \"bundler,\" is now the recommended approach for modern JavaScript projects. It aligns TypeScript's behavior with actual bundlers like Vite, Rollup, and Webpack, eliminating frustrating discrepancies between development and production builds.",[149,4279,4281],{"id":4280},"packagejson-exports-support","Package.json Exports Support",[102,4283,4284,4285,4288],{},"TypeScript now fully respects the ",[161,4286,4287],{},"exports"," field in package.json, providing better support for modern ESM packages and reducing issues with dual CJS/ESM packages.",[149,4290,4292],{"id":4291},"path-mapping-enhancements","Path Mapping Enhancements",[102,4294,4295],{},"Path aliases in tsconfig.json are now resolved more efficiently, with better support for monorepo setups and complex project structures. This is particularly beneficial for Nuxt projects with custom directory structures.",[98,4297,4299],{"id":4298},"template-literal-type-improvements","Template Literal Type Improvements",[102,4301,4302],{},"Template literal types have been supercharged in 2026, enabling more sophisticated type-level string manipulation. This opens up new possibilities for type-safe APIs, routing systems, and DSL implementations.",[149,4304,4306],{"id":4305},"string-manipulation-utilities","String Manipulation Utilities",[102,4308,4309],{},"New built-in utility types make it easier to work with string types:",[154,4311,4313],{"className":156,"code":4312,"language":158,"meta":159,"style":159},"type Route = `/api/${string}/users/${number}`\ntype ExtractId = T extends `/api/${string}/users/${infer Id extends number}`\n ? Id\n : never\ntype UserId = ExtractId<`/api/v1/users/123`> // Type: 123\n",[161,4314,4315,4346,4391,4399,4407],{"__ignoreMap":159},[164,4316,4317,4319,4322,4324,4327,4329,4331,4333,4335,4338,4340,4343],{"class":166,"line":167},[164,4318,1094],{"class":352},[164,4320,4321],{"class":597}," Route",[164,4323,601],{"class":255},[164,4325,4326],{"class":255}," `",[164,4328,1184],{"class":288},[164,4330,1187],{"class":255},[164,4332,1953],{"class":597},[164,4334,529],{"class":255},[164,4336,4337],{"class":288},"/users/",[164,4339,1187],{"class":255},[164,4341,4342],{"class":597},"number",[164,4344,4345],{"class":255},"}`\n",[164,4347,4348,4350,4353,4355,4357,4359,4361,4363,4365,4367,4369,4371,4373,4375,4377,4379,4381,4384,4386,4389],{"class":166,"line":174},[164,4349,1094],{"class":352},[164,4351,4352],{"class":597}," ExtractId",[164,4354,1122],{"class":255},[164,4356,1125],{"class":597},[164,4358,1160],{"class":255},[164,4360,601],{"class":255},[164,4362,1895],{"class":597},[164,4364,1878],{"class":352},[164,4366,4326],{"class":255},[164,4368,1184],{"class":288},[164,4370,1187],{"class":255},[164,4372,1953],{"class":597},[164,4374,529],{"class":255},[164,4376,4337],{"class":288},[164,4378,1187],{"class":255},[164,4380,2046],{"class":255},[164,4382,4383],{"class":597}," Id",[164,4385,1878],{"class":255},[164,4387,4388],{"class":597}," number",[164,4390,4345],{"class":255},[164,4392,4393,4396],{"class":166,"line":16},[164,4394,4395],{"class":255}," ?",[164,4397,4398],{"class":597}," Id\n",[164,4400,4401,4404],{"class":166,"line":185},[164,4402,4403],{"class":255}," :",[164,4405,4406],{"class":597}," never\n",[164,4408,4409,4411,4414,4416,4418,4420,4422,4425,4427,4429],{"class":166,"line":191},[164,4410,1094],{"class":352},[164,4412,4413],{"class":597}," UserId",[164,4415,601],{"class":255},[164,4417,4352],{"class":597},[164,4419,1122],{"class":255},[164,4421,1181],{"class":255},[164,4423,4424],{"class":288},"/api/v1/users/123",[164,4426,1181],{"class":255},[164,4428,1160],{"class":255},[164,4430,4431],{"class":170}," // Type: 123\n",[149,4433,4435],{"id":4434},"enhanced-inference-in-template-literals","Enhanced Inference in Template Literals",[102,4437,4438],{},"The compiler now better infers types from template literal patterns, making it easier to work with dynamic strings while maintaining type safety.",[98,4440,4442],{"id":4441},"decorator-standardization","Decorator Standardization",[102,4444,4445],{},"After years of experimental support, decorators are now fully standardized in TypeScript 2026, following the TC39 Stage 3 proposal. This brings stability to metadata-driven programming patterns commonly used in frameworks like NestJS and Angular.",[149,4447,4449],{"id":4448},"class-decorators","Class Decorators",[102,4451,4452],{},"Class decorators now work consistently across all JavaScript runtimes, enabling powerful patterns for dependency injection, logging, and validation.",[149,4454,4456],{"id":4455},"method-and-property-decorators","Method and Property Decorators",[102,4458,4459],{},"Method and property decorators provide fine-grained control over class behavior, making it easier to implement cross-cutting concerns like authentication, caching, and rate limiting.",[98,4461,4463],{"id":4462},"performance-improvements","Performance Improvements",[102,4465,4466],{},"TypeScript 2026 isn't just about new features—it's also significantly faster. The compiler team has focused on reducing build times, especially for large projects.",[149,4468,4470],{"id":4469},"incremental-compilation-enhancements","Incremental Compilation Enhancements",[102,4472,4473],{},"Incremental compilation is now up to 40% faster for large codebases, thanks to improved caching strategies and more efficient dependency tracking.",[149,4475,4477],{"id":4476},"project-references-optimization","Project References Optimization",[102,4479,4480],{},"Project references, essential for monorepo setups, now resolve dependencies more efficiently, reducing overall build times in complex workspace configurations.",[98,4482,4484],{"id":4483},"practical-applications","Practical Applications",[149,4486,4488],{"id":4487},"building-type-safe-apis","Building Type-Safe APIs",[102,4490,4491],{},"The new TypeScript features make it easier than ever to build type-safe APIs. Combined with tools like Zod for runtime validation, you can ensure type safety from database to frontend.",[154,4493,4495],{"className":156,"code":4494,"language":158,"meta":159,"style":159},"// Type-safe API response\ntype ApiResponse = {\n data: T\n meta: {\n timestamp: string\n version: \"v1\" | \"v2\"\n }\n}\n\nasync function fetchUser(\n id: number,\n): Promise> {\n const response = await fetch(`/api/users/${id}`)\n return response.json()\n}\n",[161,4496,4497,4502,4518,4528,4537,4546,4569,4573,4577,4581,4592,4602,4636,4662,4674],{"__ignoreMap":159},[164,4498,4499],{"class":166,"line":167},[164,4500,4501],{"class":170},"// Type-safe API response\n",[164,4503,4504,4506,4508,4510,4512,4514,4516],{"class":166,"line":174},[164,4505,1094],{"class":352},[164,4507,2031],{"class":597},[164,4509,1122],{"class":255},[164,4511,1125],{"class":597},[164,4513,1160],{"class":255},[164,4515,601],{"class":255},[164,4517,378],{"class":255},[164,4519,4520,4523,4525],{"class":166,"line":16},[164,4521,4522],{"class":384}," data",[164,4524,388],{"class":255},[164,4526,4527],{"class":597}," T\n",[164,4529,4530,4533,4535],{"class":166,"line":185},[164,4531,4532],{"class":384}," meta",[164,4534,388],{"class":255},[164,4536,378],{"class":255},[164,4538,4539,4542,4544],{"class":166,"line":191},[164,4540,4541],{"class":384}," timestamp",[164,4543,388],{"class":255},[164,4545,3389],{"class":597},[164,4547,4548,4551,4553,4555,4557,4559,4562,4564,4567],{"class":166,"line":346},[164,4549,4550],{"class":384}," version",[164,4552,388],{"class":255},[164,4554,285],{"class":255},[164,4556,971],{"class":288},[164,4558,368],{"class":255},[164,4560,4561],{"class":255}," |",[164,4563,285],{"class":255},[164,4565,4566],{"class":288},"v2",[164,4568,292],{"class":255},[164,4570,4571],{"class":166,"line":381},[164,4572,1260],{"class":255},[164,4574,4575],{"class":166,"line":424},[164,4576,1281],{"class":255},[164,4578,4579],{"class":166,"line":461},[164,4580,343],{"emptyLinePlaceholder":342},[164,4582,4583,4585,4587,4590],{"class":166,"line":490},[164,4584,1113],{"class":352},[164,4586,1116],{"class":352},[164,4588,4589],{"class":362}," fetchUser",[164,4591,2671],{"class":255},[164,4593,4594,4596,4598,4600],{"class":166,"line":526},[164,4595,385],{"class":791},[164,4597,388],{"class":255},[164,4599,4388],{"class":597},[164,4601,421],{"class":255},[164,4603,4604,4606,4608,4610,4613,4615,4617,4619,4621,4624,4627,4629,4631,4634],{"class":166,"line":535},[164,4605,1150],{"class":255},[164,4607,1153],{"class":597},[164,4609,1122],{"class":255},[164,4611,4612],{"class":597},"ApiResponse",[164,4614,1672],{"class":255},[164,4616,2713],{"class":384},[164,4618,388],{"class":255},[164,4620,4388],{"class":597},[164,4622,4623],{"class":255},";",[164,4625,4626],{"class":384}," name",[164,4628,388],{"class":255},[164,4630,1136],{"class":597},[164,4632,4633],{"class":255}," }>>",[164,4635,378],{"class":255},[164,4637,4638,4640,4642,4644,4646,4648,4650,4652,4654,4656,4658,4660],{"class":166,"line":29},[164,4639,804],{"class":352},[164,4641,1169],{"class":259},[164,4643,601],{"class":255},[164,4645,853],{"class":251},[164,4647,1176],{"class":362},[164,4649,365],{"class":384},[164,4651,1181],{"class":255},[164,4653,1374],{"class":288},[164,4655,1187],{"class":255},[164,4657,397],{"class":259},[164,4659,1192],{"class":255},[164,4661,532],{"class":384},[164,4663,4664,4666,4668,4670,4672],{"class":166,"line":545},[164,4665,895],{"class":251},[164,4667,1169],{"class":259},[164,4669,405],{"class":255},[164,4671,773],{"class":362},[164,4673,734],{"class":384},[164,4675,4676],{"class":166,"line":562},[164,4677,1281],{"class":255},[149,4679,4681],{"id":4680},"enhanced-nuxt-development","Enhanced Nuxt Development",[102,4683,4684],{},"Nuxt 4 developers benefit significantly from TypeScript 2026's improvements. Better type inference means less boilerplate in composables and pages, while improved module resolution simplifies working with Nuxt's auto-imports.",[149,4686,4688],{"id":4687},"full-stack-type-safety","Full-Stack Type Safety",[102,4690,4691],{},"With TypeScript 2026, sharing types between frontend and backend becomes even more seamless. The improved module resolution and type inference make it practical to maintain a single source of truth for your data models.",[98,4693,4695],{"id":4694},"migration-strategies","Migration Strategies",[102,4697,4698],{},"If you're upgrading from an older TypeScript version, here's a practical migration strategy:",[200,4700,4701,4707,4713,4719,4725],{},[116,4702,4703,4706],{},[119,4704,4705],{},"Update TypeScript",": Start with the latest version and fix any breaking changes",[116,4708,4709,4712],{},[119,4710,4711],{},"Enable Strict Mode",": If you haven't already, enable all strict type-checking options",[116,4714,4715,4718],{},[119,4716,4717],{},"Adopt New Features Gradually",": Start with const type parameters and enhanced inference",[116,4720,4721,4724],{},[119,4722,4723],{},"Update Tooling",": Ensure your build tools and IDE extensions support TypeScript 2026",[116,4726,4727,4730],{},[119,4728,4729],{},"Test Thoroughly",": Run your full test suite to catch any type-related issues",[98,4732,3988],{"id":3987},[102,4734,4735],{},"TypeScript 2026 represents a major leap forward in type safety, developer experience, and performance. The new features—particularly const type parameters, improved module resolution, and enhanced template literal types—solve real-world problems that developers face daily.",[102,4737,4738],{},"As the TypeScript ecosystem continues to mature, staying current with these features becomes essential for writing maintainable, type-safe code. Whether you're building a small project or a large enterprise application, TypeScript 2026 provides the tools you need to catch errors early and ship with confidence.",[102,4740,4741],{},"Start experimenting with these features today, and you'll quickly discover how they can transform your development workflow. The future of type-safe JavaScript is here, and it's more powerful than ever.",[4005,4743,4744],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":159,"searchDepth":174,"depth":174,"links":4746},[4747,4748,4752,4756,4760,4764,4768,4773,4774],{"id":4075,"depth":174,"text":4070},{"id":4084,"depth":174,"text":4085,"children":4749},[4750,4751],{"id":4091,"depth":16,"text":4092},{"id":4266,"depth":16,"text":4267},{"id":4273,"depth":174,"text":4274,"children":4753},[4754,4755],{"id":4280,"depth":16,"text":4281},{"id":4291,"depth":16,"text":4292},{"id":4298,"depth":174,"text":4299,"children":4757},[4758,4759],{"id":4305,"depth":16,"text":4306},{"id":4434,"depth":16,"text":4435},{"id":4441,"depth":174,"text":4442,"children":4761},[4762,4763],{"id":4448,"depth":16,"text":4449},{"id":4455,"depth":16,"text":4456},{"id":4462,"depth":174,"text":4463,"children":4765},[4766,4767],{"id":4469,"depth":16,"text":4470},{"id":4476,"depth":16,"text":4477},{"id":4483,"depth":174,"text":4484,"children":4769},[4770,4771,4772],{"id":4487,"depth":16,"text":4488},{"id":4680,"depth":16,"text":4681},{"id":4687,"depth":16,"text":4688},{"id":4694,"depth":174,"text":4695},{"id":3987,"depth":174,"text":3988},"2026-03-04","Discover the groundbreaking TypeScript features released in 2026 that are changing how we write type-safe code, from enhanced inference to revolutionary module resolution.",{"readingTime":4778},"9 min read","/blog/18-typescript-2026-new-features",{"title":4070,"description":4776},"Deep dive into TypeScript patterns and best practices",{"src":4783,"mime":4056,"alt":4784,"width":4058,"height":4059},"/img/blog/18-typescript-2026-new-features/banner.svg","TypeScript 2026 New Features - Blue TypeScript logo with futuristic code symbols and type annotations on dark gradient background","blog/18-typescript-2026-new-features",[4062,4787,4063,4788,4789],"JavaScript","Developer Tools","Programming","lVbd1y-qOowjY4JFvMrjN2NpGzo2eWc-_ykXGeFQyrs",{"id":4792,"title":4793,"abstract":4794,"author":4795,"authorUrl":4796,"body":4797,"date":5918,"dateUpdated":5918,"description":5919,"excerpt":92,"extension":4047,"featured":342,"headline":5858,"image":92,"meta":5920,"navigation":342,"ogImage":92,"path":5857,"seo":5922,"series":4052,"seriesDescription":5923,"seriesOrder":167,"socialImage":5924,"stem":5927,"tags":5928,"__hash__":5932},"blog/blog/2-my-vscode-setup.md","My VSCode Setup | Blog","Learn how the Minimal Mist theme and custom VSCode settings create a clean, focused, and accessible coding environment.","Muhammad Ubaid Raza","/",{"type":95,"value":4798,"toc":5885},[4799,4803,4806,4813,4817,4820,4823,4837,4849,4853,4857,4864,4867,4871,4874,4877,4881,4884,4888,4891,4902,4906,4910,4913,4917,4920,4924,4927,4931,4934,4939,4946,4949,4953,4959,4962,4966,4972,5514,5518,5521,5529,5537,5545,5553,5561,5569,5573,5576,5580,5612,5616,5646,5650,5670,5674,5677,5703,5707,5710,5714,5734,5738,5751,5755,5774,5778,5781,5807,5818,5822,5825,5828,5831,5834,5837,5839,5843,5849,5882],[98,4800,4802],{"id":4801},"my-vscode-setup-a-journey-to-minimal-perfection","My VSCode Setup: A Journey to Minimal Perfection",[102,4804,4805],{},"As developers, we spend countless hours staring at our code editors. The environment we work in significantly impacts our productivity, focus, and even our well-being. After years of experimenting with different themes, extensions, and configurations, I've finally crafted a VSCode setup that I absolutely love—and I'm excited to share it with you.",[102,4807,4808,4809,4812],{},"Meet ",[119,4810,4811],{},"Minimal Mist",", a theme I created that embodies everything I believe a coding environment should be: clean, distraction-free, and easy on the eyes.",[98,4814,4816],{"id":4815},"the-philosophy-behind-minimal-mist","The Philosophy Behind Minimal Mist",[102,4818,4819],{},"Before diving into the technical details, let me share the thinking behind this setup. I've always been drawn to minimalist design—not because it's trendy, but because it serves a purpose. When your environment is cluttered with unnecessary visual elements, your brain has to work harder to filter out the noise and focus on what matters: your code.",[102,4821,4822],{},"I wanted to create a theme that would:",[113,4824,4825,4828,4831,4834],{},[116,4826,4827],{},"Reduce visual fatigue during long coding sessions",[116,4829,4830],{},"Minimize distractions while maintaining essential functionality",[116,4832,4833],{},"Provide excellent readability in both light and dark environments",[116,4835,4836],{},"Feel modern and professional",[102,4838,4839],{},[119,4840,4841,4842],{},"You can install Minimal Mist from the VSCode marketplace: ",[4843,4844,4848],"a",{"href":4845,"rel":4846},"https://marketplace.visualstudio.com/items?itemName=mubaidr.minimal-mist",[4847],"nofollow","Minimal Mist - Visual Studio Marketplace",[98,4850,4852],{"id":4851},"why-i-chose-these-design-principles","Why I Chose These Design Principles",[149,4854,4856],{"id":4855},"_1-subtle-background-colors","1. Subtle Background Colors",[102,4858,4859,4860,4863],{},"The foundation of any good theme starts with the background. For the light theme, I chose ",[161,4861,4862],{},"#f6f5f0","—a warm, off-white color that's much easier on the eyes than pure white. This subtle beige tone reduces the harsh contrast that can cause eye strain, especially during extended coding sessions.",[102,4865,4866],{},"For the dark theme, I selected a deep, muted background that provides enough contrast for text readability without being stark black. The goal was to create a sense of depth and comfort.",[149,4868,4870],{"id":4869},"_2-shadow-free-interface","2. Shadow-Free Interface",[102,4872,4873],{},"One of the most impactful decisions I made was eliminating shadows throughout the interface. While shadows can add depth to a design, in a code editor, they often create visual noise that distracts from the content. Removing them results in a cleaner, more focused appearance that lets your code take center stage.",[102,4875,4876],{},"This approach also makes the interface feel lighter and more modern, aligning with contemporary design trends that favor clean, flat aesthetics.",[149,4878,4880],{"id":4879},"_3-streamlined-borders","3. Streamlined Borders",[102,4882,4883],{},"Borders, when overused, can fragment the interface and make it feel cluttered. I carefully reviewed every border in the VSCode interface and either removed, minimized, or softened them. The result is a more cohesive visual experience where related elements feel naturally grouped together.",[149,4885,4887],{"id":4886},"_4-thoughtful-color-choices","4. Thoughtful Color Choices",[102,4889,4890],{},"The syntax highlighting in Minimal Mist uses a carefully curated palette that provides excellent contrast without being overwhelming. I chose colors that:",[113,4892,4893,4896,4899],{},[116,4894,4895],{},"Maintain semantic meaning (keywords, strings, comments each have distinct, logical colors)",[116,4897,4898],{},"Work harmoniously together without creating visual chaos",[116,4900,4901],{},"Remain accessible for users with different types of color vision",[98,4903,4905],{"id":4904},"features-that-make-a-difference","Features That Make a Difference",[149,4907,4909],{"id":4908},"unified-design-language","Unified Design Language",[102,4911,4912],{},"Both the light and dark variants of Minimal Mist follow the same design principles. This consistency means you can switch between themes based on your environment or time of day without feeling like you're using a completely different editor.",[149,4914,4916],{"id":4915},"enhanced-readability","Enhanced Readability",[102,4918,4919],{},"Every color choice was tested extensively to ensure optimal contrast ratios. Whether you're reading comments, scanning through function names, or debugging complex logic, the text remains crisp and easy to read.",[149,4921,4923],{"id":4922},"reduced-eye-strain","Reduced Eye Strain",[102,4925,4926],{},"The combination of subtle backgrounds, carefully chosen syntax colors, and reduced visual clutter helps minimize eye fatigue. This is particularly important for developers who spend 8+ hours a day looking at code.",[98,4928,4930],{"id":4929},"visual-preview","Visual Preview",[102,4932,4933],{},"Here's what you can expect from Minimal Mist in action:",[4935,4936,4938],"h4",{"id":4937},"typescript-light-mode","TypeScript (Light Mode)",[102,4940,4941],{},[4942,4943],"img",{"alt":4944,"src":4945},"Screenshot of VSCode with Minimal Mist theme in light mode, editing a TypeScript file","/img/blog/2-my-vscode-setup/typescript-light.png",[102,4947,4948],{},"The light mode showcases the warm, subtle background that reduces glare while maintaining excellent readability. Notice how the syntax highlighting provides clear differentiation between different code elements without being overwhelming.",[4935,4950,4952],{"id":4951},"typescript-dark-mode","TypeScript (Dark Mode)",[102,4954,4955],{},[4942,4956],{"alt":4957,"src":4958},"Screenshot of VSCode with Minimal Mist theme in dark mode, editing a TypeScript file","/img/blog/2-my-vscode-setup/typescript-dark.png",[102,4960,4961],{},"The dark mode offers a sophisticated, modern look that's perfect for low-light environments. The carefully balanced contrast ensures that you can code comfortably without straining your eyes.",[98,4963,4965],{"id":4964},"my-complete-vscode-configuration","My Complete VSCode Configuration",[102,4967,4968,4969,388],{},"A great theme is only part of the equation. To achieve the clean, minimal look shown in the screenshots, I've also customized various VSCode settings. Here's my complete configuration that you can add to your ",[161,4970,4971],{},"settings.json",[154,4973,4976],{"className":4974,"code":4975,"language":773,"meta":159,"style":159},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"editor.renderLineHighlight\": \"none\",\n \"editor.scrollbar.vertical\": \"hidden\",\n \"editor.scrollbar.horizontal\": \"hidden\",\n \"editor.minimap.enabled\": false,\n \"editor.lineNumbers\": \"relative\",\n \"editor.cursorBlinking\": \"smooth\",\n \"editor.fontFamily\": \"JetBrains Mono, Fira Code, monospace\",\n \"editor.fontSize\": 14,\n \"editor.lineHeight\": 1.6,\n \"editor.tabSize\": 2,\n \"editor.insertSpaces\": true,\n \"editor.wordWrap\": \"on\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\"\n },\n \"window.commandCenter\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"window.titleBarStyle\": \"custom\",\n \"workbench.editor.tabActionCloseVisibility\": false,\n \"workbench.editor.tabSizing\": \"fixed\",\n \"workbench.editor.tabSizingFixedMaxWidth\": 240,\n \"workbench.editor.tabSizingFixedMinWidth\": 180,\n \"workbench.sideBar.location\": \"right\",\n \"workbench.statusBar.visible\": false,\n \"workbench.tree.indent\": 22,\n \"workbench.tree.renderIndentGuides\": \"none\",\n \"workbench.startupEditor\": \"none\",\n \"workbench.editor.enablePreview\": false,\n \"breadcrumbs.enabled\": false,\n \"explorer.confirmDelete\": false,\n \"explorer.confirmDragAndDrop\": false\n}\n",[161,4977,4978,4982,5002,5022,5041,5055,5075,5095,5115,5131,5147,5163,5177,5197,5210,5223,5242,5246,5259,5279,5299,5312,5332,5348,5364,5384,5397,5413,5432,5452,5466,5480,5494,5509],{"__ignoreMap":159},[164,4979,4980],{"class":166,"line":167},[164,4981,906],{"class":255},[164,4983,4984,4986,4989,4991,4993,4995,4998,5000],{"class":166,"line":174},[164,4985,2676],{"class":255},[164,4987,4988],{"class":352},"editor.renderLineHighlight",[164,4990,368],{"class":255},[164,4992,388],{"class":255},[164,4994,285],{"class":255},[164,4996,4997],{"class":288},"none",[164,4999,368],{"class":255},[164,5001,421],{"class":255},[164,5003,5004,5006,5009,5011,5013,5015,5018,5020],{"class":166,"line":16},[164,5005,2676],{"class":255},[164,5007,5008],{"class":352},"editor.scrollbar.vertical",[164,5010,368],{"class":255},[164,5012,388],{"class":255},[164,5014,285],{"class":255},[164,5016,5017],{"class":288},"hidden",[164,5019,368],{"class":255},[164,5021,421],{"class":255},[164,5023,5024,5026,5029,5031,5033,5035,5037,5039],{"class":166,"line":185},[164,5025,2676],{"class":255},[164,5027,5028],{"class":352},"editor.scrollbar.horizontal",[164,5030,368],{"class":255},[164,5032,388],{"class":255},[164,5034,285],{"class":255},[164,5036,5017],{"class":288},[164,5038,368],{"class":255},[164,5040,421],{"class":255},[164,5042,5043,5045,5048,5050,5052],{"class":166,"line":191},[164,5044,2676],{"class":255},[164,5046,5047],{"class":352},"editor.minimap.enabled",[164,5049,368],{"class":255},[164,5051,388],{"class":255},[164,5053,5054],{"class":255}," false,\n",[164,5056,5057,5059,5062,5064,5066,5068,5071,5073],{"class":166,"line":346},[164,5058,2676],{"class":255},[164,5060,5061],{"class":352},"editor.lineNumbers",[164,5063,368],{"class":255},[164,5065,388],{"class":255},[164,5067,285],{"class":255},[164,5069,5070],{"class":288},"relative",[164,5072,368],{"class":255},[164,5074,421],{"class":255},[164,5076,5077,5079,5082,5084,5086,5088,5091,5093],{"class":166,"line":381},[164,5078,2676],{"class":255},[164,5080,5081],{"class":352},"editor.cursorBlinking",[164,5083,368],{"class":255},[164,5085,388],{"class":255},[164,5087,285],{"class":255},[164,5089,5090],{"class":288},"smooth",[164,5092,368],{"class":255},[164,5094,421],{"class":255},[164,5096,5097,5099,5102,5104,5106,5108,5111,5113],{"class":166,"line":424},[164,5098,2676],{"class":255},[164,5100,5101],{"class":352},"editor.fontFamily",[164,5103,368],{"class":255},[164,5105,388],{"class":255},[164,5107,285],{"class":255},[164,5109,5110],{"class":288},"JetBrains Mono, Fira Code, monospace",[164,5112,368],{"class":255},[164,5114,421],{"class":255},[164,5116,5117,5119,5122,5124,5126,5129],{"class":166,"line":461},[164,5118,2676],{"class":255},[164,5120,5121],{"class":352},"editor.fontSize",[164,5123,368],{"class":255},[164,5125,388],{"class":255},[164,5127,5128],{"class":921}," 14",[164,5130,421],{"class":255},[164,5132,5133,5135,5138,5140,5142,5145],{"class":166,"line":490},[164,5134,2676],{"class":255},[164,5136,5137],{"class":352},"editor.lineHeight",[164,5139,368],{"class":255},[164,5141,388],{"class":255},[164,5143,5144],{"class":921}," 1.6",[164,5146,421],{"class":255},[164,5148,5149,5151,5154,5156,5158,5161],{"class":166,"line":526},[164,5150,2676],{"class":255},[164,5152,5153],{"class":352},"editor.tabSize",[164,5155,368],{"class":255},[164,5157,388],{"class":255},[164,5159,5160],{"class":921}," 2",[164,5162,421],{"class":255},[164,5164,5165,5167,5170,5172,5174],{"class":166,"line":535},[164,5166,2676],{"class":255},[164,5168,5169],{"class":352},"editor.insertSpaces",[164,5171,368],{"class":255},[164,5173,388],{"class":255},[164,5175,5176],{"class":255}," true,\n",[164,5178,5179,5181,5184,5186,5188,5190,5193,5195],{"class":166,"line":29},[164,5180,2676],{"class":255},[164,5182,5183],{"class":352},"editor.wordWrap",[164,5185,368],{"class":255},[164,5187,388],{"class":255},[164,5189,285],{"class":255},[164,5191,5192],{"class":288},"on",[164,5194,368],{"class":255},[164,5196,421],{"class":255},[164,5198,5199,5201,5204,5206,5208],{"class":166,"line":545},[164,5200,2676],{"class":255},[164,5202,5203],{"class":352},"editor.formatOnSave",[164,5205,368],{"class":255},[164,5207,388],{"class":255},[164,5209,5176],{"class":255},[164,5211,5212,5214,5217,5219,5221],{"class":166,"line":562},[164,5213,2676],{"class":255},[164,5215,5216],{"class":352},"editor.codeActionsOnSave",[164,5218,368],{"class":255},[164,5220,388],{"class":255},[164,5222,378],{"class":255},[164,5224,5225,5228,5231,5233,5235,5237,5240],{"class":166,"line":578},[164,5226,5227],{"class":255}," \"",[164,5229,5230],{"class":597},"source.fixAll.eslint",[164,5232,368],{"class":255},[164,5234,388],{"class":255},[164,5236,285],{"class":255},[164,5238,5239],{"class":288},"explicit",[164,5241,292],{"class":255},[164,5243,5244],{"class":166,"line":583},[164,5245,1748],{"class":255},[164,5247,5248,5250,5253,5255,5257],{"class":166,"line":589},[164,5249,2676],{"class":255},[164,5251,5252],{"class":352},"window.commandCenter",[164,5254,368],{"class":255},[164,5256,388],{"class":255},[164,5258,5054],{"class":255},[164,5260,5261,5263,5266,5268,5270,5272,5275,5277],{"class":166,"line":615},[164,5262,2676],{"class":255},[164,5264,5265],{"class":352},"window.menuBarVisibility",[164,5267,368],{"class":255},[164,5269,388],{"class":255},[164,5271,285],{"class":255},[164,5273,5274],{"class":288},"compact",[164,5276,368],{"class":255},[164,5278,421],{"class":255},[164,5280,5281,5283,5286,5288,5290,5292,5295,5297],{"class":166,"line":978},[164,5282,2676],{"class":255},[164,5284,5285],{"class":352},"window.titleBarStyle",[164,5287,368],{"class":255},[164,5289,388],{"class":255},[164,5291,285],{"class":255},[164,5293,5294],{"class":288},"custom",[164,5296,368],{"class":255},[164,5298,421],{"class":255},[164,5300,5301,5303,5306,5308,5310],{"class":166,"line":984},[164,5302,2676],{"class":255},[164,5304,5305],{"class":352},"workbench.editor.tabActionCloseVisibility",[164,5307,368],{"class":255},[164,5309,388],{"class":255},[164,5311,5054],{"class":255},[164,5313,5314,5316,5319,5321,5323,5325,5328,5330],{"class":166,"line":992},[164,5315,2676],{"class":255},[164,5317,5318],{"class":352},"workbench.editor.tabSizing",[164,5320,368],{"class":255},[164,5322,388],{"class":255},[164,5324,285],{"class":255},[164,5326,5327],{"class":288},"fixed",[164,5329,368],{"class":255},[164,5331,421],{"class":255},[164,5333,5334,5336,5339,5341,5343,5346],{"class":166,"line":999},[164,5335,2676],{"class":255},[164,5337,5338],{"class":352},"workbench.editor.tabSizingFixedMaxWidth",[164,5340,368],{"class":255},[164,5342,388],{"class":255},[164,5344,5345],{"class":921}," 240",[164,5347,421],{"class":255},[164,5349,5350,5352,5355,5357,5359,5362],{"class":166,"line":1004},[164,5351,2676],{"class":255},[164,5353,5354],{"class":352},"workbench.editor.tabSizingFixedMinWidth",[164,5356,368],{"class":255},[164,5358,388],{"class":255},[164,5360,5361],{"class":921}," 180",[164,5363,421],{"class":255},[164,5365,5366,5368,5371,5373,5375,5377,5380,5382],{"class":166,"line":1010},[164,5367,2676],{"class":255},[164,5369,5370],{"class":352},"workbench.sideBar.location",[164,5372,368],{"class":255},[164,5374,388],{"class":255},[164,5376,285],{"class":255},[164,5378,5379],{"class":288},"right",[164,5381,368],{"class":255},[164,5383,421],{"class":255},[164,5385,5386,5388,5391,5393,5395],{"class":166,"line":1466},[164,5387,2676],{"class":255},[164,5389,5390],{"class":352},"workbench.statusBar.visible",[164,5392,368],{"class":255},[164,5394,388],{"class":255},[164,5396,5054],{"class":255},[164,5398,5399,5401,5404,5406,5408,5411],{"class":166,"line":1495},[164,5400,2676],{"class":255},[164,5402,5403],{"class":352},"workbench.tree.indent",[164,5405,368],{"class":255},[164,5407,388],{"class":255},[164,5409,5410],{"class":921}," 22",[164,5412,421],{"class":255},[164,5414,5415,5417,5420,5422,5424,5426,5428,5430],{"class":166,"line":1505},[164,5416,2676],{"class":255},[164,5418,5419],{"class":352},"workbench.tree.renderIndentGuides",[164,5421,368],{"class":255},[164,5423,388],{"class":255},[164,5425,285],{"class":255},[164,5427,4997],{"class":288},[164,5429,368],{"class":255},[164,5431,421],{"class":255},[164,5433,5435,5437,5440,5442,5444,5446,5448,5450],{"class":166,"line":5434},29,[164,5436,2676],{"class":255},[164,5438,5439],{"class":352},"workbench.startupEditor",[164,5441,368],{"class":255},[164,5443,388],{"class":255},[164,5445,285],{"class":255},[164,5447,4997],{"class":288},[164,5449,368],{"class":255},[164,5451,421],{"class":255},[164,5453,5455,5457,5460,5462,5464],{"class":166,"line":5454},30,[164,5456,2676],{"class":255},[164,5458,5459],{"class":352},"workbench.editor.enablePreview",[164,5461,368],{"class":255},[164,5463,388],{"class":255},[164,5465,5054],{"class":255},[164,5467,5469,5471,5474,5476,5478],{"class":166,"line":5468},31,[164,5470,2676],{"class":255},[164,5472,5473],{"class":352},"breadcrumbs.enabled",[164,5475,368],{"class":255},[164,5477,388],{"class":255},[164,5479,5054],{"class":255},[164,5481,5483,5485,5488,5490,5492],{"class":166,"line":5482},32,[164,5484,2676],{"class":255},[164,5486,5487],{"class":352},"explorer.confirmDelete",[164,5489,368],{"class":255},[164,5491,388],{"class":255},[164,5493,5054],{"class":255},[164,5495,5497,5499,5502,5504,5506],{"class":166,"line":5496},33,[164,5498,2676],{"class":255},[164,5500,5501],{"class":352},"explorer.confirmDragAndDrop",[164,5503,368],{"class":255},[164,5505,388],{"class":255},[164,5507,5508],{"class":255}," false\n",[164,5510,5512],{"class":166,"line":5511},34,[164,5513,1281],{"class":255},[149,5515,5517],{"id":5516},"breaking-down-the-key-settings","Breaking Down the Key Settings",[102,5519,5520],{},"Let me explain some of the most impactful settings:",[102,5522,5523,5528],{},[119,5524,5525],{},[161,5526,5527],{},"\"editor.renderLineHighlight\": \"none\""," - Removes the highlight on the current line, reducing visual clutter.",[102,5530,5531,5536],{},[119,5532,5533],{},[161,5534,5535],{},"\"editor.scrollbar.vertical\": \"hidden\""," - Hides the scrollbar to create a cleaner interface. You can still scroll normally.",[102,5538,5539,5544],{},[119,5540,5541],{},[161,5542,5543],{},"\"window.commandCenter\": false\""," - Disables the command center in the title bar for a cleaner look.",[102,5546,5547,5552],{},[119,5548,5549],{},[161,5550,5551],{},"\"workbench.statusBar.visible\": false\""," - Hides the status bar at the bottom, removing unnecessary information.",[102,5554,5555,5560],{},[119,5556,5557],{},[161,5558,5559],{},"\"workbench.sideBar.location\": \"right\""," - Moves the sidebar to the right, which I find less distracting when reading code.",[102,5562,5563,5568],{},[119,5564,5565],{},[161,5566,5567],{},"\"editor.lineNumbers\": \"relative\""," - Shows relative line numbers, which is incredibly useful for Vim-style navigation.",[98,5570,5572],{"id":5571},"essential-extensions-for-a-complete-setup","Essential Extensions for a Complete Setup",[102,5574,5575],{},"While the theme and settings create the visual foundation, these extensions complete my development environment:",[149,5577,5579],{"id":5578},"productivity-extensions","Productivity Extensions",[113,5581,5582,5588,5594,5600,5606],{},[116,5583,5584,5587],{},[119,5585,5586],{},"Vim"," - For efficient text editing and navigation",[116,5589,5590,5593],{},[119,5591,5592],{},"GitLens"," - Supercharges Git capabilities within VSCode",[116,5595,5596,5599],{},[119,5597,5598],{},"Auto Rename Tag"," - Automatically renames paired HTML/XML tags",[116,5601,5602,5605],{},[119,5603,5604],{},"Bracket Pair Colorizer 2"," - Makes matching brackets easier to identify",[116,5607,5608,5611],{},[119,5609,5610],{},"Path Intellisense"," - Autocompletes filenames in import statements",[149,5613,5615],{"id":5614},"language-support","Language Support",[113,5617,5618,5624,5634,5640],{},[116,5619,5620,5623],{},[119,5621,5622],{},"ES7+ React/Redux/React-Native snippets"," - Essential for React development",[116,5625,5626,5629,5630,5633],{},[119,5627,5628],{},"Vetur"," or ",[119,5631,5632],{},"Volar"," - Vue.js language support",[116,5635,5636,5639],{},[119,5637,5638],{},"TypeScript Hero"," - Organizes and manages TypeScript imports",[116,5641,5642,5645],{},[119,5643,5644],{},"Prettier"," - Code formatting that works seamlessly with the theme",[149,5647,5649],{"id":5648},"quality-of-life","Quality of Life",[113,5651,5652,5658,5664],{},[116,5653,5654,5657],{},[119,5655,5656],{},"Material Icon Theme"," - Provides clear, recognizable file icons",[116,5659,5660,5663],{},[119,5661,5662],{},"Indent Rainbow"," - Subtle indentation guides that work well with the minimal aesthetic",[116,5665,5666,5669],{},[119,5667,5668],{},"Error Lens"," - Inline error messages that don't clutter the interface",[98,5671,5673],{"id":5672},"font-recommendations","Font Recommendations",[102,5675,5676],{},"The right font can significantly impact your coding experience. Here are my top recommendations that work beautifully with Minimal Mist:",[200,5678,5679,5685,5691,5697],{},[116,5680,5681,5684],{},[119,5682,5683],{},"JetBrains Mono"," (my current favorite) - Excellent readability and ligature support",[116,5686,5687,5690],{},[119,5688,5689],{},"Fira Code"," - Popular choice with great ligatures",[116,5692,5693,5696],{},[119,5694,5695],{},"Cascadia Code"," - Microsoft's developer font with excellent clarity",[116,5698,5699,5702],{},[119,5700,5701],{},"Source Code Pro"," - Clean and professional",[98,5704,5706],{"id":5705},"customizing-for-your-workflow","Customizing for Your Workflow",[102,5708,5709],{},"While I love my current setup, I recognize that everyone's needs are different. Here are some variations you might consider:",[149,5711,5713],{"id":5712},"for-beginners","For Beginners",[113,5715,5716,5722,5728],{},[116,5717,5718,5719],{},"Keep the status bar visible: ",[161,5720,5721],{},"\"workbench.statusBar.visible\": true",[116,5723,5724,5725],{},"Enable breadcrumbs: ",[161,5726,5727],{},"\"breadcrumbs.enabled\": true",[116,5729,5730,5731],{},"Show the minimap: ",[161,5732,5733],{},"\"editor.minimap.enabled\": true",[149,5735,5737],{"id":5736},"for-vim-users","For Vim Users",[113,5739,5740,5743,5748],{},[116,5741,5742],{},"Install the Vim extension",[116,5744,5745,5746],{},"Use relative line numbers: ",[161,5747,5567],{},[116,5749,5750],{},"Consider adding custom keybindings for your workflow",[149,5752,5754],{"id":5753},"for-pair-programming","For Pair Programming",[113,5756,5757,5763,5769],{},[116,5758,5759,5760],{},"Increase font size: ",[161,5761,5762],{},"\"editor.fontSize\": 16",[116,5764,5765,5766],{},"Enable word wrap: ",[161,5767,5768],{},"\"editor.wordWrap\": \"on\"",[116,5770,5771,5772],{},"Show the minimap for easier navigation: ",[161,5773,5733],{},[98,5775,5777],{"id":5776},"the-complete-setup","The Complete Setup",[102,5779,5780],{},"For those who want to get the exact look from my screenshots, here's everything you need:",[200,5782,5783,5789,5795,5801],{},[116,5784,5785,5788],{},[119,5786,5787],{},"Install Minimal Mist theme"," from the VSCode marketplace",[116,5790,5791,5794],{},[119,5792,5793],{},"Copy the settings"," from the JSON configuration above",[116,5796,5797,5800],{},[119,5798,5799],{},"Install a good programming font"," like JetBrains Mono",[116,5802,5803,5806],{},[119,5804,5805],{},"Add the recommended extensions"," based on your development needs",[102,5808,5809,5812,5813],{},[119,5810,5811],{},"For the complete settings file and additional configurations, check out this gist:"," ",[4843,5814,5817],{"href":5815,"rel":5816},"https://gist.github.com/mubaidr/7ec5b5b2b72a2cbf948d53db9459abfd",[4847],"My Complete VSCode Settings",[98,5819,5821],{"id":5820},"final-thoughts","Final Thoughts",[102,5823,5824],{},"Creating Minimal Mist and this setup has been a journey of continuous refinement. What started as a simple desire for a cleaner interface has evolved into a comprehensive development environment that I genuinely enjoy using every day.",[102,5826,5827],{},"The goal isn't just to make things look pretty—it's to create an environment that helps you focus on what matters most: writing great code. When your tools get out of the way, you can concentrate on solving problems and building amazing things.",[102,5829,5830],{},"I encourage you to try this setup and then customize it to fit your specific needs. The beauty of VSCode is its flexibility—there's no one-size-fits-all solution, but hopefully, this gives you a great starting point.",[102,5832,5833],{},"What aspects of your development environment matter most to you? I'd love to hear about your own setup and any improvements you make to this one.",[102,5835,5836],{},"Happy coding, and may your development environment bring you as much joy as it brings me!",[3996,5838],{},[98,5840,5842],{"id":5841},"continue-your-typescript-journey","Continue Your TypeScript Journey",[102,5844,5845,5846,5848],{},"This post is part 1 of the ",[119,5847,4052],{}," series. Continue learning:",[200,5850,5851,5864,5873],{},[116,5852,5853,5812,5859,5863],{},[119,5854,5855],{},[4843,5856,5858],{"href":5857},"/blog/2-my-vscode-setup","My VSCode Setup",[5860,5861,5862],"em",{},"(You are here)"," - Development environment setup",[116,5865,5866,5872],{},[119,5867,5868],{},[4843,5869,5871],{"href":5870},"/blog/6-typescript-nodejs-production-guide","TypeScript + Node.js in Production"," - Building production-ready TypeScript applications",[116,5874,5875,5881],{},[119,5876,5877],{},[4843,5878,5880],{"href":5879},"/blog/11-typescript-advanced-patterns","Advanced TypeScript Patterns"," - Enterprise-level TypeScript patterns and techniques",[4005,5883,5884],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":159,"searchDepth":174,"depth":174,"links":5886},[5887,5888,5889,5895,5900,5901,5904,5909,5910,5915,5916,5917],{"id":4801,"depth":174,"text":4802},{"id":4815,"depth":174,"text":4816},{"id":4851,"depth":174,"text":4852,"children":5890},[5891,5892,5893,5894],{"id":4855,"depth":16,"text":4856},{"id":4869,"depth":16,"text":4870},{"id":4879,"depth":16,"text":4880},{"id":4886,"depth":16,"text":4887},{"id":4904,"depth":174,"text":4905,"children":5896},[5897,5898,5899],{"id":4908,"depth":16,"text":4909},{"id":4915,"depth":16,"text":4916},{"id":4922,"depth":16,"text":4923},{"id":4929,"depth":174,"text":4930},{"id":4964,"depth":174,"text":4965,"children":5902},[5903],{"id":5516,"depth":16,"text":5517},{"id":5571,"depth":174,"text":5572,"children":5905},[5906,5907,5908],{"id":5578,"depth":16,"text":5579},{"id":5614,"depth":16,"text":5615},{"id":5648,"depth":16,"text":5649},{"id":5672,"depth":174,"text":5673},{"id":5705,"depth":174,"text":5706,"children":5911},[5912,5913,5914],{"id":5712,"depth":16,"text":5713},{"id":5736,"depth":16,"text":5737},{"id":5753,"depth":16,"text":5754},{"id":5776,"depth":174,"text":5777},{"id":5820,"depth":174,"text":5821},{"id":5841,"depth":174,"text":5842},"2024-07-17","Discover my minimalist VSCode setup with the Minimal Mist theme and custom settings for a distraction-free, accessible coding environment.",{"readingTime":5921},"12 min read",{"title":4793,"description":5919},"Master TypeScript from development setup to advanced enterprise patterns",{"src":4958,"mime":5925,"alt":5926,"width":4058,"height":4059},"png","Screenshot of VSCode with Minimal Mist theme in dark mode","blog/2-my-vscode-setup",[5929,5930,5931],"VSCode","Productivity","Tools","Vg1uEmH91C-0CB66nldRRvlct8cf3_1YFopnfqYR2co",{"id":5934,"title":5935,"abstract":92,"author":93,"authorUrl":92,"body":5936,"date":10072,"dateUpdated":10072,"description":10073,"excerpt":92,"extension":4047,"featured":342,"headline":92,"image":10074,"meta":10075,"navigation":342,"ogImage":92,"path":5870,"seo":10077,"series":4052,"seriesDescription":5923,"seriesOrder":174,"socialImage":92,"stem":10078,"tags":10079,"__hash__":10082},"blog/blog/6-typescript-nodejs-production-guide.md","TypeScript + Node.js in Production: A Complete Guide",{"type":95,"value":5937,"toc":10037},[5938,5941,5944,5948,5952,6173,6177,6547,6551,6555,6727,6731,6884,6888,6892,7206,7210,7578,7582,7586,7743,7747,8129,8133,8137,8310,8314,8831,8835,8839,8946,8950,9091,9095,9099,9477,9481,9485,9975,9977,9980,9983,10000,10003,10005,10007,10012,10034],[98,5939,5935],{"id":5940},"typescript-nodejs-in-production-a-complete-guide",[102,5942,5943],{},"Running TypeScript in production requires careful consideration of build processes, performance, and maintainability. After deploying dozens of TypeScript Node.js applications, here's everything you need to know.",[98,5945,5947],{"id":5946},"project-setup-and-configuration","Project Setup and Configuration",[149,5949,5951],{"id":5950},"essential-dependencies","Essential Dependencies",[154,5953,5955],{"className":4974,"code":5954,"language":773,"meta":159,"style":159},"{\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"typescript\": \"^5.0.0\",\n \"ts-node\": \"^10.9.0\",\n \"nodemon\": \"^3.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n \"@typescript-eslint/parser\": \"^6.0.0\"\n },\n \"dependencies\": {\n \"dotenv\": \"^16.0.0\",\n \"express\": \"^4.18.0\",\n \"@types/express\": \"^4.17.0\"\n }\n}\n",[161,5956,5957,5961,5974,5994,6013,6033,6053,6073,6090,6094,6107,6127,6147,6165,6169],{"__ignoreMap":159},[164,5958,5959],{"class":166,"line":167},[164,5960,906],{"class":255},[164,5962,5963,5965,5968,5970,5972],{"class":166,"line":174},[164,5964,2676],{"class":255},[164,5966,5967],{"class":352},"devDependencies",[164,5969,368],{"class":255},[164,5971,388],{"class":255},[164,5973,378],{"class":255},[164,5975,5976,5978,5981,5983,5985,5987,5990,5992],{"class":166,"line":16},[164,5977,5227],{"class":255},[164,5979,5980],{"class":597},"@types/node",[164,5982,368],{"class":255},[164,5984,388],{"class":255},[164,5986,285],{"class":255},[164,5988,5989],{"class":288},"^20.0.0",[164,5991,368],{"class":255},[164,5993,421],{"class":255},[164,5995,5996,5998,6000,6002,6004,6006,6009,6011],{"class":166,"line":185},[164,5997,5227],{"class":255},[164,5999,158],{"class":597},[164,6001,368],{"class":255},[164,6003,388],{"class":255},[164,6005,285],{"class":255},[164,6007,6008],{"class":288},"^5.0.0",[164,6010,368],{"class":255},[164,6012,421],{"class":255},[164,6014,6015,6017,6020,6022,6024,6026,6029,6031],{"class":166,"line":191},[164,6016,5227],{"class":255},[164,6018,6019],{"class":597},"ts-node",[164,6021,368],{"class":255},[164,6023,388],{"class":255},[164,6025,285],{"class":255},[164,6027,6028],{"class":288},"^10.9.0",[164,6030,368],{"class":255},[164,6032,421],{"class":255},[164,6034,6035,6037,6040,6042,6044,6046,6049,6051],{"class":166,"line":346},[164,6036,5227],{"class":255},[164,6038,6039],{"class":597},"nodemon",[164,6041,368],{"class":255},[164,6043,388],{"class":255},[164,6045,285],{"class":255},[164,6047,6048],{"class":288},"^3.0.0",[164,6050,368],{"class":255},[164,6052,421],{"class":255},[164,6054,6055,6057,6060,6062,6064,6066,6069,6071],{"class":166,"line":381},[164,6056,5227],{"class":255},[164,6058,6059],{"class":597},"@typescript-eslint/eslint-plugin",[164,6061,368],{"class":255},[164,6063,388],{"class":255},[164,6065,285],{"class":255},[164,6067,6068],{"class":288},"^6.0.0",[164,6070,368],{"class":255},[164,6072,421],{"class":255},[164,6074,6075,6077,6080,6082,6084,6086,6088],{"class":166,"line":424},[164,6076,5227],{"class":255},[164,6078,6079],{"class":597},"@typescript-eslint/parser",[164,6081,368],{"class":255},[164,6083,388],{"class":255},[164,6085,285],{"class":255},[164,6087,6068],{"class":288},[164,6089,292],{"class":255},[164,6091,6092],{"class":166,"line":461},[164,6093,1748],{"class":255},[164,6095,6096,6098,6101,6103,6105],{"class":166,"line":490},[164,6097,2676],{"class":255},[164,6099,6100],{"class":352},"dependencies",[164,6102,368],{"class":255},[164,6104,388],{"class":255},[164,6106,378],{"class":255},[164,6108,6109,6111,6114,6116,6118,6120,6123,6125],{"class":166,"line":526},[164,6110,5227],{"class":255},[164,6112,6113],{"class":597},"dotenv",[164,6115,368],{"class":255},[164,6117,388],{"class":255},[164,6119,285],{"class":255},[164,6121,6122],{"class":288},"^16.0.0",[164,6124,368],{"class":255},[164,6126,421],{"class":255},[164,6128,6129,6131,6134,6136,6138,6140,6143,6145],{"class":166,"line":535},[164,6130,5227],{"class":255},[164,6132,6133],{"class":597},"express",[164,6135,368],{"class":255},[164,6137,388],{"class":255},[164,6139,285],{"class":255},[164,6141,6142],{"class":288},"^4.18.0",[164,6144,368],{"class":255},[164,6146,421],{"class":255},[164,6148,6149,6151,6154,6156,6158,6160,6163],{"class":166,"line":29},[164,6150,5227],{"class":255},[164,6152,6153],{"class":597},"@types/express",[164,6155,368],{"class":255},[164,6157,388],{"class":255},[164,6159,285],{"class":255},[164,6161,6162],{"class":288},"^4.17.0",[164,6164,292],{"class":255},[164,6166,6167],{"class":166,"line":545},[164,6168,1260],{"class":255},[164,6170,6171],{"class":166,"line":562},[164,6172,1281],{"class":255},[149,6174,6176],{"id":6175},"typescript-configuration","TypeScript Configuration",[154,6178,6180],{"className":4974,"code":6179,"language":773,"meta":159,"style":159},"// tsconfig.json\n{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"commonjs\",\n \"lib\": [\"ES2022\"],\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"resolveJsonModule\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"removeComments\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedIndexedAccess\": true,\n \"exactOptionalPropertyTypes\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\", \"**/*.test.ts\"]\n}\n",[161,6181,6182,6187,6191,6204,6224,6244,6267,6287,6307,6320,6333,6346,6359,6372,6385,6398,6411,6424,6437,6450,6463,6476,6480,6502,6543],{"__ignoreMap":159},[164,6183,6184],{"class":166,"line":167},[164,6185,6186],{"class":170},"// tsconfig.json\n",[164,6188,6189],{"class":166,"line":174},[164,6190,906],{"class":255},[164,6192,6193,6195,6198,6200,6202],{"class":166,"line":16},[164,6194,2676],{"class":255},[164,6196,6197],{"class":352},"compilerOptions",[164,6199,368],{"class":255},[164,6201,388],{"class":255},[164,6203,378],{"class":255},[164,6205,6206,6208,6211,6213,6215,6217,6220,6222],{"class":166,"line":185},[164,6207,5227],{"class":255},[164,6209,6210],{"class":597},"target",[164,6212,368],{"class":255},[164,6214,388],{"class":255},[164,6216,285],{"class":255},[164,6218,6219],{"class":288},"ES2022",[164,6221,368],{"class":255},[164,6223,421],{"class":255},[164,6225,6226,6228,6231,6233,6235,6237,6240,6242],{"class":166,"line":191},[164,6227,5227],{"class":255},[164,6229,6230],{"class":597},"module",[164,6232,368],{"class":255},[164,6234,388],{"class":255},[164,6236,285],{"class":255},[164,6238,6239],{"class":288},"commonjs",[164,6241,368],{"class":255},[164,6243,421],{"class":255},[164,6245,6246,6248,6251,6253,6255,6258,6260,6262,6264],{"class":166,"line":346},[164,6247,5227],{"class":255},[164,6249,6250],{"class":597},"lib",[164,6252,368],{"class":255},[164,6254,388],{"class":255},[164,6256,6257],{"class":255}," [",[164,6259,368],{"class":255},[164,6261,6219],{"class":288},[164,6263,368],{"class":255},[164,6265,6266],{"class":255},"],\n",[164,6268,6269,6271,6274,6276,6278,6280,6283,6285],{"class":166,"line":381},[164,6270,5227],{"class":255},[164,6272,6273],{"class":597},"outDir",[164,6275,368],{"class":255},[164,6277,388],{"class":255},[164,6279,285],{"class":255},[164,6281,6282],{"class":288},"./dist",[164,6284,368],{"class":255},[164,6286,421],{"class":255},[164,6288,6289,6291,6294,6296,6298,6300,6303,6305],{"class":166,"line":424},[164,6290,5227],{"class":255},[164,6292,6293],{"class":597},"rootDir",[164,6295,368],{"class":255},[164,6297,388],{"class":255},[164,6299,285],{"class":255},[164,6301,6302],{"class":288},"./src",[164,6304,368],{"class":255},[164,6306,421],{"class":255},[164,6308,6309,6311,6314,6316,6318],{"class":166,"line":461},[164,6310,5227],{"class":255},[164,6312,6313],{"class":597},"strict",[164,6315,368],{"class":255},[164,6317,388],{"class":255},[164,6319,5176],{"class":255},[164,6321,6322,6324,6327,6329,6331],{"class":166,"line":490},[164,6323,5227],{"class":255},[164,6325,6326],{"class":597},"esModuleInterop",[164,6328,368],{"class":255},[164,6330,388],{"class":255},[164,6332,5176],{"class":255},[164,6334,6335,6337,6340,6342,6344],{"class":166,"line":526},[164,6336,5227],{"class":255},[164,6338,6339],{"class":597},"skipLibCheck",[164,6341,368],{"class":255},[164,6343,388],{"class":255},[164,6345,5176],{"class":255},[164,6347,6348,6350,6353,6355,6357],{"class":166,"line":535},[164,6349,5227],{"class":255},[164,6351,6352],{"class":597},"forceConsistentCasingInFileNames",[164,6354,368],{"class":255},[164,6356,388],{"class":255},[164,6358,5176],{"class":255},[164,6360,6361,6363,6366,6368,6370],{"class":166,"line":29},[164,6362,5227],{"class":255},[164,6364,6365],{"class":597},"resolveJsonModule",[164,6367,368],{"class":255},[164,6369,388],{"class":255},[164,6371,5176],{"class":255},[164,6373,6374,6376,6379,6381,6383],{"class":166,"line":545},[164,6375,5227],{"class":255},[164,6377,6378],{"class":597},"declaration",[164,6380,368],{"class":255},[164,6382,388],{"class":255},[164,6384,5176],{"class":255},[164,6386,6387,6389,6392,6394,6396],{"class":166,"line":562},[164,6388,5227],{"class":255},[164,6390,6391],{"class":597},"declarationMap",[164,6393,368],{"class":255},[164,6395,388],{"class":255},[164,6397,5176],{"class":255},[164,6399,6400,6402,6405,6407,6409],{"class":166,"line":578},[164,6401,5227],{"class":255},[164,6403,6404],{"class":597},"sourceMap",[164,6406,368],{"class":255},[164,6408,388],{"class":255},[164,6410,5176],{"class":255},[164,6412,6413,6415,6418,6420,6422],{"class":166,"line":583},[164,6414,5227],{"class":255},[164,6416,6417],{"class":597},"removeComments",[164,6419,368],{"class":255},[164,6421,388],{"class":255},[164,6423,5176],{"class":255},[164,6425,6426,6428,6431,6433,6435],{"class":166,"line":589},[164,6427,5227],{"class":255},[164,6429,6430],{"class":597},"noImplicitReturns",[164,6432,368],{"class":255},[164,6434,388],{"class":255},[164,6436,5176],{"class":255},[164,6438,6439,6441,6444,6446,6448],{"class":166,"line":615},[164,6440,5227],{"class":255},[164,6442,6443],{"class":597},"noFallthroughCasesInSwitch",[164,6445,368],{"class":255},[164,6447,388],{"class":255},[164,6449,5176],{"class":255},[164,6451,6452,6454,6457,6459,6461],{"class":166,"line":978},[164,6453,5227],{"class":255},[164,6455,6456],{"class":597},"noUncheckedIndexedAccess",[164,6458,368],{"class":255},[164,6460,388],{"class":255},[164,6462,5176],{"class":255},[164,6464,6465,6467,6470,6472,6474],{"class":166,"line":984},[164,6466,5227],{"class":255},[164,6468,6469],{"class":597},"exactOptionalPropertyTypes",[164,6471,368],{"class":255},[164,6473,388],{"class":255},[164,6475,1738],{"class":255},[164,6477,6478],{"class":166,"line":992},[164,6479,1748],{"class":255},[164,6481,6482,6484,6487,6489,6491,6493,6495,6498,6500],{"class":166,"line":999},[164,6483,2676],{"class":255},[164,6485,6486],{"class":352},"include",[164,6488,368],{"class":255},[164,6490,388],{"class":255},[164,6492,6257],{"class":255},[164,6494,368],{"class":255},[164,6496,6497],{"class":288},"src/**/*",[164,6499,368],{"class":255},[164,6501,6266],{"class":255},[164,6503,6504,6506,6509,6511,6513,6515,6517,6520,6522,6524,6526,6529,6531,6533,6535,6538,6540],{"class":166,"line":1004},[164,6505,2676],{"class":255},[164,6507,6508],{"class":352},"exclude",[164,6510,368],{"class":255},[164,6512,388],{"class":255},[164,6514,6257],{"class":255},[164,6516,368],{"class":255},[164,6518,6519],{"class":288},"node_modules",[164,6521,368],{"class":255},[164,6523,263],{"class":255},[164,6525,285],{"class":255},[164,6527,6528],{"class":288},"dist",[164,6530,368],{"class":255},[164,6532,263],{"class":255},[164,6534,285],{"class":255},[164,6536,6537],{"class":288},"**/*.test.ts",[164,6539,368],{"class":255},[164,6541,6542],{"class":255},"]\n",[164,6544,6545],{"class":166,"line":1010},[164,6546,1281],{"class":255},[98,6548,6550],{"id":6549},"build-and-deployment-strategies","Build and Deployment Strategies",[149,6552,6554],{"id":6553},"development-vs-production-builds","Development vs Production Builds",[154,6556,6558],{"className":4974,"code":6557,"language":773,"meta":159,"style":159},"// package.json scripts\n{\n \"scripts\": {\n \"dev\": \"nodemon --exec ts-node src/index.ts\",\n \"build\": \"tsc\",\n \"start\": \"node dist/index.js\",\n \"start:prod\": \"NODE_ENV=production node dist/index.js\",\n \"type-check\": \"tsc --noEmit\",\n \"lint\": \"eslint src/**/*.ts\",\n \"test\": \"jest\"\n }\n}\n",[161,6559,6560,6565,6569,6582,6602,6622,6642,6662,6682,6702,6719,6723],{"__ignoreMap":159},[164,6561,6562],{"class":166,"line":167},[164,6563,6564],{"class":170},"// package.json scripts\n",[164,6566,6567],{"class":166,"line":174},[164,6568,906],{"class":255},[164,6570,6571,6573,6576,6578,6580],{"class":166,"line":16},[164,6572,2676],{"class":255},[164,6574,6575],{"class":352},"scripts",[164,6577,368],{"class":255},[164,6579,388],{"class":255},[164,6581,378],{"class":255},[164,6583,6584,6586,6589,6591,6593,6595,6598,6600],{"class":166,"line":185},[164,6585,5227],{"class":255},[164,6587,6588],{"class":597},"dev",[164,6590,368],{"class":255},[164,6592,388],{"class":255},[164,6594,285],{"class":255},[164,6596,6597],{"class":288},"nodemon --exec ts-node src/index.ts",[164,6599,368],{"class":255},[164,6601,421],{"class":255},[164,6603,6604,6606,6609,6611,6613,6615,6618,6620],{"class":166,"line":191},[164,6605,5227],{"class":255},[164,6607,6608],{"class":597},"build",[164,6610,368],{"class":255},[164,6612,388],{"class":255},[164,6614,285],{"class":255},[164,6616,6617],{"class":288},"tsc",[164,6619,368],{"class":255},[164,6621,421],{"class":255},[164,6623,6624,6626,6629,6631,6633,6635,6638,6640],{"class":166,"line":346},[164,6625,5227],{"class":255},[164,6627,6628],{"class":597},"start",[164,6630,368],{"class":255},[164,6632,388],{"class":255},[164,6634,285],{"class":255},[164,6636,6637],{"class":288},"node dist/index.js",[164,6639,368],{"class":255},[164,6641,421],{"class":255},[164,6643,6644,6646,6649,6651,6653,6655,6658,6660],{"class":166,"line":381},[164,6645,5227],{"class":255},[164,6647,6648],{"class":597},"start:prod",[164,6650,368],{"class":255},[164,6652,388],{"class":255},[164,6654,285],{"class":255},[164,6656,6657],{"class":288},"NODE_ENV=production node dist/index.js",[164,6659,368],{"class":255},[164,6661,421],{"class":255},[164,6663,6664,6666,6669,6671,6673,6675,6678,6680],{"class":166,"line":424},[164,6665,5227],{"class":255},[164,6667,6668],{"class":597},"type-check",[164,6670,368],{"class":255},[164,6672,388],{"class":255},[164,6674,285],{"class":255},[164,6676,6677],{"class":288},"tsc --noEmit",[164,6679,368],{"class":255},[164,6681,421],{"class":255},[164,6683,6684,6686,6689,6691,6693,6695,6698,6700],{"class":166,"line":461},[164,6685,5227],{"class":255},[164,6687,6688],{"class":597},"lint",[164,6690,368],{"class":255},[164,6692,388],{"class":255},[164,6694,285],{"class":255},[164,6696,6697],{"class":288},"eslint src/**/*.ts",[164,6699,368],{"class":255},[164,6701,421],{"class":255},[164,6703,6704,6706,6708,6710,6712,6714,6717],{"class":166,"line":490},[164,6705,5227],{"class":255},[164,6707,2212],{"class":597},[164,6709,368],{"class":255},[164,6711,388],{"class":255},[164,6713,285],{"class":255},[164,6715,6716],{"class":288},"jest",[164,6718,292],{"class":255},[164,6720,6721],{"class":166,"line":526},[164,6722,1260],{"class":255},[164,6724,6725],{"class":166,"line":535},[164,6726,1281],{"class":255},[149,6728,6730],{"id":6729},"docker-configuration","Docker Configuration",[154,6732,6736],{"className":6733,"code":6734,"language":6735,"meta":159,"style":159},"language-dockerfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Multi-stage build for production\nFROM node:18-alpine AS builder\n\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nCOPY . .\nRUN npm run build\n\nFROM node:18-alpine AS production\n\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package*.json ./\n\nEXPOSE 3000\nCMD [\"npm\", \"run\", \"start:prod\"]\n","dockerfile",[161,6737,6738,6743,6757,6761,6769,6777,6785,6789,6796,6803,6807,6818,6822,6828,6835,6842,6849,6853,6861],{"__ignoreMap":159},[164,6739,6740],{"class":166,"line":167},[164,6741,6742],{"class":170},"# Multi-stage build for production\n",[164,6744,6745,6748,6751,6754],{"class":166,"line":174},[164,6746,6747],{"class":921},"FROM",[164,6749,6750],{"class":259}," node:18-alpine ",[164,6752,6753],{"class":921},"AS",[164,6755,6756],{"class":259}," builder\n",[164,6758,6759],{"class":166,"line":16},[164,6760,343],{"emptyLinePlaceholder":342},[164,6762,6763,6766],{"class":166,"line":185},[164,6764,6765],{"class":921},"WORKDIR",[164,6767,6768],{"class":259}," /app\n",[164,6770,6771,6774],{"class":166,"line":191},[164,6772,6773],{"class":921},"COPY",[164,6775,6776],{"class":259}," package*.json ./\n",[164,6778,6779,6782],{"class":166,"line":346},[164,6780,6781],{"class":921},"RUN",[164,6783,6784],{"class":259}," npm ci --only=production\n",[164,6786,6787],{"class":166,"line":381},[164,6788,343],{"emptyLinePlaceholder":342},[164,6790,6791,6793],{"class":166,"line":424},[164,6792,6773],{"class":921},[164,6794,6795],{"class":259}," . .\n",[164,6797,6798,6800],{"class":166,"line":461},[164,6799,6781],{"class":921},[164,6801,6802],{"class":259}," npm run build\n",[164,6804,6805],{"class":166,"line":490},[164,6806,343],{"emptyLinePlaceholder":342},[164,6808,6809,6811,6813,6815],{"class":166,"line":526},[164,6810,6747],{"class":921},[164,6812,6750],{"class":259},[164,6814,6753],{"class":921},[164,6816,6817],{"class":259}," production\n",[164,6819,6820],{"class":166,"line":535},[164,6821,343],{"emptyLinePlaceholder":342},[164,6823,6824,6826],{"class":166,"line":29},[164,6825,6765],{"class":921},[164,6827,6768],{"class":259},[164,6829,6830,6832],{"class":166,"line":545},[164,6831,6773],{"class":921},[164,6833,6834],{"class":259}," --from=builder /app/dist ./dist\n",[164,6836,6837,6839],{"class":166,"line":562},[164,6838,6773],{"class":921},[164,6840,6841],{"class":259}," --from=builder /app/node_modules ./node_modules\n",[164,6843,6844,6846],{"class":166,"line":578},[164,6845,6773],{"class":921},[164,6847,6848],{"class":259}," --from=builder /app/package*.json ./\n",[164,6850,6851],{"class":166,"line":583},[164,6852,343],{"emptyLinePlaceholder":342},[164,6854,6855,6858],{"class":166,"line":589},[164,6856,6857],{"class":921},"EXPOSE",[164,6859,6860],{"class":259}," 3000\n",[164,6862,6863,6866,6868,6871,6874,6877,6879,6882],{"class":166,"line":615},[164,6864,6865],{"class":921},"CMD",[164,6867,6257],{"class":259},[164,6869,6870],{"class":288},"\"npm\"",[164,6872,6873],{"class":259},", ",[164,6875,6876],{"class":288},"\"run\"",[164,6878,6873],{"class":259},[164,6880,6881],{"class":288},"\"start:prod\"",[164,6883,6542],{"class":259},[98,6885,6887],{"id":6886},"error-handling-and-type-safety","Error Handling and Type Safety",[149,6889,6891],{"id":6890},"custom-error-classes","Custom Error Classes",[154,6893,6895],{"className":156,"code":6894,"language":158,"meta":159,"style":159},"// src/errors/AppError.ts\nexport class AppError extends Error {\n public readonly statusCode: number\n public readonly isOperational: boolean\n\n constructor(\n message: string,\n statusCode: number = 500,\n isOperational: boolean = true,\n ) {\n super(message)\n this.statusCode = statusCode\n this.isOperational = isOperational\n\n Error.captureStackTrace(this, this.constructor)\n }\n}\n\nexport class ValidationError extends AppError {\n constructor(message: string) {\n super(message, 400)\n }\n}\n\nexport class NotFoundError extends AppError {\n constructor(resource: string) {\n super(`${resource} not found`, 404)\n }\n}\n",[161,6896,6897,6902,6917,6933,6947,6951,6958,6969,6985,7001,7008,7020,7033,7045,7049,7072,7076,7080,7084,7099,7115,7130,7134,7138,7142,7157,7174,7198,7202],{"__ignoreMap":159},[164,6898,6899],{"class":166,"line":167},[164,6900,6901],{"class":170},"// src/errors/AppError.ts\n",[164,6903,6904,6906,6908,6911,6913,6915],{"class":166,"line":174},[164,6905,349],{"class":251},[164,6907,3223],{"class":352},[164,6909,6910],{"class":597}," AppError",[164,6912,1878],{"class":352},[164,6914,1235],{"class":597},[164,6916,378],{"class":255},[164,6918,6919,6922,6925,6928,6930],{"class":166,"line":16},[164,6920,6921],{"class":352}," public",[164,6923,6924],{"class":352}," readonly",[164,6926,6927],{"class":384}," statusCode",[164,6929,388],{"class":255},[164,6931,6932],{"class":597}," number\n",[164,6934,6935,6937,6939,6942,6944],{"class":166,"line":185},[164,6936,6921],{"class":352},[164,6938,6924],{"class":352},[164,6940,6941],{"class":384}," isOperational",[164,6943,388],{"class":255},[164,6945,6946],{"class":597}," boolean\n",[164,6948,6949],{"class":166,"line":191},[164,6950,343],{"emptyLinePlaceholder":342},[164,6952,6953,6956],{"class":166,"line":346},[164,6954,6955],{"class":352}," constructor",[164,6957,2671],{"class":255},[164,6959,6960,6963,6965,6967],{"class":166,"line":381},[164,6961,6962],{"class":791}," message",[164,6964,388],{"class":255},[164,6966,1136],{"class":597},[164,6968,421],{"class":255},[164,6970,6971,6974,6976,6978,6980,6983],{"class":166,"line":424},[164,6972,6973],{"class":791}," statusCode",[164,6975,388],{"class":255},[164,6977,4388],{"class":597},[164,6979,601],{"class":255},[164,6981,6982],{"class":921}," 500",[164,6984,421],{"class":255},[164,6986,6987,6990,6992,6995,6997,6999],{"class":166,"line":461},[164,6988,6989],{"class":791}," isOperational",[164,6991,388],{"class":255},[164,6993,6994],{"class":597}," boolean",[164,6996,601],{"class":255},[164,6998,2865],{"class":1737},[164,7000,421],{"class":255},[164,7002,7003,7006],{"class":166,"line":490},[164,7004,7005],{"class":255}," )",[164,7007,378],{"class":255},[164,7009,7010,7013,7015,7018],{"class":166,"line":526},[164,7011,7012],{"class":259}," super",[164,7014,365],{"class":384},[164,7016,7017],{"class":259},"message",[164,7019,532],{"class":384},[164,7021,7022,7025,7028,7030],{"class":166,"line":535},[164,7023,7024],{"class":255}," this.",[164,7026,7027],{"class":259},"statusCode",[164,7029,601],{"class":255},[164,7031,7032],{"class":259}," statusCode\n",[164,7034,7035,7037,7040,7042],{"class":166,"line":29},[164,7036,7024],{"class":255},[164,7038,7039],{"class":259},"isOperational",[164,7041,601],{"class":255},[164,7043,7044],{"class":259}," isOperational\n",[164,7046,7047],{"class":166,"line":545},[164,7048,343],{"emptyLinePlaceholder":342},[164,7050,7051,7054,7056,7059,7061,7064,7067,7070],{"class":166,"line":562},[164,7052,7053],{"class":259}," Error",[164,7055,405],{"class":255},[164,7057,7058],{"class":362},"captureStackTrace",[164,7060,365],{"class":384},[164,7062,7063],{"class":255},"this,",[164,7065,7066],{"class":255}," this.",[164,7068,7069],{"class":259},"constructor",[164,7071,532],{"class":384},[164,7073,7074],{"class":166,"line":578},[164,7075,1260],{"class":255},[164,7077,7078],{"class":166,"line":583},[164,7079,1281],{"class":255},[164,7081,7082],{"class":166,"line":589},[164,7083,343],{"emptyLinePlaceholder":342},[164,7085,7086,7088,7090,7093,7095,7097],{"class":166,"line":615},[164,7087,349],{"class":251},[164,7089,3223],{"class":352},[164,7091,7092],{"class":597}," ValidationError",[164,7094,1878],{"class":352},[164,7096,6910],{"class":597},[164,7098,378],{"class":255},[164,7100,7101,7103,7105,7107,7109,7111,7113],{"class":166,"line":978},[164,7102,6955],{"class":352},[164,7104,365],{"class":255},[164,7106,7017],{"class":791},[164,7108,388],{"class":255},[164,7110,1136],{"class":597},[164,7112,402],{"class":255},[164,7114,378],{"class":255},[164,7116,7117,7119,7121,7123,7125,7128],{"class":166,"line":984},[164,7118,7012],{"class":259},[164,7120,365],{"class":384},[164,7122,7017],{"class":259},[164,7124,263],{"class":255},[164,7126,7127],{"class":921}," 400",[164,7129,532],{"class":384},[164,7131,7132],{"class":166,"line":992},[164,7133,1260],{"class":255},[164,7135,7136],{"class":166,"line":999},[164,7137,1281],{"class":255},[164,7139,7140],{"class":166,"line":1004},[164,7141,343],{"emptyLinePlaceholder":342},[164,7143,7144,7146,7148,7151,7153,7155],{"class":166,"line":1010},[164,7145,349],{"class":251},[164,7147,3223],{"class":352},[164,7149,7150],{"class":597}," NotFoundError",[164,7152,1878],{"class":352},[164,7154,6910],{"class":597},[164,7156,378],{"class":255},[164,7158,7159,7161,7163,7166,7168,7170,7172],{"class":166,"line":1466},[164,7160,6955],{"class":352},[164,7162,365],{"class":255},[164,7164,7165],{"class":791},"resource",[164,7167,388],{"class":255},[164,7169,1136],{"class":597},[164,7171,402],{"class":255},[164,7173,378],{"class":255},[164,7175,7176,7178,7180,7183,7185,7187,7190,7192,7194,7196],{"class":166,"line":1495},[164,7177,7012],{"class":259},[164,7179,365],{"class":384},[164,7181,7182],{"class":255},"`${",[164,7184,7165],{"class":259},[164,7186,529],{"class":255},[164,7188,7189],{"class":288}," not found",[164,7191,1181],{"class":255},[164,7193,263],{"class":255},[164,7195,2942],{"class":921},[164,7197,532],{"class":384},[164,7199,7200],{"class":166,"line":1505},[164,7201,1260],{"class":255},[164,7203,7204],{"class":166,"line":5434},[164,7205,1281],{"class":255},[149,7207,7209],{"id":7208},"global-error-handler","Global Error Handler",[154,7211,7213],{"className":156,"code":7212,"language":158,"meta":159,"style":159},"// src/middleware/errorHandler.ts\nimport { Request, Response, NextFunction } from \"express\"\nimport { AppError } from \"../errors/AppError\"\n\nexport const errorHandler = (\n error: Error,\n req: Request,\n res: Response,\n next: NextFunction,\n) => {\n if (error instanceof AppError) {\n return res.status(error.statusCode).json({\n status: \"error\",\n message: error.message,\n ...(process.env.NODE_ENV === \"development\" && { stack: error.stack }),\n })\n }\n\n // Log unexpected errors\n console.error(\"Unexpected error:\", error)\n\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error\",\n })\n}\n",[161,7214,7215,7220,7249,7268,7272,7286,7297,7308,7319,7330,7339,7357,7386,7401,7416,7468,7474,7478,7482,7487,7511,7515,7538,7553,7568,7574],{"__ignoreMap":159},[164,7216,7217],{"class":166,"line":167},[164,7218,7219],{"class":170},"// src/middleware/errorHandler.ts\n",[164,7221,7222,7224,7226,7229,7231,7234,7236,7239,7241,7243,7245,7247],{"class":166,"line":174},[164,7223,252],{"class":251},[164,7225,256],{"class":255},[164,7227,7228],{"class":259}," Request",[164,7230,263],{"class":255},[164,7232,7233],{"class":259}," Response",[164,7235,263],{"class":255},[164,7237,7238],{"class":259}," NextFunction",[164,7240,279],{"class":255},[164,7242,282],{"class":251},[164,7244,285],{"class":255},[164,7246,6133],{"class":288},[164,7248,292],{"class":255},[164,7250,7251,7253,7255,7257,7259,7261,7263,7266],{"class":166,"line":16},[164,7252,252],{"class":251},[164,7254,256],{"class":255},[164,7256,6910],{"class":259},[164,7258,279],{"class":255},[164,7260,282],{"class":251},[164,7262,285],{"class":255},[164,7264,7265],{"class":288},"../errors/AppError",[164,7267,292],{"class":255},[164,7269,7270],{"class":166,"line":185},[164,7271,343],{"emptyLinePlaceholder":342},[164,7273,7274,7276,7278,7281,7283],{"class":166,"line":191},[164,7275,349],{"class":251},[164,7277,353],{"class":352},[164,7279,7280],{"class":259}," errorHandler ",[164,7282,359],{"class":255},[164,7284,7285],{"class":259}," (\n",[164,7287,7288,7291,7293,7295],{"class":166,"line":346},[164,7289,7290],{"class":791}," error",[164,7292,388],{"class":255},[164,7294,1235],{"class":597},[164,7296,421],{"class":255},[164,7298,7299,7302,7304,7306],{"class":166,"line":381},[164,7300,7301],{"class":791}," req",[164,7303,388],{"class":255},[164,7305,7228],{"class":597},[164,7307,421],{"class":255},[164,7309,7310,7313,7315,7317],{"class":166,"line":424},[164,7311,7312],{"class":791}," res",[164,7314,388],{"class":255},[164,7316,7233],{"class":597},[164,7318,421],{"class":255},[164,7320,7321,7324,7326,7328],{"class":166,"line":461},[164,7322,7323],{"class":791}," next",[164,7325,388],{"class":255},[164,7327,7238],{"class":597},[164,7329,421],{"class":255},[164,7331,7332,7334,7337],{"class":166,"line":490},[164,7333,1223],{"class":259},[164,7335,7336],{"class":352},"=>",[164,7338,378],{"class":255},[164,7340,7341,7343,7345,7348,7351,7353,7355],{"class":166,"line":526},[164,7342,1207],{"class":251},[164,7344,788],{"class":384},[164,7346,7347],{"class":259},"error",[164,7349,7350],{"class":255}," instanceof",[164,7352,6910],{"class":597},[164,7354,1223],{"class":384},[164,7356,906],{"class":255},[164,7358,7359,7361,7364,7366,7368,7370,7372,7374,7376,7378,7380,7382,7384],{"class":166,"line":535},[164,7360,1768],{"class":251},[164,7362,7363],{"class":259}," res",[164,7365,405],{"class":255},[164,7367,1251],{"class":362},[164,7369,365],{"class":384},[164,7371,7347],{"class":259},[164,7373,405],{"class":255},[164,7375,7027],{"class":259},[164,7377,402],{"class":384},[164,7379,405],{"class":255},[164,7381,773],{"class":362},[164,7383,365],{"class":384},[164,7385,906],{"class":255},[164,7387,7388,7391,7393,7395,7397,7399],{"class":166,"line":29},[164,7389,7390],{"class":384}," status",[164,7392,388],{"class":255},[164,7394,285],{"class":255},[164,7396,7347],{"class":288},[164,7398,368],{"class":255},[164,7400,421],{"class":255},[164,7402,7403,7406,7408,7410,7412,7414],{"class":166,"line":545},[164,7404,7405],{"class":384}," message",[164,7407,388],{"class":255},[164,7409,2927],{"class":259},[164,7411,405],{"class":255},[164,7413,7017],{"class":259},[164,7415,421],{"class":255},[164,7417,7418,7421,7423,7426,7428,7431,7433,7436,7439,7441,7443,7445,7448,7450,7453,7455,7457,7459,7462,7464,7466],{"class":166,"line":562},[164,7419,7420],{"class":255}," ...",[164,7422,365],{"class":384},[164,7424,7425],{"class":259},"process",[164,7427,405],{"class":255},[164,7429,7430],{"class":259},"env",[164,7432,405],{"class":255},[164,7434,7435],{"class":259},"NODE_ENV",[164,7437,7438],{"class":255}," ===",[164,7440,285],{"class":255},[164,7442,2194],{"class":288},[164,7444,368],{"class":255},[164,7446,7447],{"class":255}," &&",[164,7449,256],{"class":255},[164,7451,7452],{"class":384}," stack",[164,7454,388],{"class":255},[164,7456,2927],{"class":259},[164,7458,405],{"class":255},[164,7460,7461],{"class":259},"stack",[164,7463,279],{"class":255},[164,7465,402],{"class":384},[164,7467,421],{"class":255},[164,7469,7470,7472],{"class":166,"line":578},[164,7471,1498],{"class":255},[164,7473,532],{"class":384},[164,7475,7476],{"class":166,"line":583},[164,7477,1260],{"class":255},[164,7479,7480],{"class":166,"line":589},[164,7481,343],{"emptyLinePlaceholder":342},[164,7483,7484],{"class":166,"line":615},[164,7485,7486],{"class":170}," // Log unexpected errors\n",[164,7488,7489,7492,7494,7496,7498,7500,7503,7505,7507,7509],{"class":166,"line":978},[164,7490,7491],{"class":259}," console",[164,7493,405],{"class":255},[164,7495,7347],{"class":362},[164,7497,365],{"class":384},[164,7499,368],{"class":255},[164,7501,7502],{"class":288},"Unexpected error:",[164,7504,368],{"class":255},[164,7506,263],{"class":255},[164,7508,2927],{"class":259},[164,7510,532],{"class":384},[164,7512,7513],{"class":166,"line":984},[164,7514,343],{"emptyLinePlaceholder":342},[164,7516,7517,7519,7521,7523,7525,7528,7530,7532,7534,7536],{"class":166,"line":992},[164,7518,7312],{"class":259},[164,7520,405],{"class":255},[164,7522,1251],{"class":362},[164,7524,365],{"class":384},[164,7526,7527],{"class":921},"500",[164,7529,402],{"class":384},[164,7531,405],{"class":255},[164,7533,773],{"class":362},[164,7535,365],{"class":384},[164,7537,906],{"class":255},[164,7539,7540,7543,7545,7547,7549,7551],{"class":166,"line":999},[164,7541,7542],{"class":384}," status",[164,7544,388],{"class":255},[164,7546,285],{"class":255},[164,7548,7347],{"class":288},[164,7550,368],{"class":255},[164,7552,421],{"class":255},[164,7554,7555,7557,7559,7561,7564,7566],{"class":166,"line":1004},[164,7556,6962],{"class":384},[164,7558,388],{"class":255},[164,7560,285],{"class":255},[164,7562,7563],{"class":288},"Internal server error",[164,7565,368],{"class":255},[164,7567,421],{"class":255},[164,7569,7570,7572],{"class":166,"line":1010},[164,7571,987],{"class":255},[164,7573,532],{"class":384},[164,7575,7576],{"class":166,"line":1466},[164,7577,1281],{"class":255},[98,7579,7581],{"id":7580},"database-integration-with-type-safety","Database Integration with Type Safety",[149,7583,7585],{"id":7584},"prisma-integration","Prisma Integration",[154,7587,7589],{"className":156,"code":7588,"language":158,"meta":159,"style":159},"// src/database/client.ts\nimport { PrismaClient } from \"@prisma/client\"\n\nconst globalForPrisma = globalThis as unknown as {\n prisma: PrismaClient | undefined\n}\n\nexport const prisma = globalForPrisma.prisma ?? new PrismaClient()\n\nif (process.env.NODE_ENV !== \"production\") {\n globalForPrisma.prisma = prisma\n}\n",[161,7590,7591,7596,7616,7620,7640,7654,7658,7662,7690,7694,7724,7739],{"__ignoreMap":159},[164,7592,7593],{"class":166,"line":167},[164,7594,7595],{"class":170},"// src/database/client.ts\n",[164,7597,7598,7600,7602,7605,7607,7609,7611,7614],{"class":166,"line":174},[164,7599,252],{"class":251},[164,7601,256],{"class":255},[164,7603,7604],{"class":259}," PrismaClient",[164,7606,279],{"class":255},[164,7608,282],{"class":251},[164,7610,285],{"class":255},[164,7612,7613],{"class":288},"@prisma/client",[164,7615,292],{"class":255},[164,7617,7618],{"class":166,"line":16},[164,7619,343],{"emptyLinePlaceholder":342},[164,7621,7622,7624,7627,7629,7632,7634,7636,7638],{"class":166,"line":185},[164,7623,721],{"class":352},[164,7625,7626],{"class":259}," globalForPrisma ",[164,7628,359],{"class":255},[164,7630,7631],{"class":259}," globalThis ",[164,7633,1716],{"class":251},[164,7635,3422],{"class":597},[164,7637,3439],{"class":251},[164,7639,378],{"class":255},[164,7641,7642,7645,7647,7649,7651],{"class":166,"line":191},[164,7643,7644],{"class":384}," prisma",[164,7646,388],{"class":255},[164,7648,7604],{"class":597},[164,7650,4561],{"class":255},[164,7652,7653],{"class":597}," undefined\n",[164,7655,7656],{"class":166,"line":346},[164,7657,1281],{"class":255},[164,7659,7660],{"class":166,"line":381},[164,7661,343],{"emptyLinePlaceholder":342},[164,7663,7664,7666,7668,7671,7673,7676,7678,7681,7684,7686,7688],{"class":166,"line":424},[164,7665,349],{"class":251},[164,7667,353],{"class":352},[164,7669,7670],{"class":259}," prisma ",[164,7672,359],{"class":255},[164,7674,7675],{"class":259}," globalForPrisma",[164,7677,405],{"class":255},[164,7679,7680],{"class":259},"prisma ",[164,7682,7683],{"class":255},"??",[164,7685,729],{"class":255},[164,7687,7604],{"class":362},[164,7689,734],{"class":259},[164,7691,7692],{"class":166,"line":461},[164,7693,343],{"emptyLinePlaceholder":342},[164,7695,7696,7699,7702,7704,7706,7708,7711,7714,7716,7718,7720,7722],{"class":166,"line":490},[164,7697,7698],{"class":251},"if",[164,7700,7701],{"class":259}," (process",[164,7703,405],{"class":255},[164,7705,7430],{"class":259},[164,7707,405],{"class":255},[164,7709,7710],{"class":259},"NODE_ENV ",[164,7712,7713],{"class":255},"!==",[164,7715,285],{"class":255},[164,7717,2203],{"class":288},[164,7719,368],{"class":255},[164,7721,1223],{"class":259},[164,7723,906],{"class":255},[164,7725,7726,7729,7731,7734,7736],{"class":166,"line":526},[164,7727,7728],{"class":259}," globalForPrisma",[164,7730,405],{"class":255},[164,7732,7733],{"class":259},"prisma",[164,7735,601],{"class":255},[164,7737,7738],{"class":259}," prisma\n",[164,7740,7741],{"class":166,"line":535},[164,7742,1281],{"class":255},[149,7744,7746],{"id":7745},"repository-pattern","Repository Pattern",[154,7748,7750],{"className":156,"code":7749,"language":158,"meta":159,"style":159},"// src/repositories/UserRepository.ts\nimport { User, Prisma } from \"@prisma/client\"\nimport { prisma } from \"../database/client\"\n\nexport class UserRepository {\n async findById(id: string): Promise {\n return prisma.user.findUnique({\n where: { id },\n })\n }\n\n async create(data: Prisma.UserCreateInput): Promise {\n return prisma.user.create({\n data,\n })\n }\n\n async update(id: string, data: Prisma.UserUpdateInput): Promise {\n return prisma.user.update({\n where: { id },\n data,\n })\n }\n\n async delete(id: string): Promise {\n await prisma.user.delete({\n where: { id },\n })\n }\n}\n",[161,7751,7752,7757,7780,7800,7804,7815,7847,7867,7879,7885,7889,7893,7925,7943,7950,7956,7960,7964,8004,8023,8035,8041,8047,8051,8055,8083,8103,8115,8121,8125],{"__ignoreMap":159},[164,7753,7754],{"class":166,"line":167},[164,7755,7756],{"class":170},"// src/repositories/UserRepository.ts\n",[164,7758,7759,7761,7763,7765,7767,7770,7772,7774,7776,7778],{"class":166,"line":174},[164,7760,252],{"class":251},[164,7762,256],{"class":255},[164,7764,598],{"class":259},[164,7766,263],{"class":255},[164,7768,7769],{"class":259}," Prisma",[164,7771,279],{"class":255},[164,7773,282],{"class":251},[164,7775,285],{"class":255},[164,7777,7613],{"class":288},[164,7779,292],{"class":255},[164,7781,7782,7784,7786,7789,7791,7793,7795,7798],{"class":166,"line":16},[164,7783,252],{"class":251},[164,7785,256],{"class":255},[164,7787,7788],{"class":259}," prisma",[164,7790,279],{"class":255},[164,7792,282],{"class":251},[164,7794,285],{"class":255},[164,7796,7797],{"class":288},"../database/client",[164,7799,292],{"class":255},[164,7801,7802],{"class":166,"line":185},[164,7803,343],{"emptyLinePlaceholder":342},[164,7805,7806,7808,7810,7813],{"class":166,"line":191},[164,7807,349],{"class":251},[164,7809,3223],{"class":352},[164,7811,7812],{"class":597}," UserRepository",[164,7814,378],{"class":255},[164,7816,7817,7819,7822,7824,7826,7828,7830,7832,7834,7836,7838,7840,7843,7845],{"class":166,"line":346},[164,7818,2742],{"class":352},[164,7820,7821],{"class":384}," findById",[164,7823,365],{"class":255},[164,7825,397],{"class":791},[164,7827,388],{"class":255},[164,7829,1136],{"class":597},[164,7831,1150],{"class":255},[164,7833,1153],{"class":597},[164,7835,1122],{"class":255},[164,7837,1724],{"class":597},[164,7839,4561],{"class":255},[164,7841,7842],{"class":597}," null",[164,7844,1160],{"class":255},[164,7846,378],{"class":255},[164,7848,7849,7851,7853,7855,7858,7860,7863,7865],{"class":166,"line":381},[164,7850,1768],{"class":251},[164,7852,7788],{"class":259},[164,7854,405],{"class":255},[164,7856,7857],{"class":259},"user",[164,7859,405],{"class":255},[164,7861,7862],{"class":362},"findUnique",[164,7864,365],{"class":384},[164,7866,906],{"class":255},[164,7868,7869,7871,7873,7875,7877],{"class":166,"line":424},[164,7870,2825],{"class":384},[164,7872,388],{"class":255},[164,7874,256],{"class":255},[164,7876,2713],{"class":259},[164,7878,1492],{"class":255},[164,7880,7881,7883],{"class":166,"line":461},[164,7882,1498],{"class":255},[164,7884,532],{"class":384},[164,7886,7887],{"class":166,"line":490},[164,7888,1260],{"class":255},[164,7890,7891],{"class":166,"line":526},[164,7892,343],{"emptyLinePlaceholder":342},[164,7894,7895,7897,7900,7902,7904,7906,7908,7910,7913,7915,7917,7919,7921,7923],{"class":166,"line":535},[164,7896,2742],{"class":352},[164,7898,7899],{"class":384}," create",[164,7901,365],{"class":255},[164,7903,877],{"class":791},[164,7905,388],{"class":255},[164,7907,7769],{"class":597},[164,7909,405],{"class":255},[164,7911,7912],{"class":597},"UserCreateInput",[164,7914,1150],{"class":255},[164,7916,1153],{"class":597},[164,7918,1122],{"class":255},[164,7920,1724],{"class":597},[164,7922,1160],{"class":255},[164,7924,378],{"class":255},[164,7926,7927,7929,7931,7933,7935,7937,7939,7941],{"class":166,"line":29},[164,7928,1768],{"class":251},[164,7930,7788],{"class":259},[164,7932,405],{"class":255},[164,7934,7857],{"class":259},[164,7936,405],{"class":255},[164,7938,3912],{"class":362},[164,7940,365],{"class":384},[164,7942,906],{"class":255},[164,7944,7945,7948],{"class":166,"line":545},[164,7946,7947],{"class":259}," data",[164,7949,421],{"class":255},[164,7951,7952,7954],{"class":166,"line":562},[164,7953,1498],{"class":255},[164,7955,532],{"class":384},[164,7957,7958],{"class":166,"line":578},[164,7959,1260],{"class":255},[164,7961,7962],{"class":166,"line":583},[164,7963,343],{"emptyLinePlaceholder":342},[164,7965,7966,7968,7971,7973,7975,7977,7979,7981,7983,7985,7987,7989,7992,7994,7996,7998,8000,8002],{"class":166,"line":589},[164,7967,2742],{"class":352},[164,7969,7970],{"class":384}," update",[164,7972,365],{"class":255},[164,7974,397],{"class":791},[164,7976,388],{"class":255},[164,7978,1136],{"class":597},[164,7980,263],{"class":255},[164,7982,807],{"class":791},[164,7984,388],{"class":255},[164,7986,7769],{"class":597},[164,7988,405],{"class":255},[164,7990,7991],{"class":597},"UserUpdateInput",[164,7993,1150],{"class":255},[164,7995,1153],{"class":597},[164,7997,1122],{"class":255},[164,7999,1724],{"class":597},[164,8001,1160],{"class":255},[164,8003,378],{"class":255},[164,8005,8006,8008,8010,8012,8014,8016,8019,8021],{"class":166,"line":615},[164,8007,1768],{"class":251},[164,8009,7788],{"class":259},[164,8011,405],{"class":255},[164,8013,7857],{"class":259},[164,8015,405],{"class":255},[164,8017,8018],{"class":362},"update",[164,8020,365],{"class":384},[164,8022,906],{"class":255},[164,8024,8025,8027,8029,8031,8033],{"class":166,"line":978},[164,8026,2825],{"class":384},[164,8028,388],{"class":255},[164,8030,256],{"class":255},[164,8032,2713],{"class":259},[164,8034,1492],{"class":255},[164,8036,8037,8039],{"class":166,"line":984},[164,8038,7947],{"class":259},[164,8040,421],{"class":255},[164,8042,8043,8045],{"class":166,"line":992},[164,8044,1498],{"class":255},[164,8046,532],{"class":384},[164,8048,8049],{"class":166,"line":999},[164,8050,1260],{"class":255},[164,8052,8053],{"class":166,"line":1004},[164,8054,343],{"emptyLinePlaceholder":342},[164,8056,8057,8059,8062,8064,8066,8068,8070,8072,8074,8076,8079,8081],{"class":166,"line":1010},[164,8058,2742],{"class":352},[164,8060,8061],{"class":384}," delete",[164,8063,365],{"class":255},[164,8065,397],{"class":791},[164,8067,388],{"class":255},[164,8069,1136],{"class":597},[164,8071,1150],{"class":255},[164,8073,1153],{"class":597},[164,8075,1122],{"class":255},[164,8077,8078],{"class":597},"void",[164,8080,1160],{"class":255},[164,8082,378],{"class":255},[164,8084,8085,8088,8090,8092,8094,8096,8099,8101],{"class":166,"line":1466},[164,8086,8087],{"class":251}," await",[164,8089,7788],{"class":259},[164,8091,405],{"class":255},[164,8093,7857],{"class":259},[164,8095,405],{"class":255},[164,8097,8098],{"class":362},"delete",[164,8100,365],{"class":384},[164,8102,906],{"class":255},[164,8104,8105,8107,8109,8111,8113],{"class":166,"line":1495},[164,8106,2825],{"class":384},[164,8108,388],{"class":255},[164,8110,256],{"class":255},[164,8112,2713],{"class":259},[164,8114,1492],{"class":255},[164,8116,8117,8119],{"class":166,"line":1505},[164,8118,1498],{"class":255},[164,8120,532],{"class":384},[164,8122,8123],{"class":166,"line":5434},[164,8124,1260],{"class":255},[164,8126,8127],{"class":166,"line":5454},[164,8128,1281],{"class":255},[98,8130,8132],{"id":8131},"api-design-with-strong-types","API Design with Strong Types",[149,8134,8136],{"id":8135},"requestresponse-types","Request/Response Types",[154,8138,8140],{"className":156,"code":8139,"language":158,"meta":159,"style":159},"// src/types/api.ts\nexport interface CreateUserRequest {\n email: string\n name: string\n password: string\n}\n\nexport interface UserResponse {\n id: string\n email: string\n name: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ApiResponse {\n success: boolean\n data?: T\n error?: string\n message?: string\n}\n",[161,8141,8142,8147,8159,8167,8175,8184,8188,8192,8203,8211,8219,8227,8235,8244,8248,8252,8272,8281,8289,8297,8306],{"__ignoreMap":159},[164,8143,8144],{"class":166,"line":167},[164,8145,8146],{"class":170},"// src/types/api.ts\n",[164,8148,8149,8151,8154,8157],{"class":166,"line":174},[164,8150,349],{"class":251},[164,8152,8153],{"class":352}," interface",[164,8155,8156],{"class":597}," CreateUserRequest",[164,8158,378],{"class":255},[164,8160,8161,8163,8165],{"class":166,"line":16},[164,8162,427],{"class":384},[164,8164,388],{"class":255},[164,8166,3389],{"class":597},[164,8168,8169,8171,8173],{"class":166,"line":185},[164,8170,464],{"class":384},[164,8172,388],{"class":255},[164,8174,3389],{"class":597},[164,8176,8177,8180,8182],{"class":166,"line":191},[164,8178,8179],{"class":384}," password",[164,8181,388],{"class":255},[164,8183,3389],{"class":597},[164,8185,8186],{"class":166,"line":346},[164,8187,1281],{"class":255},[164,8189,8190],{"class":166,"line":381},[164,8191,343],{"emptyLinePlaceholder":342},[164,8193,8194,8196,8198,8201],{"class":166,"line":424},[164,8195,349],{"class":251},[164,8197,8153],{"class":352},[164,8199,8200],{"class":597}," UserResponse",[164,8202,378],{"class":255},[164,8204,8205,8207,8209],{"class":166,"line":461},[164,8206,385],{"class":384},[164,8208,388],{"class":255},[164,8210,3389],{"class":597},[164,8212,8213,8215,8217],{"class":166,"line":490},[164,8214,427],{"class":384},[164,8216,388],{"class":255},[164,8218,3389],{"class":597},[164,8220,8221,8223,8225],{"class":166,"line":526},[164,8222,464],{"class":384},[164,8224,388],{"class":255},[164,8226,3389],{"class":597},[164,8228,8229,8231,8233],{"class":166,"line":535},[164,8230,493],{"class":384},[164,8232,388],{"class":255},[164,8234,3389],{"class":597},[164,8236,8237,8240,8242],{"class":166,"line":29},[164,8238,8239],{"class":384}," updatedAt",[164,8241,388],{"class":255},[164,8243,3389],{"class":597},[164,8245,8246],{"class":166,"line":545},[164,8247,1281],{"class":255},[164,8249,8250],{"class":166,"line":562},[164,8251,343],{"emptyLinePlaceholder":342},[164,8253,8254,8256,8258,8260,8262,8264,8266,8268,8270],{"class":166,"line":578},[164,8255,349],{"class":251},[164,8257,8153],{"class":352},[164,8259,2031],{"class":597},[164,8261,1122],{"class":255},[164,8263,1125],{"class":597},[164,8265,601],{"class":255},[164,8267,3422],{"class":597},[164,8269,1160],{"class":255},[164,8271,378],{"class":255},[164,8273,8274,8277,8279],{"class":166,"line":583},[164,8275,8276],{"class":384}," success",[164,8278,388],{"class":255},[164,8280,6946],{"class":597},[164,8282,8283,8285,8287],{"class":166,"line":589},[164,8284,4522],{"class":384},[164,8286,1144],{"class":255},[164,8288,4527],{"class":597},[164,8290,8291,8293,8295],{"class":166,"line":615},[164,8292,7290],{"class":384},[164,8294,1144],{"class":255},[164,8296,3389],{"class":597},[164,8298,8299,8302,8304],{"class":166,"line":978},[164,8300,8301],{"class":384}," message",[164,8303,1144],{"class":255},[164,8305,3389],{"class":597},[164,8307,8308],{"class":166,"line":984},[164,8309,1281],{"class":255},[149,8311,8313],{"id":8312},"validated-controllers","Validated Controllers",[154,8315,8317],{"className":156,"code":8316,"language":158,"meta":159,"style":159},"// src/controllers/UserController.ts\nimport { Request, Response, NextFunction } from \"express\"\nimport { z } from \"zod\"\nimport { UserService } from \"../services/UserService\"\nimport { ValidationError } from \"../errors/AppError\"\n\nconst createUserSchema = z.object({\n email: z.string().email(),\n name: z.string().min(2),\n password: z.string().min(8),\n})\n\nexport class UserController {\n constructor(private userService: UserService) {}\n\n async createUser(req: Request, res: Response, next: NextFunction) {\n try {\n const validatedData = createUserSchema.parse(req.body)\n const user = await this.userService.createUser(validatedData)\n\n res.status(201).json({\n success: true,\n data: user,\n })\n } catch (error) {\n if (error instanceof z.ZodError) {\n next(\n new ValidationError(error.errors[0]?.message || \"Validation failed\"),\n )\n } else {\n next(error)\n }\n }\n }\n}\n",[161,8318,8319,8324,8350,8368,8388,8406,8410,8429,8451,8478,8505,8511,8515,8526,8546,8550,8585,8592,8620,8647,8651,8675,8686,8697,8704,8719,8741,8748,8789,8794,8803,8813,8818,8822,8826],{"__ignoreMap":159},[164,8320,8321],{"class":166,"line":167},[164,8322,8323],{"class":170},"// src/controllers/UserController.ts\n",[164,8325,8326,8328,8330,8332,8334,8336,8338,8340,8342,8344,8346,8348],{"class":166,"line":174},[164,8327,252],{"class":251},[164,8329,256],{"class":255},[164,8331,7228],{"class":259},[164,8333,263],{"class":255},[164,8335,7233],{"class":259},[164,8337,263],{"class":255},[164,8339,7238],{"class":259},[164,8341,279],{"class":255},[164,8343,282],{"class":251},[164,8345,285],{"class":255},[164,8347,6133],{"class":288},[164,8349,292],{"class":255},[164,8351,8352,8354,8356,8358,8360,8362,8364,8366],{"class":166,"line":16},[164,8353,252],{"class":251},[164,8355,256],{"class":255},[164,8357,326],{"class":259},[164,8359,279],{"class":255},[164,8361,282],{"class":251},[164,8363,285],{"class":255},[164,8365,335],{"class":288},[164,8367,292],{"class":255},[164,8369,8370,8372,8374,8377,8379,8381,8383,8386],{"class":166,"line":185},[164,8371,252],{"class":251},[164,8373,256],{"class":255},[164,8375,8376],{"class":259}," UserService",[164,8378,279],{"class":255},[164,8380,282],{"class":251},[164,8382,285],{"class":255},[164,8384,8385],{"class":288},"../services/UserService",[164,8387,292],{"class":255},[164,8389,8390,8392,8394,8396,8398,8400,8402,8404],{"class":166,"line":191},[164,8391,252],{"class":251},[164,8393,256],{"class":255},[164,8395,7092],{"class":259},[164,8397,279],{"class":255},[164,8399,282],{"class":251},[164,8401,285],{"class":255},[164,8403,7265],{"class":288},[164,8405,292],{"class":255},[164,8407,8408],{"class":166,"line":346},[164,8409,343],{"emptyLinePlaceholder":342},[164,8411,8412,8414,8417,8419,8421,8423,8425,8427],{"class":166,"line":381},[164,8413,721],{"class":352},[164,8415,8416],{"class":259}," createUserSchema ",[164,8418,359],{"class":255},[164,8420,326],{"class":259},[164,8422,405],{"class":255},[164,8424,1909],{"class":362},[164,8426,365],{"class":259},[164,8428,906],{"class":255},[164,8430,8431,8433,8435,8437,8439,8441,8443,8445,8447,8449],{"class":166,"line":424},[164,8432,427],{"class":384},[164,8434,388],{"class":255},[164,8436,326],{"class":259},[164,8438,405],{"class":255},[164,8440,1953],{"class":362},[164,8442,411],{"class":259},[164,8444,405],{"class":255},[164,8446,438],{"class":362},[164,8448,411],{"class":259},[164,8450,421],{"class":255},[164,8452,8453,8455,8457,8459,8461,8463,8465,8467,8469,8471,8474,8476],{"class":166,"line":461},[164,8454,464],{"class":384},[164,8456,388],{"class":255},[164,8458,326],{"class":259},[164,8460,405],{"class":255},[164,8462,1953],{"class":362},[164,8464,411],{"class":259},[164,8466,405],{"class":255},[164,8468,2163],{"class":362},[164,8470,365],{"class":259},[164,8472,8473],{"class":921},"2",[164,8475,402],{"class":259},[164,8477,421],{"class":255},[164,8479,8480,8482,8484,8486,8488,8490,8492,8494,8496,8498,8501,8503],{"class":166,"line":490},[164,8481,8179],{"class":384},[164,8483,388],{"class":255},[164,8485,326],{"class":259},[164,8487,405],{"class":255},[164,8489,1953],{"class":362},[164,8491,411],{"class":259},[164,8493,405],{"class":255},[164,8495,2163],{"class":362},[164,8497,365],{"class":259},[164,8499,8500],{"class":921},"8",[164,8502,402],{"class":259},[164,8504,421],{"class":255},[164,8506,8507,8509],{"class":166,"line":526},[164,8508,529],{"class":255},[164,8510,532],{"class":259},[164,8512,8513],{"class":166,"line":535},[164,8514,343],{"emptyLinePlaceholder":342},[164,8516,8517,8519,8521,8524],{"class":166,"line":29},[164,8518,349],{"class":251},[164,8520,3223],{"class":352},[164,8522,8523],{"class":597}," UserController",[164,8525,378],{"class":255},[164,8527,8528,8530,8532,8535,8538,8540,8542,8544],{"class":166,"line":545},[164,8529,6955],{"class":352},[164,8531,365],{"class":255},[164,8533,8534],{"class":352},"private",[164,8536,8537],{"class":791}," userService",[164,8539,388],{"class":255},[164,8541,8376],{"class":597},[164,8543,402],{"class":255},[164,8545,3357],{"class":255},[164,8547,8548],{"class":166,"line":562},[164,8549,343],{"emptyLinePlaceholder":342},[164,8551,8552,8554,8556,8558,8560,8562,8564,8566,8568,8570,8572,8574,8577,8579,8581,8583],{"class":166,"line":578},[164,8553,2742],{"class":352},[164,8555,3413],{"class":384},[164,8557,365],{"class":255},[164,8559,817],{"class":791},[164,8561,388],{"class":255},[164,8563,7228],{"class":597},[164,8565,263],{"class":255},[164,8567,7363],{"class":791},[164,8569,388],{"class":255},[164,8571,7233],{"class":597},[164,8573,263],{"class":255},[164,8575,8576],{"class":791}," next",[164,8578,388],{"class":255},[164,8580,7238],{"class":597},[164,8582,402],{"class":255},[164,8584,378],{"class":255},[164,8586,8587,8590],{"class":166,"line":583},[164,8588,8589],{"class":251}," try",[164,8591,378],{"class":255},[164,8593,8594,8597,8600,8602,8605,8607,8609,8611,8613,8615,8618],{"class":166,"line":589},[164,8595,8596],{"class":352}," const",[164,8598,8599],{"class":259}," validatedData",[164,8601,601],{"class":255},[164,8603,8604],{"class":259}," createUserSchema",[164,8606,405],{"class":255},[164,8608,2248],{"class":362},[164,8610,365],{"class":384},[164,8612,817],{"class":259},[164,8614,405],{"class":255},[164,8616,8617],{"class":259},"body",[164,8619,532],{"class":384},[164,8621,8622,8624,8626,8628,8630,8632,8635,8637,8640,8642,8645],{"class":166,"line":615},[164,8623,8596],{"class":352},[164,8625,848],{"class":259},[164,8627,601],{"class":255},[164,8629,853],{"class":251},[164,8631,7066],{"class":255},[164,8633,8634],{"class":259},"userService",[164,8636,405],{"class":255},[164,8638,8639],{"class":362},"createUser",[164,8641,365],{"class":384},[164,8643,8644],{"class":259},"validatedData",[164,8646,532],{"class":384},[164,8648,8649],{"class":166,"line":978},[164,8650,343],{"emptyLinePlaceholder":342},[164,8652,8653,8656,8658,8660,8662,8665,8667,8669,8671,8673],{"class":166,"line":984},[164,8654,8655],{"class":259}," res",[164,8657,405],{"class":255},[164,8659,1251],{"class":362},[164,8661,365],{"class":384},[164,8663,8664],{"class":921},"201",[164,8666,402],{"class":384},[164,8668,405],{"class":255},[164,8670,773],{"class":362},[164,8672,365],{"class":384},[164,8674,906],{"class":255},[164,8676,8677,8680,8682,8684],{"class":166,"line":992},[164,8678,8679],{"class":384}," success",[164,8681,388],{"class":255},[164,8683,2865],{"class":1737},[164,8685,421],{"class":255},[164,8687,8688,8691,8693,8695],{"class":166,"line":999},[164,8689,8690],{"class":384}," data",[164,8692,388],{"class":255},[164,8694,848],{"class":259},[164,8696,421],{"class":255},[164,8698,8699,8702],{"class":166,"line":1004},[164,8700,8701],{"class":255}," }",[164,8703,532],{"class":384},[164,8705,8706,8708,8711,8713,8715,8717],{"class":166,"line":1010},[164,8707,1498],{"class":255},[164,8709,8710],{"class":251}," catch",[164,8712,788],{"class":384},[164,8714,7347],{"class":259},[164,8716,1223],{"class":384},[164,8718,906],{"class":255},[164,8720,8721,8724,8726,8728,8730,8732,8734,8737,8739],{"class":166,"line":1466},[164,8722,8723],{"class":251}," if",[164,8725,788],{"class":384},[164,8727,7347],{"class":259},[164,8729,7350],{"class":255},[164,8731,326],{"class":597},[164,8733,405],{"class":255},[164,8735,8736],{"class":597},"ZodError",[164,8738,1223],{"class":384},[164,8740,906],{"class":255},[164,8742,8743,8746],{"class":166,"line":1495},[164,8744,8745],{"class":362}," next",[164,8747,2671],{"class":384},[164,8749,8750,8753,8755,8757,8759,8761,8764,8766,8768,8770,8773,8775,8778,8780,8783,8785,8787],{"class":166,"line":1505},[164,8751,8752],{"class":255}," new",[164,8754,7092],{"class":362},[164,8756,365],{"class":384},[164,8758,7347],{"class":259},[164,8760,405],{"class":255},[164,8762,8763],{"class":259},"errors",[164,8765,918],{"class":384},[164,8767,922],{"class":921},[164,8769,925],{"class":384},[164,8771,8772],{"class":255},"?.",[164,8774,7017],{"class":259},[164,8776,8777],{"class":255}," ||",[164,8779,285],{"class":255},[164,8781,8782],{"class":288},"Validation failed",[164,8784,368],{"class":255},[164,8786,402],{"class":384},[164,8788,421],{"class":255},[164,8790,8791],{"class":166,"line":5434},[164,8792,8793],{"class":384}," )\n",[164,8795,8796,8798,8801],{"class":166,"line":5454},[164,8797,8701],{"class":255},[164,8799,8800],{"class":251}," else",[164,8802,378],{"class":255},[164,8804,8805,8807,8809,8811],{"class":166,"line":5468},[164,8806,8745],{"class":362},[164,8808,365],{"class":384},[164,8810,7347],{"class":259},[164,8812,532],{"class":384},[164,8814,8815],{"class":166,"line":5482},[164,8816,8817],{"class":255}," }\n",[164,8819,8820],{"class":166,"line":5496},[164,8821,1743],{"class":255},[164,8823,8824],{"class":166,"line":5511},[164,8825,1260],{"class":255},[164,8827,8829],{"class":166,"line":8828},35,[164,8830,1281],{"class":255},[98,8832,8834],{"id":8833},"performance-optimization","Performance Optimization",[149,8836,8838],{"id":8837},"compilation-speed","Compilation Speed",[154,8840,8842],{"className":4974,"code":8841,"language":773,"meta":159,"style":159},"// tsconfig.json - for faster builds\n{\n \"compilerOptions\": {\n \"incremental\": true,\n \"tsBuildInfoFile\": \".tsbuildinfo\"\n },\n \"ts-node\": {\n \"transpileOnly\": true,\n \"files\": true\n }\n}\n",[161,8843,8844,8849,8853,8865,8878,8896,8900,8912,8925,8938,8942],{"__ignoreMap":159},[164,8845,8846],{"class":166,"line":167},[164,8847,8848],{"class":170},"// tsconfig.json - for faster builds\n",[164,8850,8851],{"class":166,"line":174},[164,8852,906],{"class":255},[164,8854,8855,8857,8859,8861,8863],{"class":166,"line":16},[164,8856,2676],{"class":255},[164,8858,6197],{"class":352},[164,8860,368],{"class":255},[164,8862,388],{"class":255},[164,8864,378],{"class":255},[164,8866,8867,8869,8872,8874,8876],{"class":166,"line":185},[164,8868,5227],{"class":255},[164,8870,8871],{"class":597},"incremental",[164,8873,368],{"class":255},[164,8875,388],{"class":255},[164,8877,5176],{"class":255},[164,8879,8880,8882,8885,8887,8889,8891,8894],{"class":166,"line":191},[164,8881,5227],{"class":255},[164,8883,8884],{"class":597},"tsBuildInfoFile",[164,8886,368],{"class":255},[164,8888,388],{"class":255},[164,8890,285],{"class":255},[164,8892,8893],{"class":288},".tsbuildinfo",[164,8895,292],{"class":255},[164,8897,8898],{"class":166,"line":346},[164,8899,1748],{"class":255},[164,8901,8902,8904,8906,8908,8910],{"class":166,"line":381},[164,8903,2676],{"class":255},[164,8905,6019],{"class":352},[164,8907,368],{"class":255},[164,8909,388],{"class":255},[164,8911,378],{"class":255},[164,8913,8914,8916,8919,8921,8923],{"class":166,"line":424},[164,8915,5227],{"class":255},[164,8917,8918],{"class":597},"transpileOnly",[164,8920,368],{"class":255},[164,8922,388],{"class":255},[164,8924,5176],{"class":255},[164,8926,8927,8929,8932,8934,8936],{"class":166,"line":461},[164,8928,5227],{"class":255},[164,8930,8931],{"class":597},"files",[164,8933,368],{"class":255},[164,8935,388],{"class":255},[164,8937,1738],{"class":255},[164,8939,8940],{"class":166,"line":490},[164,8941,1260],{"class":255},[164,8943,8944],{"class":166,"line":526},[164,8945,1281],{"class":255},[149,8947,8949],{"id":8948},"runtime-performance","Runtime Performance",[154,8951,8953],{"className":156,"code":8952,"language":158,"meta":159,"style":159},"// Use type assertions carefully\nconst user = data as User // Fast but unsafe\nconst user = data satisfies User // Type-safe validation\n\n// Prefer interfaces over types for objects\ninterface User {\n id: string\n name: string\n}\n\n// Use const assertions for immutable data\nconst config = {\n port: 3000,\n host: \"localhost\",\n} as const\n",[161,8954,8955,8960,8979,8997,9001,9006,9014,9022,9030,9034,9038,9043,9054,9066,9082],{"__ignoreMap":159},[164,8956,8957],{"class":166,"line":167},[164,8958,8959],{"class":170},"// Use type assertions carefully\n",[164,8961,8962,8964,8967,8969,8972,8974,8976],{"class":166,"line":174},[164,8963,721],{"class":352},[164,8965,8966],{"class":259}," user ",[164,8968,359],{"class":255},[164,8970,8971],{"class":259}," data ",[164,8973,1716],{"class":251},[164,8975,598],{"class":597},[164,8977,8978],{"class":170}," // Fast but unsafe\n",[164,8980,8981,8983,8985,8987,8989,8992,8994],{"class":166,"line":16},[164,8982,721],{"class":352},[164,8984,8966],{"class":259},[164,8986,359],{"class":255},[164,8988,8971],{"class":259},[164,8990,8991],{"class":251},"satisfies",[164,8993,598],{"class":597},[164,8995,8996],{"class":170}," // Type-safe validation\n",[164,8998,8999],{"class":166,"line":185},[164,9000,343],{"emptyLinePlaceholder":342},[164,9002,9003],{"class":166,"line":191},[164,9004,9005],{"class":170},"// Prefer interfaces over types for objects\n",[164,9007,9008,9010,9012],{"class":166,"line":346},[164,9009,3376],{"class":352},[164,9011,598],{"class":597},[164,9013,378],{"class":255},[164,9015,9016,9018,9020],{"class":166,"line":381},[164,9017,385],{"class":384},[164,9019,388],{"class":255},[164,9021,3389],{"class":597},[164,9023,9024,9026,9028],{"class":166,"line":424},[164,9025,464],{"class":384},[164,9027,388],{"class":255},[164,9029,3389],{"class":597},[164,9031,9032],{"class":166,"line":461},[164,9033,1281],{"class":255},[164,9035,9036],{"class":166,"line":490},[164,9037,343],{"emptyLinePlaceholder":342},[164,9039,9040],{"class":166,"line":526},[164,9041,9042],{"class":170},"// Use const assertions for immutable data\n",[164,9044,9045,9047,9050,9052],{"class":166,"line":535},[164,9046,721],{"class":352},[164,9048,9049],{"class":259}," config ",[164,9051,359],{"class":255},[164,9053,378],{"class":255},[164,9055,9056,9059,9061,9064],{"class":166,"line":29},[164,9057,9058],{"class":384}," port",[164,9060,388],{"class":255},[164,9062,9063],{"class":921}," 3000",[164,9065,421],{"class":255},[164,9067,9068,9071,9073,9075,9078,9080],{"class":166,"line":545},[164,9069,9070],{"class":384}," host",[164,9072,388],{"class":255},[164,9074,285],{"class":255},[164,9076,9077],{"class":288},"localhost",[164,9079,368],{"class":255},[164,9081,421],{"class":255},[164,9083,9084,9086,9088],{"class":166,"line":562},[164,9085,529],{"class":255},[164,9087,3439],{"class":251},[164,9089,9090],{"class":352}," const\n",[98,9092,9094],{"id":9093},"monitoring-and-logging","Monitoring and Logging",[149,9096,9098],{"id":9097},"structured-logging","Structured Logging",[154,9100,9102],{"className":156,"code":9101,"language":158,"meta":159,"style":159},"// src/utils/logger.ts\nimport winston from \"winston\"\n\nexport const logger = winston.createLogger({\n level: process.env.LOG_LEVEL || \"info\",\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.json(),\n ),\n transports: [\n new winston.transports.File({ filename: \"error.log\", level: \"error\" }),\n new winston.transports.File({ filename: \"combined.log\" }),\n ...(process.env.NODE_ENV !== \"production\"\n ? [\n new winston.transports.Console({\n format: winston.format.simple(),\n }),\n ]\n : []),\n ],\n})\n",[161,9103,9104,9109,9126,9130,9153,9184,9204,9222,9250,9266,9272,9282,9334,9369,9392,9399,9418,9440,9449,9454,9464,9471],{"__ignoreMap":159},[164,9105,9106],{"class":166,"line":167},[164,9107,9108],{"class":170},"// src/utils/logger.ts\n",[164,9110,9111,9113,9116,9119,9121,9124],{"class":166,"line":174},[164,9112,252],{"class":251},[164,9114,9115],{"class":259}," winston ",[164,9117,9118],{"class":251},"from",[164,9120,285],{"class":255},[164,9122,9123],{"class":288},"winston",[164,9125,292],{"class":255},[164,9127,9128],{"class":166,"line":16},[164,9129,343],{"emptyLinePlaceholder":342},[164,9131,9132,9134,9136,9139,9141,9144,9146,9149,9151],{"class":166,"line":185},[164,9133,349],{"class":251},[164,9135,353],{"class":352},[164,9137,9138],{"class":259}," logger ",[164,9140,359],{"class":255},[164,9142,9143],{"class":259}," winston",[164,9145,405],{"class":255},[164,9147,9148],{"class":362},"createLogger",[164,9150,365],{"class":259},[164,9152,906],{"class":255},[164,9154,9155,9158,9160,9163,9165,9167,9169,9172,9175,9177,9180,9182],{"class":166,"line":191},[164,9156,9157],{"class":384}," level",[164,9159,388],{"class":255},[164,9161,9162],{"class":259}," process",[164,9164,405],{"class":255},[164,9166,7430],{"class":259},[164,9168,405],{"class":255},[164,9170,9171],{"class":259},"LOG_LEVEL ",[164,9173,9174],{"class":255},"||",[164,9176,285],{"class":255},[164,9178,9179],{"class":288},"info",[164,9181,368],{"class":255},[164,9183,421],{"class":255},[164,9185,9186,9189,9191,9193,9195,9197,9199,9202],{"class":166,"line":346},[164,9187,9188],{"class":384}," format",[164,9190,388],{"class":255},[164,9192,9143],{"class":259},[164,9194,405],{"class":255},[164,9196,3169],{"class":259},[164,9198,405],{"class":255},[164,9200,9201],{"class":362},"combine",[164,9203,2671],{"class":259},[164,9205,9206,9209,9211,9213,9215,9218,9220],{"class":166,"line":381},[164,9207,9208],{"class":259}," winston",[164,9210,405],{"class":255},[164,9212,3169],{"class":259},[164,9214,405],{"class":255},[164,9216,9217],{"class":362},"timestamp",[164,9219,411],{"class":259},[164,9221,421],{"class":255},[164,9223,9224,9226,9228,9230,9232,9234,9236,9238,9240,9242,9244,9246,9248],{"class":166,"line":424},[164,9225,9208],{"class":259},[164,9227,405],{"class":255},[164,9229,3169],{"class":259},[164,9231,405],{"class":255},[164,9233,8763],{"class":362},[164,9235,365],{"class":259},[164,9237,2710],{"class":255},[164,9239,7452],{"class":384},[164,9241,388],{"class":255},[164,9243,2865],{"class":1737},[164,9245,279],{"class":255},[164,9247,402],{"class":259},[164,9249,421],{"class":255},[164,9251,9252,9254,9256,9258,9260,9262,9264],{"class":166,"line":461},[164,9253,9208],{"class":259},[164,9255,405],{"class":255},[164,9257,3169],{"class":259},[164,9259,405],{"class":255},[164,9261,773],{"class":362},[164,9263,411],{"class":259},[164,9265,421],{"class":255},[164,9267,9268,9270],{"class":166,"line":490},[164,9269,7005],{"class":259},[164,9271,421],{"class":255},[164,9273,9274,9277,9279],{"class":166,"line":526},[164,9275,9276],{"class":384}," transports",[164,9278,388],{"class":255},[164,9280,9281],{"class":259}," [\n",[164,9283,9284,9287,9289,9291,9294,9296,9299,9301,9303,9306,9308,9310,9313,9315,9317,9320,9322,9324,9326,9328,9330,9332],{"class":166,"line":535},[164,9285,9286],{"class":255}," new",[164,9288,9143],{"class":259},[164,9290,405],{"class":255},[164,9292,9293],{"class":259},"transports",[164,9295,405],{"class":255},[164,9297,9298],{"class":362},"File",[164,9300,365],{"class":259},[164,9302,2710],{"class":255},[164,9304,9305],{"class":384}," filename",[164,9307,388],{"class":255},[164,9309,285],{"class":255},[164,9311,9312],{"class":288},"error.log",[164,9314,368],{"class":255},[164,9316,263],{"class":255},[164,9318,9319],{"class":384}," level",[164,9321,388],{"class":255},[164,9323,285],{"class":255},[164,9325,7347],{"class":288},[164,9327,368],{"class":255},[164,9329,279],{"class":255},[164,9331,402],{"class":259},[164,9333,421],{"class":255},[164,9335,9336,9338,9340,9342,9344,9346,9348,9350,9352,9354,9356,9358,9361,9363,9365,9367],{"class":166,"line":29},[164,9337,9286],{"class":255},[164,9339,9143],{"class":259},[164,9341,405],{"class":255},[164,9343,9293],{"class":259},[164,9345,405],{"class":255},[164,9347,9298],{"class":362},[164,9349,365],{"class":259},[164,9351,2710],{"class":255},[164,9353,9305],{"class":384},[164,9355,388],{"class":255},[164,9357,285],{"class":255},[164,9359,9360],{"class":288},"combined.log",[164,9362,368],{"class":255},[164,9364,279],{"class":255},[164,9366,402],{"class":259},[164,9368,421],{"class":255},[164,9370,9371,9374,9376,9378,9380,9382,9384,9386,9388,9390],{"class":166,"line":545},[164,9372,9373],{"class":255}," ...",[164,9375,2251],{"class":259},[164,9377,405],{"class":255},[164,9379,7430],{"class":259},[164,9381,405],{"class":255},[164,9383,7710],{"class":259},[164,9385,7713],{"class":255},[164,9387,285],{"class":255},[164,9389,2203],{"class":288},[164,9391,292],{"class":255},[164,9393,9394,9397],{"class":166,"line":562},[164,9395,9396],{"class":255}," ?",[164,9398,9281],{"class":259},[164,9400,9401,9403,9405,9407,9409,9411,9414,9416],{"class":166,"line":578},[164,9402,8752],{"class":255},[164,9404,9143],{"class":259},[164,9406,405],{"class":255},[164,9408,9293],{"class":259},[164,9410,405],{"class":255},[164,9412,9413],{"class":362},"Console",[164,9415,365],{"class":259},[164,9417,906],{"class":255},[164,9419,9420,9423,9425,9427,9429,9431,9433,9436,9438],{"class":166,"line":583},[164,9421,9422],{"class":384}," format",[164,9424,388],{"class":255},[164,9426,9143],{"class":259},[164,9428,405],{"class":255},[164,9430,3169],{"class":259},[164,9432,405],{"class":255},[164,9434,9435],{"class":362},"simple",[164,9437,411],{"class":259},[164,9439,421],{"class":255},[164,9441,9442,9445,9447],{"class":166,"line":589},[164,9443,9444],{"class":255}," }",[164,9446,402],{"class":259},[164,9448,421],{"class":255},[164,9450,9451],{"class":166,"line":615},[164,9452,9453],{"class":259}," ]\n",[164,9455,9456,9459,9462],{"class":166,"line":978},[164,9457,9458],{"class":255}," :",[164,9460,9461],{"class":259}," [])",[164,9463,421],{"class":255},[164,9465,9466,9469],{"class":166,"line":984},[164,9467,9468],{"class":259}," ]",[164,9470,421],{"class":255},[164,9472,9473,9475],{"class":166,"line":992},[164,9474,529],{"class":255},[164,9476,532],{"class":259},[98,9478,9480],{"id":9479},"testing-strategy","Testing Strategy",[149,9482,9484],{"id":9483},"unit-tests-with-jest","Unit Tests with Jest",[154,9486,9488],{"className":156,"code":9487,"language":158,"meta":159,"style":159},"// src/services/__tests__/UserService.test.ts\nimport { UserService } from \"../UserService\"\nimport { UserRepository } from \"../../repositories/UserRepository\"\n\njest.mock(\"../../repositories/UserRepository\")\n\ndescribe(\"UserService\", () => {\n let userService: UserService\n let mockUserRepository: jest.Mocked\n\n beforeEach(() => {\n mockUserRepository = new UserRepository() as jest.Mocked\n userService = new UserService(mockUserRepository)\n })\n\n it(\"should create user successfully\", async () => {\n const userData = {\n email: \"test@example.com\",\n name: \"Test User\",\n password: \"password123\",\n }\n\n mockUserRepository.create.mockResolvedValue({\n id: \"1\",\n ...userData,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n\n const result = await userService.createUser(userData)\n\n expect(result).toBeDefined()\n expect(result.email).toBe(userData.email)\n expect(mockUserRepository.create).toHaveBeenCalledWith(userData)\n })\n})\n",[161,9489,9490,9495,9514,9533,9537,9556,9560,9582,9594,9618,9622,9635,9662,9680,9686,9690,9714,9725,9741,9757,9773,9777,9781,9798,9813,9822,9837,9852,9858,9862,9885,9889,9908,9937,9962,9968],{"__ignoreMap":159},[164,9491,9492],{"class":166,"line":167},[164,9493,9494],{"class":170},"// src/services/__tests__/UserService.test.ts\n",[164,9496,9497,9499,9501,9503,9505,9507,9509,9512],{"class":166,"line":174},[164,9498,252],{"class":251},[164,9500,256],{"class":255},[164,9502,8376],{"class":259},[164,9504,279],{"class":255},[164,9506,282],{"class":251},[164,9508,285],{"class":255},[164,9510,9511],{"class":288},"../UserService",[164,9513,292],{"class":255},[164,9515,9516,9518,9520,9522,9524,9526,9528,9531],{"class":166,"line":16},[164,9517,252],{"class":251},[164,9519,256],{"class":255},[164,9521,7812],{"class":259},[164,9523,279],{"class":255},[164,9525,282],{"class":251},[164,9527,285],{"class":255},[164,9529,9530],{"class":288},"../../repositories/UserRepository",[164,9532,292],{"class":255},[164,9534,9535],{"class":166,"line":185},[164,9536,343],{"emptyLinePlaceholder":342},[164,9538,9539,9541,9543,9546,9548,9550,9552,9554],{"class":166,"line":191},[164,9540,6716],{"class":259},[164,9542,405],{"class":255},[164,9544,9545],{"class":362},"mock",[164,9547,365],{"class":259},[164,9549,368],{"class":255},[164,9551,9530],{"class":288},[164,9553,368],{"class":255},[164,9555,532],{"class":259},[164,9557,9558],{"class":166,"line":346},[164,9559,343],{"emptyLinePlaceholder":342},[164,9561,9562,9565,9567,9569,9572,9574,9576,9578,9580],{"class":166,"line":381},[164,9563,9564],{"class":362},"describe",[164,9566,365],{"class":259},[164,9568,368],{"class":255},[164,9570,9571],{"class":288},"UserService",[164,9573,368],{"class":255},[164,9575,263],{"class":255},[164,9577,1313],{"class":255},[164,9579,797],{"class":352},[164,9581,378],{"class":255},[164,9583,9584,9587,9589,9591],{"class":166,"line":424},[164,9585,9586],{"class":352}," let",[164,9588,8537],{"class":259},[164,9590,388],{"class":255},[164,9592,9593],{"class":597}," UserService\n",[164,9595,9596,9598,9601,9603,9606,9608,9611,9613,9616],{"class":166,"line":461},[164,9597,9586],{"class":352},[164,9599,9600],{"class":259}," mockUserRepository",[164,9602,388],{"class":255},[164,9604,9605],{"class":597}," jest",[164,9607,405],{"class":255},[164,9609,9610],{"class":597},"Mocked",[164,9612,1122],{"class":255},[164,9614,9615],{"class":597},"UserRepository",[164,9617,1540],{"class":255},[164,9619,9620],{"class":166,"line":490},[164,9621,343],{"emptyLinePlaceholder":342},[164,9623,9624,9627,9629,9631,9633],{"class":166,"line":526},[164,9625,9626],{"class":362}," beforeEach",[164,9628,365],{"class":384},[164,9630,411],{"class":255},[164,9632,797],{"class":352},[164,9634,378],{"class":255},[164,9636,9637,9640,9642,9644,9646,9648,9650,9652,9654,9656,9658,9660],{"class":166,"line":535},[164,9638,9639],{"class":259}," mockUserRepository",[164,9641,601],{"class":255},[164,9643,729],{"class":255},[164,9645,7812],{"class":362},[164,9647,2730],{"class":384},[164,9649,1716],{"class":251},[164,9651,9605],{"class":597},[164,9653,405],{"class":255},[164,9655,9610],{"class":597},[164,9657,1122],{"class":255},[164,9659,9615],{"class":597},[164,9661,1540],{"class":255},[164,9663,9664,9667,9669,9671,9673,9675,9678],{"class":166,"line":29},[164,9665,9666],{"class":259}," userService",[164,9668,601],{"class":255},[164,9670,729],{"class":255},[164,9672,8376],{"class":362},[164,9674,365],{"class":384},[164,9676,9677],{"class":259},"mockUserRepository",[164,9679,532],{"class":384},[164,9681,9682,9684],{"class":166,"line":545},[164,9683,987],{"class":255},[164,9685,532],{"class":384},[164,9687,9688],{"class":166,"line":562},[164,9689,343],{"emptyLinePlaceholder":342},[164,9691,9692,9695,9697,9699,9702,9704,9706,9708,9710,9712],{"class":166,"line":578},[164,9693,9694],{"class":362}," it",[164,9696,365],{"class":384},[164,9698,368],{"class":255},[164,9700,9701],{"class":288},"should create user successfully",[164,9703,368],{"class":255},[164,9705,263],{"class":255},[164,9707,785],{"class":352},[164,9709,1313],{"class":255},[164,9711,797],{"class":352},[164,9713,378],{"class":255},[164,9715,9716,9718,9721,9723],{"class":166,"line":583},[164,9717,2757],{"class":352},[164,9719,9720],{"class":259}," userData",[164,9722,601],{"class":255},[164,9724,378],{"class":255},[164,9726,9727,9730,9732,9734,9737,9739],{"class":166,"line":589},[164,9728,9729],{"class":384}," email",[164,9731,388],{"class":255},[164,9733,285],{"class":255},[164,9735,9736],{"class":288},"test@example.com",[164,9738,368],{"class":255},[164,9740,421],{"class":255},[164,9742,9743,9746,9748,9750,9753,9755],{"class":166,"line":615},[164,9744,9745],{"class":384}," name",[164,9747,388],{"class":255},[164,9749,285],{"class":255},[164,9751,9752],{"class":288},"Test User",[164,9754,368],{"class":255},[164,9756,421],{"class":255},[164,9758,9759,9762,9764,9766,9769,9771],{"class":166,"line":978},[164,9760,9761],{"class":384}," password",[164,9763,388],{"class":255},[164,9765,285],{"class":255},[164,9767,9768],{"class":288},"password123",[164,9770,368],{"class":255},[164,9772,421],{"class":255},[164,9774,9775],{"class":166,"line":984},[164,9776,1743],{"class":255},[164,9778,9779],{"class":166,"line":992},[164,9780,343],{"emptyLinePlaceholder":342},[164,9782,9783,9785,9787,9789,9791,9794,9796],{"class":166,"line":999},[164,9784,9639],{"class":259},[164,9786,405],{"class":255},[164,9788,3912],{"class":259},[164,9790,405],{"class":255},[164,9792,9793],{"class":362},"mockResolvedValue",[164,9795,365],{"class":384},[164,9797,906],{"class":255},[164,9799,9800,9803,9805,9807,9809,9811],{"class":166,"line":1004},[164,9801,9802],{"class":384}," id",[164,9804,388],{"class":255},[164,9806,285],{"class":255},[164,9808,2168],{"class":288},[164,9810,368],{"class":255},[164,9812,421],{"class":255},[164,9814,9815,9817,9820],{"class":166,"line":1010},[164,9816,7420],{"class":255},[164,9818,9819],{"class":259},"userData",[164,9821,421],{"class":255},[164,9823,9824,9827,9829,9831,9833,9835],{"class":166,"line":1466},[164,9825,9826],{"class":384}," createdAt",[164,9828,388],{"class":255},[164,9830,729],{"class":255},[164,9832,948],{"class":362},[164,9834,411],{"class":384},[164,9836,421],{"class":255},[164,9838,9839,9842,9844,9846,9848,9850],{"class":166,"line":1495},[164,9840,9841],{"class":384}," updatedAt",[164,9843,388],{"class":255},[164,9845,729],{"class":255},[164,9847,948],{"class":362},[164,9849,411],{"class":384},[164,9851,421],{"class":255},[164,9853,9854,9856],{"class":166,"line":1505},[164,9855,1498],{"class":255},[164,9857,532],{"class":384},[164,9859,9860],{"class":166,"line":5434},[164,9861,343],{"emptyLinePlaceholder":342},[164,9863,9864,9866,9869,9871,9873,9875,9877,9879,9881,9883],{"class":166,"line":5454},[164,9865,2757],{"class":352},[164,9867,9868],{"class":259}," result",[164,9870,601],{"class":255},[164,9872,853],{"class":251},[164,9874,8537],{"class":259},[164,9876,405],{"class":255},[164,9878,8639],{"class":362},[164,9880,365],{"class":384},[164,9882,9819],{"class":259},[164,9884,532],{"class":384},[164,9886,9887],{"class":166,"line":5468},[164,9888,343],{"emptyLinePlaceholder":342},[164,9890,9891,9894,9896,9899,9901,9903,9906],{"class":166,"line":5482},[164,9892,9893],{"class":362}," expect",[164,9895,365],{"class":384},[164,9897,9898],{"class":259},"result",[164,9900,402],{"class":384},[164,9902,405],{"class":255},[164,9904,9905],{"class":362},"toBeDefined",[164,9907,734],{"class":384},[164,9909,9910,9912,9914,9916,9918,9920,9922,9924,9927,9929,9931,9933,9935],{"class":166,"line":5496},[164,9911,9893],{"class":362},[164,9913,365],{"class":384},[164,9915,9898],{"class":259},[164,9917,405],{"class":255},[164,9919,438],{"class":259},[164,9921,402],{"class":384},[164,9923,405],{"class":255},[164,9925,9926],{"class":362},"toBe",[164,9928,365],{"class":384},[164,9930,9819],{"class":259},[164,9932,405],{"class":255},[164,9934,438],{"class":259},[164,9936,532],{"class":384},[164,9938,9939,9941,9943,9945,9947,9949,9951,9953,9956,9958,9960],{"class":166,"line":5511},[164,9940,9893],{"class":362},[164,9942,365],{"class":384},[164,9944,9677],{"class":259},[164,9946,405],{"class":255},[164,9948,3912],{"class":259},[164,9950,402],{"class":384},[164,9952,405],{"class":255},[164,9954,9955],{"class":362},"toHaveBeenCalledWith",[164,9957,365],{"class":384},[164,9959,9819],{"class":259},[164,9961,532],{"class":384},[164,9963,9964,9966],{"class":166,"line":8828},[164,9965,987],{"class":255},[164,9967,532],{"class":384},[164,9969,9971,9973],{"class":166,"line":9970},36,[164,9972,529],{"class":255},[164,9974,532],{"class":259},[98,9976,3988],{"id":3987},[102,9978,9979],{},"TypeScript in Node.js production environments requires attention to build processes, error handling, and type safety. The investment in proper setup pays dividends in maintainability, developer experience, and runtime reliability.",[102,9981,9982],{},"Key takeaways:",[113,9984,9985,9988,9991,9994,9997],{},[116,9986,9987],{},"Use strict TypeScript configuration",[116,9989,9990],{},"Implement proper error handling with custom error classes",[116,9992,9993],{},"Leverage type-safe database access patterns",[116,9995,9996],{},"Optimize for both development and production builds",[116,9998,9999],{},"Maintain comprehensive testing coverage",[102,10001,10002],{},"With these practices, you'll build robust, scalable Node.js applications that are a joy to maintain and extend.",[3996,10004],{},[98,10006,5842],{"id":5841},[102,10008,10009,10010,5848],{},"This post is part 2 of the ",[119,10011,4052],{},[200,10013,10014,10020,10028],{},[116,10015,10016,5863],{},[119,10017,10018],{},[4843,10019,5858],{"href":5857},[116,10021,10022,5812,10026,5872],{},[119,10023,10024],{},[4843,10025,5871],{"href":5870},[5860,10027,5862],{},[116,10029,10030,5881],{},[119,10031,10032],{},[4843,10033,5880],{"href":5879},[4005,10035,10036],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":159,"searchDepth":174,"depth":174,"links":10038},[10039,10040,10044,10048,10052,10056,10060,10064,10067,10070,10071],{"id":5940,"depth":174,"text":5935},{"id":5946,"depth":174,"text":5947,"children":10041},[10042,10043],{"id":5950,"depth":16,"text":5951},{"id":6175,"depth":16,"text":6176},{"id":6549,"depth":174,"text":6550,"children":10045},[10046,10047],{"id":6553,"depth":16,"text":6554},{"id":6729,"depth":16,"text":6730},{"id":6886,"depth":174,"text":6887,"children":10049},[10050,10051],{"id":6890,"depth":16,"text":6891},{"id":7208,"depth":16,"text":7209},{"id":7580,"depth":174,"text":7581,"children":10053},[10054,10055],{"id":7584,"depth":16,"text":7585},{"id":7745,"depth":16,"text":7746},{"id":8131,"depth":174,"text":8132,"children":10057},[10058,10059],{"id":8135,"depth":16,"text":8136},{"id":8312,"depth":16,"text":8313},{"id":8833,"depth":174,"text":8834,"children":10061},[10062,10063],{"id":8837,"depth":16,"text":8838},{"id":8948,"depth":16,"text":8949},{"id":9093,"depth":174,"text":9094,"children":10065},[10066],{"id":9097,"depth":16,"text":9098},{"id":9479,"depth":174,"text":9480,"children":10068},[10069],{"id":9483,"depth":16,"text":9484},{"id":3987,"depth":174,"text":3988},{"id":5841,"depth":174,"text":5842},"2024-02-28","Learn how to build, deploy, and maintain TypeScript Node.js applications in production environments with best practices and real-world examples.","/img/blog/6-typescript-nodejs-production-guide/banner.svg",{"readingTime":10076},"18 min read",{"title":5935,"description":10073},"blog/6-typescript-nodejs-production-guide",[4062,10080,127,10081],"Node.js","Production","qfyychSTx6Wbs307TObROpK4RV8jhDc7CO-J4T2fblw",{"id":10084,"title":10085,"abstract":10086,"author":4795,"authorUrl":4796,"body":10087,"date":19283,"dateUpdated":19283,"description":19284,"excerpt":92,"extension":4047,"featured":19285,"headline":19286,"image":92,"meta":19287,"navigation":342,"ogImage":92,"path":5879,"seo":19289,"series":4052,"seriesDescription":5923,"seriesOrder":16,"socialImage":19290,"stem":19293,"tags":19294,"__hash__":19297},"blog/blog/11-typescript-advanced-patterns.md","Advanced TypeScript Patterns for Enterprise Applications","Explore sophisticated TypeScript patterns and techniques that will elevate your code quality and developer experience in large-scale applications.",{"type":95,"value":10088,"toc":19252},[10089,10092,10095,10099,10102,10106,10309,10313,10728,10732,10735,10739,11274,11278,11643,11647,11650,11654,12098,12102,12711,12715,12719,13275,13279,13704,13708,13712,14821,14825,15434,15438,16336,16340,16344,16924,16928,17520,17524,19172,19174,19177,19209,19212,19215,19218,19220,19222,19227,19249],[98,10090,10085],{"id":10091},"advanced-typescript-patterns-for-enterprise-applications",[102,10093,10094],{},"TypeScript has evolved far beyond simple type annotations. In enterprise applications, advanced TypeScript patterns can provide incredible type safety, better developer experience, and more maintainable code. After working with TypeScript in large-scale applications for several years, I'm sharing the most powerful patterns that have transformed how I write and maintain complex codebases.",[98,10096,10098],{"id":10097},"conditional-types-and-type-level-programming","Conditional Types and Type-Level Programming",[102,10100,10101],{},"Conditional types allow you to create types that change based on conditions, enabling powerful type-level logic.",[149,10103,10105],{"id":10104},"basic-conditional-types","Basic Conditional Types",[154,10107,10109],{"className":156,"code":10108,"language":158,"meta":159,"style":159},"// Basic conditional type syntax\ntype IsString = T extends string ? true : false\n\ntype Test1 = IsString // true\ntype Test2 = IsString // false\n\n// More practical example: Extract function return types\ntype ReturnType = T extends (...args: any[]) => infer R ? R : never\n\ntype FunctionReturn = ReturnType<() => string> // string\ntype MethodReturn = ReturnType<(x: number) => boolean> // boolean\n",[161,10110,10111,10116,10147,10151,10171,10191,10195,10200,10250,10254,10277],{"__ignoreMap":159},[164,10112,10113],{"class":166,"line":167},[164,10114,10115],{"class":170},"// Basic conditional type syntax\n",[164,10117,10118,10120,10123,10125,10127,10129,10131,10133,10135,10137,10140,10142,10145],{"class":166,"line":174},[164,10119,1094],{"class":352},[164,10121,10122],{"class":597}," IsString",[164,10124,1122],{"class":255},[164,10126,1125],{"class":597},[164,10128,1160],{"class":255},[164,10130,601],{"class":255},[164,10132,1895],{"class":597},[164,10134,1878],{"class":352},[164,10136,1136],{"class":597},[164,10138,10139],{"class":255}," ?",[164,10141,2865],{"class":597},[164,10143,10144],{"class":255}," :",[164,10146,5508],{"class":597},[164,10148,10149],{"class":166,"line":16},[164,10150,343],{"emptyLinePlaceholder":342},[164,10152,10153,10155,10158,10160,10162,10164,10166,10168],{"class":166,"line":185},[164,10154,1094],{"class":352},[164,10156,10157],{"class":597}," Test1",[164,10159,601],{"class":255},[164,10161,10122],{"class":597},[164,10163,1122],{"class":255},[164,10165,1953],{"class":597},[164,10167,1160],{"class":255},[164,10169,10170],{"class":170}," // true\n",[164,10172,10173,10175,10178,10180,10182,10184,10186,10188],{"class":166,"line":191},[164,10174,1094],{"class":352},[164,10176,10177],{"class":597}," Test2",[164,10179,601],{"class":255},[164,10181,10122],{"class":597},[164,10183,1122],{"class":255},[164,10185,4342],{"class":597},[164,10187,1160],{"class":255},[164,10189,10190],{"class":170}," // false\n",[164,10192,10193],{"class":166,"line":346},[164,10194,343],{"emptyLinePlaceholder":342},[164,10196,10197],{"class":166,"line":381},[164,10198,10199],{"class":170},"// More practical example: Extract function return types\n",[164,10201,10202,10204,10207,10209,10211,10213,10215,10217,10219,10222,10225,10227,10230,10232,10234,10236,10239,10242,10244,10246,10248],{"class":166,"line":424},[164,10203,1094],{"class":352},[164,10205,10206],{"class":597}," ReturnType",[164,10208,1122],{"class":255},[164,10210,1125],{"class":597},[164,10212,1160],{"class":255},[164,10214,601],{"class":255},[164,10216,1895],{"class":597},[164,10218,1878],{"class":352},[164,10220,10221],{"class":255}," (...",[164,10223,10224],{"class":791},"args",[164,10226,388],{"class":255},[164,10228,10229],{"class":597}," any",[164,10231,1325],{"class":259},[164,10233,402],{"class":255},[164,10235,797],{"class":352},[164,10237,10238],{"class":255}," infer",[164,10240,10241],{"class":597}," R",[164,10243,10139],{"class":255},[164,10245,10241],{"class":597},[164,10247,10144],{"class":255},[164,10249,4406],{"class":597},[164,10251,10252],{"class":166,"line":461},[164,10253,343],{"emptyLinePlaceholder":342},[164,10255,10256,10258,10261,10263,10265,10268,10270,10272,10274],{"class":166,"line":490},[164,10257,1094],{"class":352},[164,10259,10260],{"class":597}," FunctionReturn",[164,10262,601],{"class":255},[164,10264,10206],{"class":597},[164,10266,10267],{"class":255},"<()",[164,10269,797],{"class":352},[164,10271,1136],{"class":597},[164,10273,1160],{"class":255},[164,10275,10276],{"class":170}," // string\n",[164,10278,10279,10281,10284,10286,10288,10291,10294,10296,10298,10300,10302,10304,10306],{"class":166,"line":526},[164,10280,1094],{"class":352},[164,10282,10283],{"class":597}," MethodReturn",[164,10285,601],{"class":255},[164,10287,10206],{"class":597},[164,10289,10290],{"class":255},"<(",[164,10292,10293],{"class":791},"x",[164,10295,388],{"class":255},[164,10297,4388],{"class":597},[164,10299,402],{"class":255},[164,10301,797],{"class":352},[164,10303,6994],{"class":597},[164,10305,1160],{"class":255},[164,10307,10308],{"class":170}," // boolean\n",[149,10310,10312],{"id":10311},"advanced-conditional-type-patterns","Advanced Conditional Type Patterns",[154,10314,10316],{"className":156,"code":10315,"language":158,"meta":159,"style":159},"// Recursive conditional types for deep object manipulation\ntype DeepReadonly = {\n readonly [P in keyof T]: T[P] extends object\n ? T[P] extends Function\n ? T[P]\n : DeepReadonly\n : T[P]\n}\n\ninterface User {\n id: number\n profile: {\n name: string\n settings: {\n theme: string\n notifications: boolean\n }\n }\n updateProfile: (data: any) => void\n}\n\ntype ReadonlyUser = DeepReadonly\n// Result: All properties are readonly except functions\n\n// Conditional type for API response handling\ntype ApiResponse = T extends { error: any }\n ? { success: false; error: T[\"error\"] }\n : { success: true; data: T }\n\ntype UserResponse = ApiResponse<{ id: number; name: string }>\n// { success: true; data: { id: number; name: string } }\n\ntype ErrorResponse = ApiResponse<{ error: string }>\n// { success: false; error: string }\n",[161,10317,10318,10323,10340,10377,10395,10407,10425,10438,10442,10446,10454,10462,10471,10480,10489,10498,10507,10511,10515,10537,10541,10545,10562,10567,10571,10576,10604,10638,10660,10664,10693,10698,10702,10723],{"__ignoreMap":159},[164,10319,10320],{"class":166,"line":167},[164,10321,10322],{"class":170},"// Recursive conditional types for deep object manipulation\n",[164,10324,10325,10327,10330,10332,10334,10336,10338],{"class":166,"line":174},[164,10326,1094],{"class":352},[164,10328,10329],{"class":597}," DeepReadonly",[164,10331,1122],{"class":255},[164,10333,1125],{"class":597},[164,10335,1160],{"class":255},[164,10337,601],{"class":255},[164,10339,378],{"class":255},[164,10341,10342,10345,10347,10350,10353,10356,10358,10360,10362,10364,10366,10368,10371,10374],{"class":166,"line":16},[164,10343,10344],{"class":352}," readonly",[164,10346,6257],{"class":259},[164,10348,10349],{"class":597},"P",[164,10351,10352],{"class":255}," in",[164,10354,10355],{"class":255}," keyof",[164,10357,1895],{"class":597},[164,10359,925],{"class":259},[164,10361,388],{"class":255},[164,10363,1895],{"class":597},[164,10365,918],{"class":259},[164,10367,10349],{"class":597},[164,10369,10370],{"class":259},"] ",[164,10372,10373],{"class":352},"extends",[164,10375,10376],{"class":597}," object\n",[164,10378,10379,10382,10384,10386,10388,10390,10392],{"class":166,"line":185},[164,10380,10381],{"class":255}," ?",[164,10383,1895],{"class":597},[164,10385,918],{"class":259},[164,10387,10349],{"class":597},[164,10389,10370],{"class":259},[164,10391,10373],{"class":352},[164,10393,10394],{"class":597}," Function\n",[164,10396,10397,10399,10401,10403,10405],{"class":166,"line":191},[164,10398,9396],{"class":255},[164,10400,1895],{"class":597},[164,10402,918],{"class":259},[164,10404,10349],{"class":597},[164,10406,6542],{"class":259},[164,10408,10409,10411,10413,10415,10417,10419,10421,10423],{"class":166,"line":346},[164,10410,9458],{"class":255},[164,10412,10329],{"class":597},[164,10414,1122],{"class":255},[164,10416,1125],{"class":597},[164,10418,918],{"class":259},[164,10420,10349],{"class":597},[164,10422,925],{"class":259},[164,10424,1540],{"class":255},[164,10426,10427,10430,10432,10434,10436],{"class":166,"line":381},[164,10428,10429],{"class":255}," :",[164,10431,1895],{"class":597},[164,10433,918],{"class":259},[164,10435,10349],{"class":597},[164,10437,6542],{"class":259},[164,10439,10440],{"class":166,"line":424},[164,10441,1281],{"class":255},[164,10443,10444],{"class":166,"line":461},[164,10445,343],{"emptyLinePlaceholder":342},[164,10447,10448,10450,10452],{"class":166,"line":490},[164,10449,3376],{"class":352},[164,10451,598],{"class":597},[164,10453,378],{"class":255},[164,10455,10456,10458,10460],{"class":166,"line":526},[164,10457,385],{"class":384},[164,10459,388],{"class":255},[164,10461,6932],{"class":597},[164,10463,10464,10467,10469],{"class":166,"line":535},[164,10465,10466],{"class":384}," profile",[164,10468,388],{"class":255},[164,10470,378],{"class":255},[164,10472,10473,10476,10478],{"class":166,"line":29},[164,10474,10475],{"class":384}," name",[164,10477,388],{"class":255},[164,10479,3389],{"class":597},[164,10481,10482,10485,10487],{"class":166,"line":545},[164,10483,10484],{"class":384}," settings",[164,10486,388],{"class":255},[164,10488,378],{"class":255},[164,10490,10491,10494,10496],{"class":166,"line":562},[164,10492,10493],{"class":384}," theme",[164,10495,388],{"class":255},[164,10497,3389],{"class":597},[164,10499,10500,10503,10505],{"class":166,"line":578},[164,10501,10502],{"class":384}," notifications",[164,10504,388],{"class":255},[164,10506,6946],{"class":597},[164,10508,10509],{"class":166,"line":583},[164,10510,1743],{"class":255},[164,10512,10513],{"class":166,"line":589},[164,10514,1260],{"class":255},[164,10516,10517,10520,10522,10524,10526,10528,10530,10532,10534],{"class":166,"line":615},[164,10518,10519],{"class":384}," updateProfile",[164,10521,388],{"class":255},[164,10523,788],{"class":255},[164,10525,877],{"class":791},[164,10527,388],{"class":255},[164,10529,10229],{"class":597},[164,10531,402],{"class":255},[164,10533,797],{"class":352},[164,10535,10536],{"class":597}," void\n",[164,10538,10539],{"class":166,"line":978},[164,10540,1281],{"class":255},[164,10542,10543],{"class":166,"line":984},[164,10544,343],{"emptyLinePlaceholder":342},[164,10546,10547,10549,10552,10554,10556,10558,10560],{"class":166,"line":992},[164,10548,1094],{"class":352},[164,10550,10551],{"class":597}," ReadonlyUser",[164,10553,601],{"class":255},[164,10555,10329],{"class":597},[164,10557,1122],{"class":255},[164,10559,1724],{"class":597},[164,10561,1540],{"class":255},[164,10563,10564],{"class":166,"line":999},[164,10565,10566],{"class":170},"// Result: All properties are readonly except functions\n",[164,10568,10569],{"class":166,"line":1004},[164,10570,343],{"emptyLinePlaceholder":342},[164,10572,10573],{"class":166,"line":1010},[164,10574,10575],{"class":170},"// Conditional type for API response handling\n",[164,10577,10578,10580,10582,10584,10586,10588,10590,10592,10594,10596,10598,10600,10602],{"class":166,"line":1466},[164,10579,1094],{"class":352},[164,10581,2031],{"class":597},[164,10583,1122],{"class":255},[164,10585,1125],{"class":597},[164,10587,1160],{"class":255},[164,10589,601],{"class":255},[164,10591,1895],{"class":597},[164,10593,1878],{"class":352},[164,10595,256],{"class":255},[164,10597,2927],{"class":384},[164,10599,388],{"class":255},[164,10601,10229],{"class":597},[164,10603,4151],{"class":255},[164,10605,10606,10608,10610,10613,10615,10618,10620,10622,10624,10626,10628,10630,10632,10634,10636],{"class":166,"line":1495},[164,10607,4395],{"class":255},[164,10609,256],{"class":255},[164,10611,10612],{"class":384}," success",[164,10614,388],{"class":255},[164,10616,10617],{"class":597}," false",[164,10619,4623],{"class":255},[164,10621,2927],{"class":384},[164,10623,388],{"class":255},[164,10625,1895],{"class":597},[164,10627,918],{"class":259},[164,10629,368],{"class":255},[164,10631,7347],{"class":288},[164,10633,368],{"class":255},[164,10635,10370],{"class":259},[164,10637,1281],{"class":255},[164,10639,10640,10642,10644,10646,10648,10650,10652,10654,10656,10658],{"class":166,"line":1505},[164,10641,4403],{"class":255},[164,10643,256],{"class":255},[164,10645,10612],{"class":384},[164,10647,388],{"class":255},[164,10649,2865],{"class":597},[164,10651,4623],{"class":255},[164,10653,807],{"class":384},[164,10655,388],{"class":255},[164,10657,1895],{"class":597},[164,10659,4151],{"class":255},[164,10661,10662],{"class":166,"line":5434},[164,10663,343],{"emptyLinePlaceholder":342},[164,10665,10666,10668,10670,10672,10674,10676,10678,10680,10682,10684,10686,10688,10690],{"class":166,"line":5454},[164,10667,1094],{"class":352},[164,10669,8200],{"class":597},[164,10671,601],{"class":255},[164,10673,2031],{"class":597},[164,10675,1672],{"class":255},[164,10677,2713],{"class":384},[164,10679,388],{"class":255},[164,10681,4388],{"class":597},[164,10683,4623],{"class":255},[164,10685,4626],{"class":384},[164,10687,388],{"class":255},[164,10689,1136],{"class":597},[164,10691,10692],{"class":255}," }>\n",[164,10694,10695],{"class":166,"line":5468},[164,10696,10697],{"class":170},"// { success: true; data: { id: number; name: string } }\n",[164,10699,10700],{"class":166,"line":5482},[164,10701,343],{"emptyLinePlaceholder":342},[164,10703,10704,10706,10709,10711,10713,10715,10717,10719,10721],{"class":166,"line":5496},[164,10705,1094],{"class":352},[164,10707,10708],{"class":597}," ErrorResponse",[164,10710,601],{"class":255},[164,10712,2031],{"class":597},[164,10714,1672],{"class":255},[164,10716,2927],{"class":384},[164,10718,388],{"class":255},[164,10720,1136],{"class":597},[164,10722,10692],{"class":255},[164,10724,10725],{"class":166,"line":5511},[164,10726,10727],{"class":170},"// { success: false; error: string }\n",[98,10729,10731],{"id":10730},"template-literal-types","Template Literal Types",[102,10733,10734],{},"Template literal types provide powerful string manipulation at the type level.",[149,10736,10738],{"id":10737},"dynamic-api-endpoint-types","Dynamic API Endpoint Types",[154,10740,10742],{"className":156,"code":10741,"language":158,"meta":159,"style":159},"// Generate API endpoint types dynamically\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\"\ntype ApiVersion = \"v1\" | \"v2\"\ntype Resource = \"users\" | \"posts\" | \"comments\"\n\ntype ApiEndpoint = `/api/${V}/${R}`\n\ntype UserEndpoints = ApiEndpoint<\"v1\", \"users\"> // \"/api/v1/users\"\ntype PostEndpoints = ApiEndpoint<\"v2\", \"posts\"> // \"/api/v2/posts\"\n\n// Advanced template literal patterns\ntype EventName = `on${Capitalize}`\ntype EventHandler = `handle${Capitalize}`\n\ntype ClickEvent = EventName<\"click\"> // \"onClick\"\ntype ClickHandler = EventHandler<\"click\"> // \"handleClick\"\n\n// CSS-in-JS type safety\ntype CSSProperty = \"margin\" | \"padding\" | \"border\"\ntype CSSDirection = \"top\" | \"right\" | \"bottom\" | \"left\"\ntype CSSPropertyWithDirection<\n P extends CSSProperty,\n D extends CSSDirection,\n> = `${P}-${D}`\n\ntype MarginProperties = CSSPropertyWithDirection<\"margin\", CSSDirection>\n// \"margin-top\" | \"margin-right\" | \"margin-bottom\" | \"margin-left\"\n",[161,10743,10744,10749,10791,10814,10847,10851,10898,10902,10934,10966,10970,10975,11011,11047,11051,11076,11100,11104,11109,11143,11185,11195,11206,11217,11240,11244,11269],{"__ignoreMap":159},[164,10745,10746],{"class":166,"line":167},[164,10747,10748],{"class":170},"// Generate API endpoint types dynamically\n",[164,10750,10751,10753,10756,10758,10760,10763,10765,10767,10769,10771,10773,10775,10777,10780,10782,10784,10786,10789],{"class":166,"line":174},[164,10752,1094],{"class":352},[164,10754,10755],{"class":597}," HttpMethod",[164,10757,601],{"class":255},[164,10759,285],{"class":255},[164,10761,10762],{"class":288},"GET",[164,10764,368],{"class":255},[164,10766,4561],{"class":255},[164,10768,285],{"class":255},[164,10770,1439],{"class":288},[164,10772,368],{"class":255},[164,10774,4561],{"class":255},[164,10776,285],{"class":255},[164,10778,10779],{"class":288},"PUT",[164,10781,368],{"class":255},[164,10783,4561],{"class":255},[164,10785,285],{"class":255},[164,10787,10788],{"class":288},"DELETE",[164,10790,292],{"class":255},[164,10792,10793,10795,10798,10800,10802,10804,10806,10808,10810,10812],{"class":166,"line":16},[164,10794,1094],{"class":352},[164,10796,10797],{"class":597}," ApiVersion",[164,10799,601],{"class":255},[164,10801,285],{"class":255},[164,10803,971],{"class":288},[164,10805,368],{"class":255},[164,10807,4561],{"class":255},[164,10809,285],{"class":255},[164,10811,4566],{"class":288},[164,10813,292],{"class":255},[164,10815,10816,10818,10821,10823,10825,10827,10829,10831,10833,10836,10838,10840,10842,10845],{"class":166,"line":185},[164,10817,1094],{"class":352},[164,10819,10820],{"class":597}," Resource",[164,10822,601],{"class":255},[164,10824,285],{"class":255},[164,10826,371],{"class":288},[164,10828,368],{"class":255},[164,10830,4561],{"class":255},[164,10832,285],{"class":255},[164,10834,10835],{"class":288},"posts",[164,10837,368],{"class":255},[164,10839,4561],{"class":255},[164,10841,285],{"class":255},[164,10843,10844],{"class":288},"comments",[164,10846,292],{"class":255},[164,10848,10849],{"class":166,"line":191},[164,10850,343],{"emptyLinePlaceholder":342},[164,10852,10853,10855,10858,10860,10863,10865,10867,10869,10871,10873,10875,10877,10879,10881,10883,10885,10887,10889,10891,10893,10896],{"class":166,"line":346},[164,10854,1094],{"class":352},[164,10856,10857],{"class":597}," ApiEndpoint",[164,10859,1122],{"class":255},[164,10861,10862],{"class":597},"V",[164,10864,1878],{"class":352},[164,10866,10797],{"class":597},[164,10868,263],{"class":255},[164,10870,10241],{"class":597},[164,10872,1878],{"class":352},[164,10874,10820],{"class":597},[164,10876,1160],{"class":255},[164,10878,601],{"class":255},[164,10880,4326],{"class":255},[164,10882,1184],{"class":288},[164,10884,1187],{"class":255},[164,10886,10862],{"class":597},[164,10888,529],{"class":255},[164,10890,4796],{"class":288},[164,10892,1187],{"class":255},[164,10894,10895],{"class":597},"R",[164,10897,4345],{"class":255},[164,10899,10900],{"class":166,"line":381},[164,10901,343],{"emptyLinePlaceholder":342},[164,10903,10904,10906,10909,10911,10913,10915,10917,10919,10921,10923,10925,10927,10929,10931],{"class":166,"line":424},[164,10905,1094],{"class":352},[164,10907,10908],{"class":597}," UserEndpoints",[164,10910,601],{"class":255},[164,10912,10857],{"class":597},[164,10914,1122],{"class":255},[164,10916,368],{"class":255},[164,10918,971],{"class":288},[164,10920,368],{"class":255},[164,10922,263],{"class":255},[164,10924,285],{"class":255},[164,10926,371],{"class":288},[164,10928,368],{"class":255},[164,10930,1160],{"class":255},[164,10932,10933],{"class":170}," // \"/api/v1/users\"\n",[164,10935,10936,10938,10941,10943,10945,10947,10949,10951,10953,10955,10957,10959,10961,10963],{"class":166,"line":461},[164,10937,1094],{"class":352},[164,10939,10940],{"class":597}," PostEndpoints",[164,10942,601],{"class":255},[164,10944,10857],{"class":597},[164,10946,1122],{"class":255},[164,10948,368],{"class":255},[164,10950,4566],{"class":288},[164,10952,368],{"class":255},[164,10954,263],{"class":255},[164,10956,285],{"class":255},[164,10958,10835],{"class":288},[164,10960,368],{"class":255},[164,10962,1160],{"class":255},[164,10964,10965],{"class":170}," // \"/api/v2/posts\"\n",[164,10967,10968],{"class":166,"line":490},[164,10969,343],{"emptyLinePlaceholder":342},[164,10971,10972],{"class":166,"line":526},[164,10973,10974],{"class":170},"// Advanced template literal patterns\n",[164,10976,10977,10979,10982,10984,10986,10988,10990,10992,10994,10996,10998,11000,11003,11005,11007,11009],{"class":166,"line":535},[164,10978,1094],{"class":352},[164,10980,10981],{"class":597}," EventName",[164,10983,1122],{"class":255},[164,10985,1125],{"class":597},[164,10987,1878],{"class":352},[164,10989,1136],{"class":597},[164,10991,1160],{"class":255},[164,10993,601],{"class":255},[164,10995,4326],{"class":255},[164,10997,5192],{"class":288},[164,10999,1187],{"class":255},[164,11001,11002],{"class":597},"Capitalize",[164,11004,1122],{"class":255},[164,11006,1125],{"class":597},[164,11008,1160],{"class":255},[164,11010,4345],{"class":255},[164,11012,11013,11015,11018,11020,11022,11024,11026,11028,11030,11032,11035,11037,11039,11041,11043,11045],{"class":166,"line":29},[164,11014,1094],{"class":352},[164,11016,11017],{"class":597}," EventHandler",[164,11019,1122],{"class":255},[164,11021,1125],{"class":597},[164,11023,1878],{"class":352},[164,11025,1136],{"class":597},[164,11027,1160],{"class":255},[164,11029,601],{"class":255},[164,11031,4326],{"class":255},[164,11033,11034],{"class":288},"handle",[164,11036,1187],{"class":255},[164,11038,11002],{"class":597},[164,11040,1122],{"class":255},[164,11042,1125],{"class":597},[164,11044,1160],{"class":255},[164,11046,4345],{"class":255},[164,11048,11049],{"class":166,"line":545},[164,11050,343],{"emptyLinePlaceholder":342},[164,11052,11053,11055,11058,11060,11062,11064,11066,11069,11071,11073],{"class":166,"line":562},[164,11054,1094],{"class":352},[164,11056,11057],{"class":597}," ClickEvent",[164,11059,601],{"class":255},[164,11061,10981],{"class":597},[164,11063,1122],{"class":255},[164,11065,368],{"class":255},[164,11067,11068],{"class":288},"click",[164,11070,368],{"class":255},[164,11072,1160],{"class":255},[164,11074,11075],{"class":170}," // \"onClick\"\n",[164,11077,11078,11080,11083,11085,11087,11089,11091,11093,11095,11097],{"class":166,"line":578},[164,11079,1094],{"class":352},[164,11081,11082],{"class":597}," ClickHandler",[164,11084,601],{"class":255},[164,11086,11017],{"class":597},[164,11088,1122],{"class":255},[164,11090,368],{"class":255},[164,11092,11068],{"class":288},[164,11094,368],{"class":255},[164,11096,1160],{"class":255},[164,11098,11099],{"class":170}," // \"handleClick\"\n",[164,11101,11102],{"class":166,"line":583},[164,11103,343],{"emptyLinePlaceholder":342},[164,11105,11106],{"class":166,"line":589},[164,11107,11108],{"class":170},"// CSS-in-JS type safety\n",[164,11110,11111,11113,11116,11118,11120,11123,11125,11127,11129,11132,11134,11136,11138,11141],{"class":166,"line":615},[164,11112,1094],{"class":352},[164,11114,11115],{"class":597}," CSSProperty",[164,11117,601],{"class":255},[164,11119,285],{"class":255},[164,11121,11122],{"class":288},"margin",[164,11124,368],{"class":255},[164,11126,4561],{"class":255},[164,11128,285],{"class":255},[164,11130,11131],{"class":288},"padding",[164,11133,368],{"class":255},[164,11135,4561],{"class":255},[164,11137,285],{"class":255},[164,11139,11140],{"class":288},"border",[164,11142,292],{"class":255},[164,11144,11145,11147,11150,11152,11154,11157,11159,11161,11163,11165,11167,11169,11171,11174,11176,11178,11180,11183],{"class":166,"line":978},[164,11146,1094],{"class":352},[164,11148,11149],{"class":597}," CSSDirection",[164,11151,601],{"class":255},[164,11153,285],{"class":255},[164,11155,11156],{"class":288},"top",[164,11158,368],{"class":255},[164,11160,4561],{"class":255},[164,11162,285],{"class":255},[164,11164,5379],{"class":288},[164,11166,368],{"class":255},[164,11168,4561],{"class":255},[164,11170,285],{"class":255},[164,11172,11173],{"class":288},"bottom",[164,11175,368],{"class":255},[164,11177,4561],{"class":255},[164,11179,285],{"class":255},[164,11181,11182],{"class":288},"left",[164,11184,292],{"class":255},[164,11186,11187,11189,11192],{"class":166,"line":984},[164,11188,1094],{"class":352},[164,11190,11191],{"class":597}," CSSPropertyWithDirection",[164,11193,11194],{"class":255},"<\n",[164,11196,11197,11200,11202,11204],{"class":166,"line":992},[164,11198,11199],{"class":597}," P",[164,11201,1878],{"class":352},[164,11203,11115],{"class":597},[164,11205,421],{"class":255},[164,11207,11208,11211,11213,11215],{"class":166,"line":999},[164,11209,11210],{"class":597}," D",[164,11212,1878],{"class":352},[164,11214,11149],{"class":597},[164,11216,421],{"class":255},[164,11218,11219,11221,11223,11226,11228,11230,11233,11235,11238],{"class":166,"line":1004},[164,11220,1160],{"class":255},[164,11222,601],{"class":255},[164,11224,11225],{"class":255}," `${",[164,11227,10349],{"class":597},[164,11229,529],{"class":255},[164,11231,11232],{"class":288},"-",[164,11234,1187],{"class":255},[164,11236,11237],{"class":597},"D",[164,11239,4345],{"class":255},[164,11241,11242],{"class":166,"line":1010},[164,11243,343],{"emptyLinePlaceholder":342},[164,11245,11246,11248,11251,11253,11255,11257,11259,11261,11263,11265,11267],{"class":166,"line":1466},[164,11247,1094],{"class":352},[164,11249,11250],{"class":597}," MarginProperties",[164,11252,601],{"class":255},[164,11254,11191],{"class":597},[164,11256,1122],{"class":255},[164,11258,368],{"class":255},[164,11260,11122],{"class":288},[164,11262,368],{"class":255},[164,11264,263],{"class":255},[164,11266,11149],{"class":597},[164,11268,1540],{"class":255},[164,11270,11271],{"class":166,"line":1495},[164,11272,11273],{"class":170},"// \"margin-top\" | \"margin-right\" | \"margin-bottom\" | \"margin-left\"\n",[149,11275,11277],{"id":11276},"form-validation-with-template-literals","Form Validation with Template Literals",[154,11279,11281],{"className":156,"code":11280,"language":158,"meta":159,"style":159},"// Type-safe form field validation\ntype ValidationRule = \"required\" | \"email\" | \"minLength\" | \"maxLength\"\ntype FieldName = \"username\" | \"email\" | \"password\"\n\ntype ValidationKey = `${F}_${R}`\n\ntype ValidationErrors = {\n [K in ValidationKey]?: string\n}\n\n// Usage\nconst errors: ValidationErrors = {\n username_required: \"Username is required\",\n email_email: \"Invalid email format\",\n password_minLength: \"Password must be at least 8 characters\",\n}\n\n// Type-safe validation function\nfunction validateField(\n field: F,\n rule: R,\n value: string,\n): ValidationKey | null {\n // Validation logic here\n return null // or return the validation key if validation fails\n}\n",[161,11282,11283,11288,11330,11363,11367,11410,11414,11425,11454,11458,11462,11467,11482,11498,11514,11530,11534,11538,11543,11569,11581,11592,11603,11625,11630,11639],{"__ignoreMap":159},[164,11284,11285],{"class":166,"line":167},[164,11286,11287],{"class":170},"// Type-safe form field validation\n",[164,11289,11290,11292,11295,11297,11299,11302,11304,11306,11308,11310,11312,11314,11316,11319,11321,11323,11325,11328],{"class":166,"line":174},[164,11291,1094],{"class":352},[164,11293,11294],{"class":597}," ValidationRule",[164,11296,601],{"class":255},[164,11298,285],{"class":255},[164,11300,11301],{"class":288},"required",[164,11303,368],{"class":255},[164,11305,4561],{"class":255},[164,11307,285],{"class":255},[164,11309,438],{"class":288},[164,11311,368],{"class":255},[164,11313,4561],{"class":255},[164,11315,285],{"class":255},[164,11317,11318],{"class":288},"minLength",[164,11320,368],{"class":255},[164,11322,4561],{"class":255},[164,11324,285],{"class":255},[164,11326,11327],{"class":288},"maxLength",[164,11329,292],{"class":255},[164,11331,11332,11334,11337,11339,11341,11344,11346,11348,11350,11352,11354,11356,11358,11361],{"class":166,"line":16},[164,11333,1094],{"class":352},[164,11335,11336],{"class":597}," FieldName",[164,11338,601],{"class":255},[164,11340,285],{"class":255},[164,11342,11343],{"class":288},"username",[164,11345,368],{"class":255},[164,11347,4561],{"class":255},[164,11349,285],{"class":255},[164,11351,438],{"class":288},[164,11353,368],{"class":255},[164,11355,4561],{"class":255},[164,11357,285],{"class":255},[164,11359,11360],{"class":288},"password",[164,11362,292],{"class":255},[164,11364,11365],{"class":166,"line":185},[164,11366,343],{"emptyLinePlaceholder":342},[164,11368,11369,11371,11374,11376,11379,11381,11383,11385,11387,11389,11391,11393,11395,11397,11399,11401,11404,11406,11408],{"class":166,"line":191},[164,11370,1094],{"class":352},[164,11372,11373],{"class":597}," ValidationKey",[164,11375,1122],{"class":255},[164,11377,11378],{"class":597},"F",[164,11380,1878],{"class":352},[164,11382,11336],{"class":597},[164,11384,263],{"class":255},[164,11386,10241],{"class":597},[164,11388,1878],{"class":352},[164,11390,11294],{"class":597},[164,11392,1160],{"class":255},[164,11394,601],{"class":255},[164,11396,11225],{"class":255},[164,11398,11378],{"class":597},[164,11400,529],{"class":255},[164,11402,11403],{"class":288},"_",[164,11405,1187],{"class":255},[164,11407,10895],{"class":597},[164,11409,4345],{"class":255},[164,11411,11412],{"class":166,"line":346},[164,11413,343],{"emptyLinePlaceholder":342},[164,11415,11416,11418,11421,11423],{"class":166,"line":381},[164,11417,1094],{"class":352},[164,11419,11420],{"class":597}," ValidationErrors",[164,11422,601],{"class":255},[164,11424,378],{"class":255},[164,11426,11427,11430,11433,11435,11437,11439,11442,11444,11446,11448,11450,11452],{"class":166,"line":424},[164,11428,11429],{"class":259}," [",[164,11431,11432],{"class":597},"K",[164,11434,10352],{"class":255},[164,11436,11373],{"class":597},[164,11438,1122],{"class":255},[164,11440,11441],{"class":597},"FieldName",[164,11443,263],{"class":255},[164,11445,11294],{"class":597},[164,11447,1160],{"class":255},[164,11449,925],{"class":259},[164,11451,1144],{"class":255},[164,11453,3389],{"class":597},[164,11455,11456],{"class":166,"line":461},[164,11457,1281],{"class":255},[164,11459,11460],{"class":166,"line":490},[164,11461,343],{"emptyLinePlaceholder":342},[164,11463,11464],{"class":166,"line":526},[164,11465,11466],{"class":170},"// Usage\n",[164,11468,11469,11471,11474,11476,11478,11480],{"class":166,"line":535},[164,11470,721],{"class":352},[164,11472,11473],{"class":259}," errors",[164,11475,388],{"class":255},[164,11477,11420],{"class":597},[164,11479,601],{"class":255},[164,11481,378],{"class":255},[164,11483,11484,11487,11489,11491,11494,11496],{"class":166,"line":29},[164,11485,11486],{"class":384}," username_required",[164,11488,388],{"class":255},[164,11490,285],{"class":255},[164,11492,11493],{"class":288},"Username is required",[164,11495,368],{"class":255},[164,11497,421],{"class":255},[164,11499,11500,11503,11505,11507,11510,11512],{"class":166,"line":545},[164,11501,11502],{"class":384}," email_email",[164,11504,388],{"class":255},[164,11506,285],{"class":255},[164,11508,11509],{"class":288},"Invalid email format",[164,11511,368],{"class":255},[164,11513,421],{"class":255},[164,11515,11516,11519,11521,11523,11526,11528],{"class":166,"line":562},[164,11517,11518],{"class":384}," password_minLength",[164,11520,388],{"class":255},[164,11522,285],{"class":255},[164,11524,11525],{"class":288},"Password must be at least 8 characters",[164,11527,368],{"class":255},[164,11529,421],{"class":255},[164,11531,11532],{"class":166,"line":578},[164,11533,1281],{"class":255},[164,11535,11536],{"class":166,"line":583},[164,11537,343],{"emptyLinePlaceholder":342},[164,11539,11540],{"class":166,"line":589},[164,11541,11542],{"class":170},"// Type-safe validation function\n",[164,11544,11545,11547,11550,11552,11554,11556,11558,11560,11562,11564,11566],{"class":166,"line":615},[164,11546,3410],{"class":352},[164,11548,11549],{"class":362}," validateField",[164,11551,1122],{"class":255},[164,11553,11378],{"class":597},[164,11555,1878],{"class":352},[164,11557,11336],{"class":597},[164,11559,263],{"class":255},[164,11561,10241],{"class":597},[164,11563,1878],{"class":352},[164,11565,11294],{"class":597},[164,11567,11568],{"class":255},">(\n",[164,11570,11571,11574,11576,11579],{"class":166,"line":978},[164,11572,11573],{"class":791}," field",[164,11575,388],{"class":255},[164,11577,11578],{"class":597}," F",[164,11580,421],{"class":255},[164,11582,11583,11586,11588,11590],{"class":166,"line":984},[164,11584,11585],{"class":791}," rule",[164,11587,388],{"class":255},[164,11589,10241],{"class":597},[164,11591,421],{"class":255},[164,11593,11594,11597,11599,11601],{"class":166,"line":992},[164,11595,11596],{"class":791}," value",[164,11598,388],{"class":255},[164,11600,1136],{"class":597},[164,11602,421],{"class":255},[164,11604,11605,11607,11609,11611,11613,11615,11617,11619,11621,11623],{"class":166,"line":999},[164,11606,1150],{"class":255},[164,11608,11373],{"class":597},[164,11610,1122],{"class":255},[164,11612,11378],{"class":597},[164,11614,263],{"class":255},[164,11616,10241],{"class":597},[164,11618,1160],{"class":255},[164,11620,4561],{"class":255},[164,11622,7842],{"class":597},[164,11624,378],{"class":255},[164,11626,11627],{"class":166,"line":1004},[164,11628,11629],{"class":170}," // Validation logic here\n",[164,11631,11632,11634,11636],{"class":166,"line":1010},[164,11633,895],{"class":251},[164,11635,7842],{"class":255},[164,11637,11638],{"class":170}," // or return the validation key if validation fails\n",[164,11640,11641],{"class":166,"line":1466},[164,11642,1281],{"class":255},[98,11644,11646],{"id":11645},"mapped-types-and-key-remapping","Mapped Types and Key Remapping",[102,11648,11649],{},"Mapped types allow you to transform existing types by iterating over their properties.",[149,11651,11653],{"id":11652},"advanced-mapped-type-patterns","Advanced Mapped Type Patterns",[154,11655,11657],{"className":156,"code":11656,"language":158,"meta":159,"style":159},"// Optional properties with specific keys\ntype OptionalKeys = Omit & Partial>\n\ninterface User {\n id: number\n name: string\n email: string\n avatar?: string\n}\n\ntype UserUpdate = OptionalKeys\n// { id: number; avatar?: string; name?: string; email?: string; }\n\n// Transform object properties\ntype Getters = {\n [K in keyof T as `get${Capitalize}`]: () => T[K]\n}\n\ntype Setters = {\n [K in keyof T as `set${Capitalize}`]: (value: T[K]) => void\n}\n\ntype UserGetters = Getters\n// { getId: () => number; getName: () => string; getEmail: () => string; getAvatar: () => string | undefined; }\n\ntype UserSetters = Setters\n// { setId: (value: number) => void; setName: (value: string) => void; ... }\n\n// Combine getters and setters\ntype Model = T & Getters & Setters\n\ntype UserModel = Model\n",[161,11658,11659,11664,11724,11728,11736,11744,11752,11760,11769,11773,11777,11810,11815,11819,11824,11841,11891,11895,11899,11916,11975,11979,11983,12000,12005,12009,12026,12031,12035,12040,12077,12081],{"__ignoreMap":159},[164,11660,11661],{"class":166,"line":167},[164,11662,11663],{"class":170},"// Optional properties with specific keys\n",[164,11665,11666,11668,11671,11673,11675,11677,11680,11682,11684,11686,11688,11690,11693,11695,11697,11699,11701,11703,11705,11708,11710,11713,11715,11717,11719,11721],{"class":166,"line":174},[164,11667,1094],{"class":352},[164,11669,11670],{"class":597}," OptionalKeys",[164,11672,1122],{"class":255},[164,11674,1125],{"class":597},[164,11676,263],{"class":255},[164,11678,11679],{"class":597}," K",[164,11681,1878],{"class":352},[164,11683,10355],{"class":255},[164,11685,1895],{"class":597},[164,11687,1160],{"class":255},[164,11689,601],{"class":255},[164,11691,11692],{"class":597}," Omit",[164,11694,1122],{"class":255},[164,11696,1125],{"class":597},[164,11698,263],{"class":255},[164,11700,11679],{"class":597},[164,11702,1160],{"class":255},[164,11704,3354],{"class":255},[164,11706,11707],{"class":597}," Partial",[164,11709,1122],{"class":255},[164,11711,11712],{"class":597},"Pick",[164,11714,1122],{"class":255},[164,11716,1125],{"class":597},[164,11718,263],{"class":255},[164,11720,11679],{"class":597},[164,11722,11723],{"class":255},">>\n",[164,11725,11726],{"class":166,"line":16},[164,11727,343],{"emptyLinePlaceholder":342},[164,11729,11730,11732,11734],{"class":166,"line":185},[164,11731,3376],{"class":352},[164,11733,598],{"class":597},[164,11735,378],{"class":255},[164,11737,11738,11740,11742],{"class":166,"line":191},[164,11739,385],{"class":384},[164,11741,388],{"class":255},[164,11743,6932],{"class":597},[164,11745,11746,11748,11750],{"class":166,"line":346},[164,11747,464],{"class":384},[164,11749,388],{"class":255},[164,11751,3389],{"class":597},[164,11753,11754,11756,11758],{"class":166,"line":381},[164,11755,427],{"class":384},[164,11757,388],{"class":255},[164,11759,3389],{"class":597},[164,11761,11762,11765,11767],{"class":166,"line":424},[164,11763,11764],{"class":384}," avatar",[164,11766,1144],{"class":255},[164,11768,3389],{"class":597},[164,11770,11771],{"class":166,"line":461},[164,11772,1281],{"class":255},[164,11774,11775],{"class":166,"line":490},[164,11776,343],{"emptyLinePlaceholder":342},[164,11778,11779,11781,11784,11786,11788,11790,11792,11794,11796,11798,11800,11802,11804,11806,11808],{"class":166,"line":526},[164,11780,1094],{"class":352},[164,11782,11783],{"class":597}," UserUpdate",[164,11785,601],{"class":255},[164,11787,11670],{"class":597},[164,11789,1122],{"class":255},[164,11791,1724],{"class":597},[164,11793,263],{"class":255},[164,11795,285],{"class":255},[164,11797,475],{"class":288},[164,11799,368],{"class":255},[164,11801,4561],{"class":255},[164,11803,285],{"class":255},[164,11805,438],{"class":288},[164,11807,368],{"class":255},[164,11809,1540],{"class":255},[164,11811,11812],{"class":166,"line":535},[164,11813,11814],{"class":170},"// { id: number; avatar?: string; name?: string; email?: string; }\n",[164,11816,11817],{"class":166,"line":29},[164,11818,343],{"emptyLinePlaceholder":342},[164,11820,11821],{"class":166,"line":545},[164,11822,11823],{"class":170},"// Transform object properties\n",[164,11825,11826,11828,11831,11833,11835,11837,11839],{"class":166,"line":562},[164,11827,1094],{"class":352},[164,11829,11830],{"class":597}," Getters",[164,11832,1122],{"class":255},[164,11834,1125],{"class":597},[164,11836,1160],{"class":255},[164,11838,601],{"class":255},[164,11840,378],{"class":255},[164,11842,11843,11845,11847,11849,11851,11853,11855,11857,11859,11861,11863,11865,11867,11869,11871,11873,11875,11877,11879,11881,11883,11885,11887,11889],{"class":166,"line":578},[164,11844,11429],{"class":259},[164,11846,11432],{"class":597},[164,11848,10352],{"class":255},[164,11850,10355],{"class":255},[164,11852,1895],{"class":597},[164,11854,3439],{"class":251},[164,11856,4326],{"class":255},[164,11858,2668],{"class":288},[164,11860,1187],{"class":255},[164,11862,11002],{"class":597},[164,11864,1122],{"class":255},[164,11866,1953],{"class":597},[164,11868,3354],{"class":255},[164,11870,11679],{"class":597},[164,11872,1160],{"class":255},[164,11874,1192],{"class":255},[164,11876,925],{"class":259},[164,11878,388],{"class":255},[164,11880,1313],{"class":255},[164,11882,797],{"class":352},[164,11884,1895],{"class":597},[164,11886,918],{"class":259},[164,11888,11432],{"class":597},[164,11890,6542],{"class":259},[164,11892,11893],{"class":166,"line":583},[164,11894,1281],{"class":255},[164,11896,11897],{"class":166,"line":589},[164,11898,343],{"emptyLinePlaceholder":342},[164,11900,11901,11903,11906,11908,11910,11912,11914],{"class":166,"line":615},[164,11902,1094],{"class":352},[164,11904,11905],{"class":597}," Setters",[164,11907,1122],{"class":255},[164,11909,1125],{"class":597},[164,11911,1160],{"class":255},[164,11913,601],{"class":255},[164,11915,378],{"class":255},[164,11917,11918,11920,11922,11924,11926,11928,11930,11932,11935,11937,11939,11941,11943,11945,11947,11949,11951,11953,11955,11957,11959,11961,11963,11965,11967,11969,11971,11973],{"class":166,"line":978},[164,11919,11429],{"class":259},[164,11921,11432],{"class":597},[164,11923,10352],{"class":255},[164,11925,10355],{"class":255},[164,11927,1895],{"class":597},[164,11929,3439],{"class":251},[164,11931,4326],{"class":255},[164,11933,11934],{"class":288},"set",[164,11936,1187],{"class":255},[164,11938,11002],{"class":597},[164,11940,1122],{"class":255},[164,11942,1953],{"class":597},[164,11944,3354],{"class":255},[164,11946,11679],{"class":597},[164,11948,1160],{"class":255},[164,11950,1192],{"class":255},[164,11952,925],{"class":259},[164,11954,388],{"class":255},[164,11956,788],{"class":255},[164,11958,4121],{"class":791},[164,11960,388],{"class":255},[164,11962,1895],{"class":597},[164,11964,918],{"class":259},[164,11966,11432],{"class":597},[164,11968,925],{"class":259},[164,11970,402],{"class":255},[164,11972,797],{"class":352},[164,11974,10536],{"class":597},[164,11976,11977],{"class":166,"line":984},[164,11978,1281],{"class":255},[164,11980,11981],{"class":166,"line":992},[164,11982,343],{"emptyLinePlaceholder":342},[164,11984,11985,11987,11990,11992,11994,11996,11998],{"class":166,"line":999},[164,11986,1094],{"class":352},[164,11988,11989],{"class":597}," UserGetters",[164,11991,601],{"class":255},[164,11993,11830],{"class":597},[164,11995,1122],{"class":255},[164,11997,1724],{"class":597},[164,11999,1540],{"class":255},[164,12001,12002],{"class":166,"line":1004},[164,12003,12004],{"class":170},"// { getId: () => number; getName: () => string; getEmail: () => string; getAvatar: () => string | undefined; }\n",[164,12006,12007],{"class":166,"line":1010},[164,12008,343],{"emptyLinePlaceholder":342},[164,12010,12011,12013,12016,12018,12020,12022,12024],{"class":166,"line":1466},[164,12012,1094],{"class":352},[164,12014,12015],{"class":597}," UserSetters",[164,12017,601],{"class":255},[164,12019,11905],{"class":597},[164,12021,1122],{"class":255},[164,12023,1724],{"class":597},[164,12025,1540],{"class":255},[164,12027,12028],{"class":166,"line":1495},[164,12029,12030],{"class":170},"// { setId: (value: number) => void; setName: (value: string) => void; ... }\n",[164,12032,12033],{"class":166,"line":1505},[164,12034,343],{"emptyLinePlaceholder":342},[164,12036,12037],{"class":166,"line":5434},[164,12038,12039],{"class":170},"// Combine getters and setters\n",[164,12041,12042,12044,12047,12049,12051,12053,12055,12057,12059,12061,12063,12065,12067,12069,12071,12073,12075],{"class":166,"line":5454},[164,12043,1094],{"class":352},[164,12045,12046],{"class":597}," Model",[164,12048,1122],{"class":255},[164,12050,1125],{"class":597},[164,12052,1160],{"class":255},[164,12054,601],{"class":255},[164,12056,1895],{"class":597},[164,12058,3354],{"class":255},[164,12060,11830],{"class":597},[164,12062,1122],{"class":255},[164,12064,1125],{"class":597},[164,12066,1160],{"class":255},[164,12068,3354],{"class":255},[164,12070,11905],{"class":597},[164,12072,1122],{"class":255},[164,12074,1125],{"class":597},[164,12076,1540],{"class":255},[164,12078,12079],{"class":166,"line":5468},[164,12080,343],{"emptyLinePlaceholder":342},[164,12082,12083,12085,12088,12090,12092,12094,12096],{"class":166,"line":5482},[164,12084,1094],{"class":352},[164,12086,12087],{"class":597}," UserModel",[164,12089,601],{"class":255},[164,12091,12046],{"class":597},[164,12093,1122],{"class":255},[164,12095,1724],{"class":597},[164,12097,1540],{"class":255},[149,12099,12101],{"id":12100},"database-query-builder-types","Database Query Builder Types",[154,12103,12105],{"className":156,"code":12104,"language":158,"meta":159,"style":159},"// Type-safe query builder\ntype QueryOperator = \"eq\" | \"ne\" | \"gt\" | \"lt\" | \"in\" | \"like\"\n\ntype WhereClause = {\n [K in keyof T]?: {\n [O in QueryOperator]?: T[K] extends (infer U)[] ? U : T[K]\n }\n}\n\ntype OrderByClause = {\n [K in keyof T]?: \"asc\" | \"desc\"\n}\n\ninterface QueryBuilder {\n where(clause: WhereClause): QueryBuilder\n orderBy(clause: OrderByClause): QueryBuilder\n limit(count: number): QueryBuilder\n execute(): Promise\n}\n\n// Usage\ninterface Product {\n id: number\n name: string\n price: number\n category: string\n tags: string[]\n}\n\ndeclare function createQuery(): QueryBuilder\n\nconst products = await createQuery()\n .where({\n price: { gt: 100, lt: 500 },\n category: { eq: \"electronics\" },\n tags: { in: \"smartphone\" },\n })\n .orderBy({ price: \"asc\" })\n .limit(10)\n .execute()\n",[161,12106,12107,12112,12173,12177,12194,12212,12263,12267,12271,12275,12292,12324,12328,12332,12347,12376,12403,12427,12445,12449,12453,12457,12465,12473,12481,12489,12498,12510,12514,12518,12543,12547,12568,12580,12608,12630,12652,12659,12686,12701],{"__ignoreMap":159},[164,12108,12109],{"class":166,"line":167},[164,12110,12111],{"class":170},"// Type-safe query builder\n",[164,12113,12114,12116,12119,12121,12123,12126,12128,12130,12132,12135,12137,12139,12141,12144,12146,12148,12150,12153,12155,12157,12159,12162,12164,12166,12168,12171],{"class":166,"line":174},[164,12115,1094],{"class":352},[164,12117,12118],{"class":597}," QueryOperator",[164,12120,601],{"class":255},[164,12122,285],{"class":255},[164,12124,12125],{"class":288},"eq",[164,12127,368],{"class":255},[164,12129,4561],{"class":255},[164,12131,285],{"class":255},[164,12133,12134],{"class":288},"ne",[164,12136,368],{"class":255},[164,12138,4561],{"class":255},[164,12140,285],{"class":255},[164,12142,12143],{"class":288},"gt",[164,12145,368],{"class":255},[164,12147,4561],{"class":255},[164,12149,285],{"class":255},[164,12151,12152],{"class":288},"lt",[164,12154,368],{"class":255},[164,12156,4561],{"class":255},[164,12158,285],{"class":255},[164,12160,12161],{"class":288},"in",[164,12163,368],{"class":255},[164,12165,4561],{"class":255},[164,12167,285],{"class":255},[164,12169,12170],{"class":288},"like",[164,12172,292],{"class":255},[164,12174,12175],{"class":166,"line":16},[164,12176,343],{"emptyLinePlaceholder":342},[164,12178,12179,12181,12184,12186,12188,12190,12192],{"class":166,"line":185},[164,12180,1094],{"class":352},[164,12182,12183],{"class":597}," WhereClause",[164,12185,1122],{"class":255},[164,12187,1125],{"class":597},[164,12189,1160],{"class":255},[164,12191,601],{"class":255},[164,12193,378],{"class":255},[164,12195,12196,12198,12200,12202,12204,12206,12208,12210],{"class":166,"line":191},[164,12197,11429],{"class":259},[164,12199,11432],{"class":597},[164,12201,10352],{"class":255},[164,12203,10355],{"class":255},[164,12205,1895],{"class":597},[164,12207,925],{"class":259},[164,12209,1144],{"class":255},[164,12211,378],{"class":255},[164,12213,12214,12217,12220,12222,12224,12226,12228,12230,12232,12234,12236,12238,12240,12242,12245,12248,12251,12253,12255,12257,12259,12261],{"class":166,"line":346},[164,12215,12216],{"class":259}," [",[164,12218,12219],{"class":597},"O",[164,12221,10352],{"class":255},[164,12223,12118],{"class":597},[164,12225,925],{"class":259},[164,12227,1144],{"class":255},[164,12229,1895],{"class":597},[164,12231,918],{"class":259},[164,12233,11432],{"class":597},[164,12235,10370],{"class":259},[164,12237,10373],{"class":352},[164,12239,788],{"class":259},[164,12241,2046],{"class":255},[164,12243,12244],{"class":597}," U",[164,12246,12247],{"class":259},")[] ",[164,12249,12250],{"class":255},"?",[164,12252,12244],{"class":597},[164,12254,10144],{"class":255},[164,12256,1895],{"class":597},[164,12258,918],{"class":259},[164,12260,11432],{"class":597},[164,12262,6542],{"class":259},[164,12264,12265],{"class":166,"line":381},[164,12266,1260],{"class":255},[164,12268,12269],{"class":166,"line":424},[164,12270,1281],{"class":255},[164,12272,12273],{"class":166,"line":461},[164,12274,343],{"emptyLinePlaceholder":342},[164,12276,12277,12279,12282,12284,12286,12288,12290],{"class":166,"line":490},[164,12278,1094],{"class":352},[164,12280,12281],{"class":597}," OrderByClause",[164,12283,1122],{"class":255},[164,12285,1125],{"class":597},[164,12287,1160],{"class":255},[164,12289,601],{"class":255},[164,12291,378],{"class":255},[164,12293,12294,12296,12298,12300,12302,12304,12306,12308,12310,12313,12315,12317,12319,12322],{"class":166,"line":526},[164,12295,11429],{"class":259},[164,12297,11432],{"class":597},[164,12299,10352],{"class":255},[164,12301,10355],{"class":255},[164,12303,1895],{"class":597},[164,12305,925],{"class":259},[164,12307,1144],{"class":255},[164,12309,285],{"class":255},[164,12311,12312],{"class":288},"asc",[164,12314,368],{"class":255},[164,12316,4561],{"class":255},[164,12318,285],{"class":255},[164,12320,12321],{"class":288},"desc",[164,12323,292],{"class":255},[164,12325,12326],{"class":166,"line":535},[164,12327,1281],{"class":255},[164,12329,12330],{"class":166,"line":29},[164,12331,343],{"emptyLinePlaceholder":342},[164,12333,12334,12336,12339,12341,12343,12345],{"class":166,"line":545},[164,12335,3376],{"class":352},[164,12337,12338],{"class":597}," QueryBuilder",[164,12340,1122],{"class":255},[164,12342,1125],{"class":597},[164,12344,1160],{"class":255},[164,12346,378],{"class":255},[164,12348,12349,12352,12354,12357,12359,12361,12363,12365,12368,12370,12372,12374],{"class":166,"line":562},[164,12350,12351],{"class":384}," where",[164,12353,365],{"class":255},[164,12355,12356],{"class":791},"clause",[164,12358,388],{"class":255},[164,12360,12183],{"class":597},[164,12362,1122],{"class":255},[164,12364,1125],{"class":597},[164,12366,12367],{"class":255},">):",[164,12369,12338],{"class":597},[164,12371,1122],{"class":255},[164,12373,1125],{"class":597},[164,12375,1540],{"class":255},[164,12377,12378,12381,12383,12385,12387,12389,12391,12393,12395,12397,12399,12401],{"class":166,"line":578},[164,12379,12380],{"class":384}," orderBy",[164,12382,365],{"class":255},[164,12384,12356],{"class":791},[164,12386,388],{"class":255},[164,12388,12281],{"class":597},[164,12390,1122],{"class":255},[164,12392,1125],{"class":597},[164,12394,12367],{"class":255},[164,12396,12338],{"class":597},[164,12398,1122],{"class":255},[164,12400,1125],{"class":597},[164,12402,1540],{"class":255},[164,12404,12405,12408,12410,12413,12415,12417,12419,12421,12423,12425],{"class":166,"line":583},[164,12406,12407],{"class":384}," limit",[164,12409,365],{"class":255},[164,12411,12412],{"class":791},"count",[164,12414,388],{"class":255},[164,12416,4388],{"class":597},[164,12418,1150],{"class":255},[164,12420,12338],{"class":597},[164,12422,1122],{"class":255},[164,12424,1125],{"class":597},[164,12426,1540],{"class":255},[164,12428,12429,12432,12435,12437,12439,12441,12443],{"class":166,"line":589},[164,12430,12431],{"class":384}," execute",[164,12433,12434],{"class":255},"():",[164,12436,1153],{"class":597},[164,12438,1122],{"class":255},[164,12440,1125],{"class":597},[164,12442,1325],{"class":259},[164,12444,1540],{"class":255},[164,12446,12447],{"class":166,"line":615},[164,12448,1281],{"class":255},[164,12450,12451],{"class":166,"line":978},[164,12452,343],{"emptyLinePlaceholder":342},[164,12454,12455],{"class":166,"line":984},[164,12456,11466],{"class":170},[164,12458,12459,12461,12463],{"class":166,"line":992},[164,12460,3376],{"class":352},[164,12462,3033],{"class":597},[164,12464,378],{"class":255},[164,12466,12467,12469,12471],{"class":166,"line":999},[164,12468,385],{"class":384},[164,12470,388],{"class":255},[164,12472,6932],{"class":597},[164,12474,12475,12477,12479],{"class":166,"line":1004},[164,12476,464],{"class":384},[164,12478,388],{"class":255},[164,12480,3389],{"class":597},[164,12482,12483,12485,12487],{"class":166,"line":1010},[164,12484,2540],{"class":384},[164,12486,388],{"class":255},[164,12488,6932],{"class":597},[164,12490,12491,12494,12496],{"class":166,"line":1466},[164,12492,12493],{"class":384}," category",[164,12495,388],{"class":255},[164,12497,3389],{"class":597},[164,12499,12500,12503,12505,12507],{"class":166,"line":1495},[164,12501,12502],{"class":384}," tags",[164,12504,388],{"class":255},[164,12506,1136],{"class":597},[164,12508,12509],{"class":259},"[]\n",[164,12511,12512],{"class":166,"line":1505},[164,12513,1281],{"class":255},[164,12515,12516],{"class":166,"line":5434},[164,12517,343],{"emptyLinePlaceholder":342},[164,12519,12520,12523,12525,12528,12530,12532,12535,12537,12539,12541],{"class":166,"line":5454},[164,12521,12522],{"class":352},"declare",[164,12524,1116],{"class":352},[164,12526,12527],{"class":362}," createQuery",[164,12529,1122],{"class":255},[164,12531,1125],{"class":597},[164,12533,12534],{"class":255},">():",[164,12536,12338],{"class":597},[164,12538,1122],{"class":255},[164,12540,1125],{"class":597},[164,12542,1540],{"class":255},[164,12544,12545],{"class":166,"line":5468},[164,12546,343],{"emptyLinePlaceholder":342},[164,12548,12549,12551,12553,12555,12557,12559,12561,12564,12566],{"class":166,"line":5482},[164,12550,721],{"class":352},[164,12552,2444],{"class":259},[164,12554,359],{"class":255},[164,12556,853],{"class":251},[164,12558,12527],{"class":362},[164,12560,1122],{"class":255},[164,12562,12563],{"class":597},"Product",[164,12565,1160],{"class":255},[164,12567,734],{"class":259},[164,12569,12570,12573,12576,12578],{"class":166,"line":5496},[164,12571,12572],{"class":255}," .",[164,12574,12575],{"class":362},"where",[164,12577,365],{"class":259},[164,12579,906],{"class":255},[164,12581,12582,12585,12587,12589,12592,12594,12597,12599,12602,12604,12606],{"class":166,"line":5511},[164,12583,12584],{"class":384}," price",[164,12586,388],{"class":255},[164,12588,256],{"class":255},[164,12590,12591],{"class":384}," gt",[164,12593,388],{"class":255},[164,12595,12596],{"class":921}," 100",[164,12598,263],{"class":255},[164,12600,12601],{"class":384}," lt",[164,12603,388],{"class":255},[164,12605,6982],{"class":921},[164,12607,1492],{"class":255},[164,12609,12610,12613,12615,12617,12619,12621,12623,12626,12628],{"class":166,"line":8828},[164,12611,12612],{"class":384}," category",[164,12614,388],{"class":255},[164,12616,256],{"class":255},[164,12618,2830],{"class":384},[164,12620,388],{"class":255},[164,12622,285],{"class":255},[164,12624,12625],{"class":288},"electronics",[164,12627,368],{"class":255},[164,12629,1492],{"class":255},[164,12631,12632,12635,12637,12639,12641,12643,12645,12648,12650],{"class":166,"line":9970},[164,12633,12634],{"class":384}," tags",[164,12636,388],{"class":255},[164,12638,256],{"class":255},[164,12640,10352],{"class":384},[164,12642,388],{"class":255},[164,12644,285],{"class":255},[164,12646,12647],{"class":288},"smartphone",[164,12649,368],{"class":255},[164,12651,1492],{"class":255},[164,12653,12655,12657],{"class":166,"line":12654},37,[164,12656,987],{"class":255},[164,12658,532],{"class":259},[164,12660,12662,12664,12667,12669,12671,12674,12676,12678,12680,12682,12684],{"class":166,"line":12661},38,[164,12663,12572],{"class":255},[164,12665,12666],{"class":362},"orderBy",[164,12668,365],{"class":259},[164,12670,2710],{"class":255},[164,12672,12673],{"class":384}," price",[164,12675,388],{"class":255},[164,12677,285],{"class":255},[164,12679,12312],{"class":288},[164,12681,368],{"class":255},[164,12683,279],{"class":255},[164,12685,532],{"class":259},[164,12687,12689,12691,12694,12696,12699],{"class":166,"line":12688},39,[164,12690,12572],{"class":255},[164,12692,12693],{"class":362},"limit",[164,12695,365],{"class":259},[164,12697,12698],{"class":921},"10",[164,12700,532],{"class":259},[164,12702,12704,12706,12709],{"class":166,"line":12703},40,[164,12705,12572],{"class":255},[164,12707,12708],{"class":362},"execute",[164,12710,734],{"class":259},[98,12712,12714],{"id":12713},"utility-types-and-type-manipulation","Utility Types and Type Manipulation",[149,12716,12718],{"id":12717},"custom-utility-types","Custom Utility Types",[154,12720,12722],{"className":156,"code":12721,"language":158,"meta":159,"style":159},"// Deep partial for nested objects\ntype DeepPartial = {\n [P in keyof T]?: T[P] extends object ? DeepPartial : T[P]\n}\n\n// Non-nullable type\ntype NonNullable = T extends null | undefined ? never : T\n\n// Extract keys by value type\ntype KeysOfType = {\n [K in keyof T]: T[K] extends U ? K : never\n}[keyof T]\n\ninterface Example {\n id: number\n name: string\n isActive: boolean\n metadata: object\n count: number\n}\n\ntype StringKeys = KeysOfType // \"name\"\ntype NumberKeys = KeysOfType // \"id\" | \"count\"\n\n// Require at least one property\ntype RequireAtLeastOne = Pick<\n T,\n Exclude\n> &\n {\n [K in Keys]-?: Required> & Partial>>\n }[Keys]\n\ntype UpdateUser = RequireAtLeastOne<\n { name?: string; email?: string; avatar?: string },\n \"name\" | \"email\"\n>\n\n// Valid: { name: \"John\" }, { email: \"john@example.com\" }, { name: \"John\", email: \"john@example.com\" }\n// Invalid: { avatar: \"avatar.jpg\" } - must have at least name or email\n",[161,12723,12724,12729,12746,12801,12805,12809,12814,12849,12853,12858,12879,12915,12928,12932,12941,12949,12957,12966,12975,12984,12988,12992,13017,13041,13045,13050,13087,13094,13110,13117,13122,13183,13193,13197,13210,13241,13257,13261,13265,13270],{"__ignoreMap":159},[164,12725,12726],{"class":166,"line":167},[164,12727,12728],{"class":170},"// Deep partial for nested objects\n",[164,12730,12731,12733,12736,12738,12740,12742,12744],{"class":166,"line":174},[164,12732,1094],{"class":352},[164,12734,12735],{"class":597}," DeepPartial",[164,12737,1122],{"class":255},[164,12739,1125],{"class":597},[164,12741,1160],{"class":255},[164,12743,601],{"class":255},[164,12745,378],{"class":255},[164,12747,12748,12750,12752,12754,12756,12758,12760,12762,12764,12766,12768,12770,12772,12775,12777,12779,12781,12783,12785,12787,12789,12791,12793,12795,12797,12799],{"class":166,"line":16},[164,12749,11429],{"class":259},[164,12751,10349],{"class":597},[164,12753,10352],{"class":255},[164,12755,10355],{"class":255},[164,12757,1895],{"class":597},[164,12759,925],{"class":259},[164,12761,1144],{"class":255},[164,12763,1895],{"class":597},[164,12765,918],{"class":259},[164,12767,10349],{"class":597},[164,12769,10370],{"class":259},[164,12771,10373],{"class":352},[164,12773,12774],{"class":597}," object",[164,12776,10139],{"class":255},[164,12778,12735],{"class":597},[164,12780,1122],{"class":255},[164,12782,1125],{"class":597},[164,12784,918],{"class":259},[164,12786,10349],{"class":597},[164,12788,925],{"class":259},[164,12790,1160],{"class":255},[164,12792,10144],{"class":255},[164,12794,1895],{"class":597},[164,12796,918],{"class":259},[164,12798,10349],{"class":597},[164,12800,6542],{"class":259},[164,12802,12803],{"class":166,"line":185},[164,12804,1281],{"class":255},[164,12806,12807],{"class":166,"line":191},[164,12808,343],{"emptyLinePlaceholder":342},[164,12810,12811],{"class":166,"line":346},[164,12812,12813],{"class":170},"// Non-nullable type\n",[164,12815,12816,12818,12821,12823,12825,12827,12829,12831,12833,12835,12837,12840,12842,12845,12847],{"class":166,"line":381},[164,12817,1094],{"class":352},[164,12819,12820],{"class":597}," NonNullable",[164,12822,1122],{"class":255},[164,12824,1125],{"class":597},[164,12826,1160],{"class":255},[164,12828,601],{"class":255},[164,12830,1895],{"class":597},[164,12832,1878],{"class":352},[164,12834,7842],{"class":597},[164,12836,4561],{"class":255},[164,12838,12839],{"class":597}," undefined",[164,12841,10139],{"class":255},[164,12843,12844],{"class":597}," never",[164,12846,10144],{"class":255},[164,12848,4527],{"class":597},[164,12850,12851],{"class":166,"line":424},[164,12852,343],{"emptyLinePlaceholder":342},[164,12854,12855],{"class":166,"line":461},[164,12856,12857],{"class":170},"// Extract keys by value type\n",[164,12859,12860,12862,12865,12867,12869,12871,12873,12875,12877],{"class":166,"line":490},[164,12861,1094],{"class":352},[164,12863,12864],{"class":597}," KeysOfType",[164,12866,1122],{"class":255},[164,12868,1125],{"class":597},[164,12870,263],{"class":255},[164,12872,12244],{"class":597},[164,12874,1160],{"class":255},[164,12876,601],{"class":255},[164,12878,378],{"class":255},[164,12880,12881,12883,12885,12887,12889,12891,12893,12895,12897,12899,12901,12903,12905,12907,12909,12911,12913],{"class":166,"line":526},[164,12882,11429],{"class":259},[164,12884,11432],{"class":597},[164,12886,10352],{"class":255},[164,12888,10355],{"class":255},[164,12890,1895],{"class":597},[164,12892,925],{"class":259},[164,12894,388],{"class":255},[164,12896,1895],{"class":597},[164,12898,918],{"class":259},[164,12900,11432],{"class":597},[164,12902,10370],{"class":259},[164,12904,10373],{"class":352},[164,12906,12244],{"class":597},[164,12908,10139],{"class":255},[164,12910,11679],{"class":597},[164,12912,10144],{"class":255},[164,12914,4406],{"class":597},[164,12916,12917,12919,12921,12924,12926],{"class":166,"line":535},[164,12918,529],{"class":255},[164,12920,918],{"class":259},[164,12922,12923],{"class":255},"keyof",[164,12925,1895],{"class":597},[164,12927,6542],{"class":259},[164,12929,12930],{"class":166,"line":29},[164,12931,343],{"emptyLinePlaceholder":342},[164,12933,12934,12936,12939],{"class":166,"line":545},[164,12935,3376],{"class":352},[164,12937,12938],{"class":597}," Example",[164,12940,378],{"class":255},[164,12942,12943,12945,12947],{"class":166,"line":562},[164,12944,385],{"class":384},[164,12946,388],{"class":255},[164,12948,6932],{"class":597},[164,12950,12951,12953,12955],{"class":166,"line":578},[164,12952,464],{"class":384},[164,12954,388],{"class":255},[164,12956,3389],{"class":597},[164,12958,12959,12962,12964],{"class":166,"line":583},[164,12960,12961],{"class":384}," isActive",[164,12963,388],{"class":255},[164,12965,6946],{"class":597},[164,12967,12968,12971,12973],{"class":166,"line":589},[164,12969,12970],{"class":384}," metadata",[164,12972,388],{"class":255},[164,12974,10376],{"class":597},[164,12976,12977,12980,12982],{"class":166,"line":615},[164,12978,12979],{"class":384}," count",[164,12981,388],{"class":255},[164,12983,6932],{"class":597},[164,12985,12986],{"class":166,"line":978},[164,12987,1281],{"class":255},[164,12989,12990],{"class":166,"line":984},[164,12991,343],{"emptyLinePlaceholder":342},[164,12993,12994,12996,12999,13001,13003,13005,13008,13010,13012,13014],{"class":166,"line":992},[164,12995,1094],{"class":352},[164,12997,12998],{"class":597}," StringKeys",[164,13000,601],{"class":255},[164,13002,12864],{"class":597},[164,13004,1122],{"class":255},[164,13006,13007],{"class":597},"Example",[164,13009,263],{"class":255},[164,13011,1136],{"class":597},[164,13013,1160],{"class":255},[164,13015,13016],{"class":170}," // \"name\"\n",[164,13018,13019,13021,13024,13026,13028,13030,13032,13034,13036,13038],{"class":166,"line":999},[164,13020,1094],{"class":352},[164,13022,13023],{"class":597}," NumberKeys",[164,13025,601],{"class":255},[164,13027,12864],{"class":597},[164,13029,1122],{"class":255},[164,13031,13007],{"class":597},[164,13033,263],{"class":255},[164,13035,4388],{"class":597},[164,13037,1160],{"class":255},[164,13039,13040],{"class":170}," // \"id\" | \"count\"\n",[164,13042,13043],{"class":166,"line":1004},[164,13044,343],{"emptyLinePlaceholder":342},[164,13046,13047],{"class":166,"line":1010},[164,13048,13049],{"class":170},"// Require at least one property\n",[164,13051,13052,13054,13057,13059,13061,13063,13066,13068,13070,13072,13074,13076,13078,13080,13082,13085],{"class":166,"line":1466},[164,13053,1094],{"class":352},[164,13055,13056],{"class":597}," RequireAtLeastOne",[164,13058,1122],{"class":255},[164,13060,1125],{"class":597},[164,13062,263],{"class":255},[164,13064,13065],{"class":597}," Keys",[164,13067,1878],{"class":352},[164,13069,10355],{"class":255},[164,13071,1895],{"class":597},[164,13073,601],{"class":255},[164,13075,10355],{"class":255},[164,13077,1895],{"class":597},[164,13079,1160],{"class":255},[164,13081,601],{"class":255},[164,13083,13084],{"class":597}," Pick",[164,13086,11194],{"class":255},[164,13088,13089,13092],{"class":166,"line":1495},[164,13090,13091],{"class":597}," T",[164,13093,421],{"class":255},[164,13095,13096,13099,13102,13104,13106,13108],{"class":166,"line":1505},[164,13097,13098],{"class":597}," Exclude",[164,13100,13101],{"class":255},">",[164,13156,3354],{"class":255},[164,13158,11707],{"class":597},[164,13160,1122],{"class":255},[164,13162,11712],{"class":597},[164,13164,1122],{"class":255},[164,13166,1125],{"class":597},[164,13168,263],{"class":255},[164,13170,13171],{"class":597}," Exclude",[164,13173,1122],{"class":255},[164,13175,13176],{"class":597},"Keys",[164,13178,263],{"class":255},[164,13180,11679],{"class":597},[164,13182,2064],{"class":255},[164,13184,13185,13187,13189,13191],{"class":166,"line":5482},[164,13186,987],{"class":255},[164,13188,918],{"class":259},[164,13190,13176],{"class":597},[164,13192,6542],{"class":259},[164,13194,13195],{"class":166,"line":5496},[164,13196,343],{"emptyLinePlaceholder":342},[164,13198,13199,13201,13204,13206,13208],{"class":166,"line":5511},[164,13200,1094],{"class":352},[164,13202,13203],{"class":597}," UpdateUser",[164,13205,601],{"class":255},[164,13207,13056],{"class":597},[164,13209,11194],{"class":255},[164,13211,13212,13215,13217,13219,13221,13223,13226,13228,13230,13232,13235,13237,13239],{"class":166,"line":8828},[164,13213,13214],{"class":255}," {",[164,13216,4626],{"class":384},[164,13218,1144],{"class":255},[164,13220,1136],{"class":597},[164,13222,4623],{"class":255},[164,13224,13225],{"class":384}," email",[164,13227,1144],{"class":255},[164,13229,1136],{"class":597},[164,13231,4623],{"class":255},[164,13233,13234],{"class":384}," avatar",[164,13236,1144],{"class":255},[164,13238,1136],{"class":597},[164,13240,1492],{"class":255},[164,13242,13243,13245,13247,13249,13251,13253,13255],{"class":166,"line":9970},[164,13244,2676],{"class":255},[164,13246,475],{"class":288},[164,13248,368],{"class":255},[164,13250,4561],{"class":255},[164,13252,285],{"class":255},[164,13254,438],{"class":288},[164,13256,292],{"class":255},[164,13258,13259],{"class":166,"line":12654},[164,13260,1540],{"class":255},[164,13262,13263],{"class":166,"line":12661},[164,13264,343],{"emptyLinePlaceholder":342},[164,13266,13267],{"class":166,"line":12688},[164,13268,13269],{"class":170},"// Valid: { name: \"John\" }, { email: \"john@example.com\" }, { name: \"John\", email: \"john@example.com\" }\n",[164,13271,13272],{"class":166,"line":12703},[164,13273,13274],{"class":170},"// Invalid: { avatar: \"avatar.jpg\" } - must have at least name or email\n",[149,13276,13278],{"id":13277},"function-type-utilities","Function Type Utilities",[154,13280,13282],{"className":156,"code":13281,"language":158,"meta":159,"style":159},"// Extract function parameters\ntype Parameters any> = T extends (\n ...args: infer P\n) => any\n ? P\n : never\n\n// Create overloaded function types\ntype OverloadedFunction any>> = {\n [K in keyof T]: T[K]\n}[keyof T]\n\ninterface ApiMethods {\n getUser: (id: number) => Promise\n getUsers: (filters?: UserFilters) => Promise\n createUser: (data: CreateUserData) => Promise\n}\n\ntype ApiFunction = OverloadedFunction\n// (id: number) => Promise | (filters?: UserFilters) => Promise | (data: CreateUserData) => Promise\n\n// Async function return type\ntype AsyncReturnType Promise> = T extends (\n ...args: any\n) => Promise\n ? R\n : never\n\ntype UserData = AsyncReturnType // User\n",[161,13283,13284,13289,13326,13340,13349,13355,13361,13365,13370,13414,13438,13450,13454,13463,13490,13521,13549,13553,13557,13575,13580,13584,13589,13631,13641,13656,13663,13669,13673],{"__ignoreMap":159},[164,13285,13286],{"class":166,"line":167},[164,13287,13288],{"class":170},"// Extract function parameters\n",[164,13290,13291,13293,13296,13298,13300,13302,13304,13306,13308,13310,13312,13314,13316,13318,13320,13322,13324],{"class":166,"line":174},[164,13292,1094],{"class":352},[164,13294,13295],{"class":597}," Parameters",[164,13297,1122],{"class":255},[164,13299,1125],{"class":597},[164,13301,1878],{"class":352},[164,13303,10221],{"class":255},[164,13305,10224],{"class":791},[164,13307,388],{"class":255},[164,13309,10229],{"class":597},[164,13311,402],{"class":255},[164,13313,797],{"class":352},[164,13315,10229],{"class":597},[164,13317,1160],{"class":255},[164,13319,601],{"class":255},[164,13321,1895],{"class":597},[164,13323,1878],{"class":352},[164,13325,7285],{"class":259},[164,13327,13328,13331,13333,13335,13337],{"class":166,"line":16},[164,13329,13330],{"class":255}," ...",[164,13332,10224],{"class":791},[164,13334,388],{"class":255},[164,13336,10238],{"class":255},[164,13338,13339],{"class":597}," P\n",[164,13341,13342,13344,13346],{"class":166,"line":185},[164,13343,1223],{"class":259},[164,13345,7336],{"class":352},[164,13347,13348],{"class":597}," any\n",[164,13350,13351,13353],{"class":166,"line":191},[164,13352,4395],{"class":255},[164,13354,13339],{"class":597},[164,13356,13357,13359],{"class":166,"line":346},[164,13358,4403],{"class":255},[164,13360,4406],{"class":597},[164,13362,13363],{"class":166,"line":381},[164,13364,343],{"emptyLinePlaceholder":342},[164,13366,13367],{"class":166,"line":424},[164,13368,13369],{"class":170},"// Create overloaded function types\n",[164,13371,13372,13374,13377,13379,13381,13383,13386,13388,13390,13392,13394,13396,13398,13400,13402,13404,13406,13408,13410,13412],{"class":166,"line":461},[164,13373,1094],{"class":352},[164,13375,13376],{"class":597}," OverloadedFunction",[164,13378,1122],{"class":255},[164,13380,1125],{"class":597},[164,13382,1878],{"class":352},[164,13384,13385],{"class":597}," Record",[164,13387,1122],{"class":255},[164,13389,1953],{"class":597},[164,13391,263],{"class":255},[164,13393,10221],{"class":255},[164,13395,10224],{"class":791},[164,13397,388],{"class":255},[164,13399,10229],{"class":597},[164,13401,1325],{"class":259},[164,13403,402],{"class":255},[164,13405,797],{"class":352},[164,13407,10229],{"class":597},[164,13409,13154],{"class":255},[164,13411,601],{"class":255},[164,13413,378],{"class":255},[164,13415,13416,13418,13420,13422,13424,13426,13428,13430,13432,13434,13436],{"class":166,"line":490},[164,13417,11429],{"class":259},[164,13419,11432],{"class":597},[164,13421,10352],{"class":255},[164,13423,10355],{"class":255},[164,13425,1895],{"class":597},[164,13427,925],{"class":259},[164,13429,388],{"class":255},[164,13431,1895],{"class":597},[164,13433,918],{"class":259},[164,13435,11432],{"class":597},[164,13437,6542],{"class":259},[164,13439,13440,13442,13444,13446,13448],{"class":166,"line":526},[164,13441,529],{"class":255},[164,13443,918],{"class":259},[164,13445,12923],{"class":255},[164,13447,1895],{"class":597},[164,13449,6542],{"class":259},[164,13451,13452],{"class":166,"line":535},[164,13453,343],{"emptyLinePlaceholder":342},[164,13455,13456,13458,13461],{"class":166,"line":29},[164,13457,3376],{"class":352},[164,13459,13460],{"class":597}," ApiMethods",[164,13462,378],{"class":255},[164,13464,13465,13468,13470,13472,13474,13476,13478,13480,13482,13484,13486,13488],{"class":166,"line":545},[164,13466,13467],{"class":384}," getUser",[164,13469,388],{"class":255},[164,13471,788],{"class":255},[164,13473,397],{"class":791},[164,13475,388],{"class":255},[164,13477,4388],{"class":597},[164,13479,402],{"class":255},[164,13481,797],{"class":352},[164,13483,1153],{"class":597},[164,13485,1122],{"class":255},[164,13487,1724],{"class":597},[164,13489,1540],{"class":255},[164,13491,13492,13495,13497,13499,13502,13504,13507,13509,13511,13513,13515,13517,13519],{"class":166,"line":562},[164,13493,13494],{"class":384}," getUsers",[164,13496,388],{"class":255},[164,13498,788],{"class":255},[164,13500,13501],{"class":791},"filters",[164,13503,1144],{"class":255},[164,13505,13506],{"class":597}," UserFilters",[164,13508,402],{"class":255},[164,13510,797],{"class":352},[164,13512,1153],{"class":597},[164,13514,1122],{"class":255},[164,13516,1724],{"class":597},[164,13518,1325],{"class":259},[164,13520,1540],{"class":255},[164,13522,13523,13526,13528,13530,13532,13534,13537,13539,13541,13543,13545,13547],{"class":166,"line":578},[164,13524,13525],{"class":384}," createUser",[164,13527,388],{"class":255},[164,13529,788],{"class":255},[164,13531,877],{"class":791},[164,13533,388],{"class":255},[164,13535,13536],{"class":597}," CreateUserData",[164,13538,402],{"class":255},[164,13540,797],{"class":352},[164,13542,1153],{"class":597},[164,13544,1122],{"class":255},[164,13546,1724],{"class":597},[164,13548,1540],{"class":255},[164,13550,13551],{"class":166,"line":583},[164,13552,1281],{"class":255},[164,13554,13555],{"class":166,"line":589},[164,13556,343],{"emptyLinePlaceholder":342},[164,13558,13559,13561,13564,13566,13568,13570,13573],{"class":166,"line":615},[164,13560,1094],{"class":352},[164,13562,13563],{"class":597}," ApiFunction",[164,13565,601],{"class":255},[164,13567,13376],{"class":597},[164,13569,1122],{"class":255},[164,13571,13572],{"class":597},"ApiMethods",[164,13574,1540],{"class":255},[164,13576,13577],{"class":166,"line":978},[164,13578,13579],{"class":170},"// (id: number) => Promise | (filters?: UserFilters) => Promise | (data: CreateUserData) => Promise\n",[164,13581,13582],{"class":166,"line":984},[164,13583,343],{"emptyLinePlaceholder":342},[164,13585,13586],{"class":166,"line":992},[164,13587,13588],{"class":170},"// Async function return type\n",[164,13590,13591,13593,13596,13598,13600,13602,13604,13606,13608,13610,13612,13614,13616,13618,13621,13623,13625,13627,13629],{"class":166,"line":999},[164,13592,1094],{"class":352},[164,13594,13595],{"class":597}," AsyncReturnType",[164,13597,1122],{"class":255},[164,13599,1125],{"class":597},[164,13601,1878],{"class":352},[164,13603,10221],{"class":255},[164,13605,10224],{"class":791},[164,13607,388],{"class":255},[164,13609,10229],{"class":597},[164,13611,402],{"class":255},[164,13613,797],{"class":352},[164,13615,1153],{"class":597},[164,13617,1122],{"class":255},[164,13619,13620],{"class":597},"any",[164,13622,13154],{"class":255},[164,13624,601],{"class":255},[164,13626,1895],{"class":597},[164,13628,1878],{"class":352},[164,13630,7285],{"class":259},[164,13632,13633,13635,13637,13639],{"class":166,"line":1004},[164,13634,13330],{"class":255},[164,13636,10224],{"class":791},[164,13638,388],{"class":255},[164,13640,13348],{"class":597},[164,13642,13643,13645,13647,13649,13652,13654],{"class":166,"line":1010},[164,13644,1223],{"class":259},[164,13646,7336],{"class":352},[164,13648,1153],{"class":597},[164,13650,13651],{"class":255}," = {}\n\n host(\n host: string,\n ): Omit & { host: () => never } {\n this.config.host = host\n return this as any\n }\n\n port(\n port: number,\n ): Omit & { port: () => never } {\n this.config.port = port\n return this as any\n }\n\n database(\n database: string,\n ): Omit & { database: () => never } {\n this.config.database = database\n return this as any\n }\n\n username(\n username: string,\n ): Omit & { username: () => never } {\n this.config.username = username\n return this as any\n }\n\n password(\n password: string,\n ): Omit & { password: () => never } {\n this.config.password = password\n return this as any\n }\n\n ssl(ssl: boolean): this {\n this.config.ssl = ssl\n return this\n }\n\n timeout(timeout: number): this {\n this.config.timeout = timeout\n return this\n }\n\n build(): DatabaseConfig {\n const requiredKeys: RequiredKeys[] = [\n \"host\",\n \"port\",\n \"database\",\n \"username\",\n \"password\",\n ]\n\n for (const key of requiredKeys) {\n if (!(key in this.config)) {\n throw new Error(`Missing required configuration: ${key}`)\n }\n }\n\n return this.config as DatabaseConfig\n }\n}\n\n// Usage - TypeScript enforces all required methods are called\nconst config = new DatabaseConfigBuilder()\n .host(\"localhost\")\n .port(5432)\n .database(\"myapp\")\n .username(\"user\")\n .password(\"password\")\n .ssl(true)\n .build()\n",[161,13716,13717,13722,13731,13739,13747,13756,13765,13773,13782,13791,13795,13799,13849,13873,13877,13887,13910,13914,13920,13931,13972,13988,13999,14003,14007,14013,14024,14063,14078,14088,14092,14096,14102,14113,14152,14167,14177,14181,14185,14191,14202,14242,14258,14269,14274,14279,14286,14298,14338,14354,14365,14370,14375,14394,14410,14418,14423,14428,14447,14463,14470,14475,14480,14492,14511,14523,14534,14545,14556,14567,14573,14578,14600,14625,14650,14655,14660,14665,14679,14684,14689,14694,14700,14715,14732,14746,14764,14781,14798,14812],{"__ignoreMap":159},[164,13718,13719],{"class":166,"line":167},[164,13720,13721],{"class":170},"// Type-safe builder pattern\n",[164,13723,13724,13726,13729],{"class":166,"line":174},[164,13725,3376],{"class":352},[164,13727,13728],{"class":597}," DatabaseConfig",[164,13730,378],{"class":255},[164,13732,13733,13735,13737],{"class":166,"line":16},[164,13734,9070],{"class":384},[164,13736,388],{"class":255},[164,13738,3389],{"class":597},[164,13740,13741,13743,13745],{"class":166,"line":185},[164,13742,9058],{"class":384},[164,13744,388],{"class":255},[164,13746,6932],{"class":597},[164,13748,13749,13752,13754],{"class":166,"line":191},[164,13750,13751],{"class":384}," database",[164,13753,388],{"class":255},[164,13755,3389],{"class":597},[164,13757,13758,13761,13763],{"class":166,"line":346},[164,13759,13760],{"class":384}," username",[164,13762,388],{"class":255},[164,13764,3389],{"class":597},[164,13766,13767,13769,13771],{"class":166,"line":381},[164,13768,8179],{"class":384},[164,13770,388],{"class":255},[164,13772,3389],{"class":597},[164,13774,13775,13778,13780],{"class":166,"line":424},[164,13776,13777],{"class":384}," ssl",[164,13779,1144],{"class":255},[164,13781,6946],{"class":597},[164,13783,13784,13787,13789],{"class":166,"line":461},[164,13785,13786],{"class":384}," timeout",[164,13788,1144],{"class":255},[164,13790,6932],{"class":597},[164,13792,13793],{"class":166,"line":490},[164,13794,1281],{"class":255},[164,13796,13797],{"class":166,"line":526},[164,13798,343],{"emptyLinePlaceholder":342},[164,13800,13801,13803,13806,13808,13810,13813,13815,13817,13819,13822,13824,13826,13828,13831,13833,13835,13837,13839,13841,13843,13845,13847],{"class":166,"line":535},[164,13802,1094],{"class":352},[164,13804,13805],{"class":597}," RequiredKeys",[164,13807,601],{"class":255},[164,13809,285],{"class":255},[164,13811,13812],{"class":288},"host",[164,13814,368],{"class":255},[164,13816,4561],{"class":255},[164,13818,285],{"class":255},[164,13820,13821],{"class":288},"port",[164,13823,368],{"class":255},[164,13825,4561],{"class":255},[164,13827,285],{"class":255},[164,13829,13830],{"class":288},"database",[164,13832,368],{"class":255},[164,13834,4561],{"class":255},[164,13836,285],{"class":255},[164,13838,11343],{"class":288},[164,13840,368],{"class":255},[164,13842,4561],{"class":255},[164,13844,285],{"class":255},[164,13846,11360],{"class":288},[164,13848,292],{"class":255},[164,13850,13851,13853,13855,13857,13859,13862,13864,13866,13868,13871],{"class":166,"line":29},[164,13852,1094],{"class":352},[164,13854,11670],{"class":597},[164,13856,601],{"class":255},[164,13858,285],{"class":255},[164,13860,13861],{"class":288},"ssl",[164,13863,368],{"class":255},[164,13865,4561],{"class":255},[164,13867,285],{"class":255},[164,13869,13870],{"class":288},"timeout",[164,13872,292],{"class":255},[164,13874,13875],{"class":166,"line":545},[164,13876,343],{"emptyLinePlaceholder":342},[164,13878,13879,13882,13885],{"class":166,"line":562},[164,13880,13881],{"class":352},"class",[164,13883,13884],{"class":597}," DatabaseConfigBuilder",[164,13886,378],{"class":255},[164,13888,13889,13892,13895,13897,13899,13901,13904,13906,13908],{"class":166,"line":578},[164,13890,13891],{"class":352}," private",[164,13893,13894],{"class":384}," config",[164,13896,388],{"class":255},[164,13898,11707],{"class":597},[164,13900,1122],{"class":255},[164,13902,13903],{"class":597},"DatabaseConfig",[164,13905,1160],{"class":255},[164,13907,601],{"class":255},[164,13909,3357],{"class":255},[164,13911,13912],{"class":166,"line":583},[164,13913,343],{"emptyLinePlaceholder":342},[164,13915,13916,13918],{"class":166,"line":589},[164,13917,9070],{"class":384},[164,13919,2671],{"class":255},[164,13921,13922,13925,13927,13929],{"class":166,"line":615},[164,13923,13924],{"class":791}," host",[164,13926,388],{"class":255},[164,13928,1136],{"class":597},[164,13930,421],{"class":255},[164,13932,13933,13936,13938,13940,13943,13945,13947,13949,13951,13953,13955,13957,13960,13962,13964,13966,13968,13970],{"class":166,"line":978},[164,13934,13935],{"class":255}," ):",[164,13937,11692],{"class":597},[164,13939,1122],{"class":255},[164,13941,13942],{"class":597},"DatabaseConfigBuilder",[164,13944,263],{"class":255},[164,13946,285],{"class":255},[164,13948,13812],{"class":288},[164,13950,368],{"class":255},[164,13952,1160],{"class":255},[164,13954,3354],{"class":255},[164,13956,256],{"class":255},[164,13958,13959],{"class":384}," host",[164,13961,388],{"class":255},[164,13963,1313],{"class":255},[164,13965,797],{"class":352},[164,13967,12844],{"class":597},[164,13969,279],{"class":255},[164,13971,378],{"class":255},[164,13973,13974,13976,13979,13981,13983,13985],{"class":166,"line":984},[164,13975,7024],{"class":255},[164,13977,13978],{"class":259},"config",[164,13980,405],{"class":255},[164,13982,13812],{"class":259},[164,13984,601],{"class":255},[164,13986,13987],{"class":259}," host\n",[164,13989,13990,13992,13995,13997],{"class":166,"line":992},[164,13991,1768],{"class":251},[164,13993,13994],{"class":255}," this",[164,13996,3439],{"class":251},[164,13998,13348],{"class":597},[164,14000,14001],{"class":166,"line":999},[164,14002,1260],{"class":255},[164,14004,14005],{"class":166,"line":1004},[164,14006,343],{"emptyLinePlaceholder":342},[164,14008,14009,14011],{"class":166,"line":1010},[164,14010,9058],{"class":384},[164,14012,2671],{"class":255},[164,14014,14015,14018,14020,14022],{"class":166,"line":1466},[164,14016,14017],{"class":791}," port",[164,14019,388],{"class":255},[164,14021,4388],{"class":597},[164,14023,421],{"class":255},[164,14025,14026,14028,14030,14032,14034,14036,14038,14040,14042,14044,14046,14048,14051,14053,14055,14057,14059,14061],{"class":166,"line":1495},[164,14027,13935],{"class":255},[164,14029,11692],{"class":597},[164,14031,1122],{"class":255},[164,14033,13942],{"class":597},[164,14035,263],{"class":255},[164,14037,285],{"class":255},[164,14039,13821],{"class":288},[164,14041,368],{"class":255},[164,14043,1160],{"class":255},[164,14045,3354],{"class":255},[164,14047,256],{"class":255},[164,14049,14050],{"class":384}," port",[164,14052,388],{"class":255},[164,14054,1313],{"class":255},[164,14056,797],{"class":352},[164,14058,12844],{"class":597},[164,14060,279],{"class":255},[164,14062,378],{"class":255},[164,14064,14065,14067,14069,14071,14073,14075],{"class":166,"line":1505},[164,14066,7024],{"class":255},[164,14068,13978],{"class":259},[164,14070,405],{"class":255},[164,14072,13821],{"class":259},[164,14074,601],{"class":255},[164,14076,14077],{"class":259}," port\n",[164,14079,14080,14082,14084,14086],{"class":166,"line":5434},[164,14081,1768],{"class":251},[164,14083,13994],{"class":255},[164,14085,3439],{"class":251},[164,14087,13348],{"class":597},[164,14089,14090],{"class":166,"line":5454},[164,14091,1260],{"class":255},[164,14093,14094],{"class":166,"line":5468},[164,14095,343],{"emptyLinePlaceholder":342},[164,14097,14098,14100],{"class":166,"line":5482},[164,14099,13751],{"class":384},[164,14101,2671],{"class":255},[164,14103,14104,14107,14109,14111],{"class":166,"line":5496},[164,14105,14106],{"class":791}," database",[164,14108,388],{"class":255},[164,14110,1136],{"class":597},[164,14112,421],{"class":255},[164,14114,14115,14117,14119,14121,14123,14125,14127,14129,14131,14133,14135,14137,14140,14142,14144,14146,14148,14150],{"class":166,"line":5511},[164,14116,13935],{"class":255},[164,14118,11692],{"class":597},[164,14120,1122],{"class":255},[164,14122,13942],{"class":597},[164,14124,263],{"class":255},[164,14126,285],{"class":255},[164,14128,13830],{"class":288},[164,14130,368],{"class":255},[164,14132,1160],{"class":255},[164,14134,3354],{"class":255},[164,14136,256],{"class":255},[164,14138,14139],{"class":384}," database",[164,14141,388],{"class":255},[164,14143,1313],{"class":255},[164,14145,797],{"class":352},[164,14147,12844],{"class":597},[164,14149,279],{"class":255},[164,14151,378],{"class":255},[164,14153,14154,14156,14158,14160,14162,14164],{"class":166,"line":8828},[164,14155,7024],{"class":255},[164,14157,13978],{"class":259},[164,14159,405],{"class":255},[164,14161,13830],{"class":259},[164,14163,601],{"class":255},[164,14165,14166],{"class":259}," database\n",[164,14168,14169,14171,14173,14175],{"class":166,"line":9970},[164,14170,1768],{"class":251},[164,14172,13994],{"class":255},[164,14174,3439],{"class":251},[164,14176,13348],{"class":597},[164,14178,14179],{"class":166,"line":12654},[164,14180,1260],{"class":255},[164,14182,14183],{"class":166,"line":12661},[164,14184,343],{"emptyLinePlaceholder":342},[164,14186,14187,14189],{"class":166,"line":12688},[164,14188,13760],{"class":384},[164,14190,2671],{"class":255},[164,14192,14193,14196,14198,14200],{"class":166,"line":12703},[164,14194,14195],{"class":791}," username",[164,14197,388],{"class":255},[164,14199,1136],{"class":597},[164,14201,421],{"class":255},[164,14203,14205,14207,14209,14211,14213,14215,14217,14219,14221,14223,14225,14227,14230,14232,14234,14236,14238,14240],{"class":166,"line":14204},41,[164,14206,13935],{"class":255},[164,14208,11692],{"class":597},[164,14210,1122],{"class":255},[164,14212,13942],{"class":597},[164,14214,263],{"class":255},[164,14216,285],{"class":255},[164,14218,11343],{"class":288},[164,14220,368],{"class":255},[164,14222,1160],{"class":255},[164,14224,3354],{"class":255},[164,14226,256],{"class":255},[164,14228,14229],{"class":384}," username",[164,14231,388],{"class":255},[164,14233,1313],{"class":255},[164,14235,797],{"class":352},[164,14237,12844],{"class":597},[164,14239,279],{"class":255},[164,14241,378],{"class":255},[164,14243,14245,14247,14249,14251,14253,14255],{"class":166,"line":14244},42,[164,14246,7024],{"class":255},[164,14248,13978],{"class":259},[164,14250,405],{"class":255},[164,14252,11343],{"class":259},[164,14254,601],{"class":255},[164,14256,14257],{"class":259}," username\n",[164,14259,14261,14263,14265,14267],{"class":166,"line":14260},43,[164,14262,1768],{"class":251},[164,14264,13994],{"class":255},[164,14266,3439],{"class":251},[164,14268,13348],{"class":597},[164,14270,14272],{"class":166,"line":14271},44,[164,14273,1260],{"class":255},[164,14275,14277],{"class":166,"line":14276},45,[164,14278,343],{"emptyLinePlaceholder":342},[164,14280,14282,14284],{"class":166,"line":14281},46,[164,14283,8179],{"class":384},[164,14285,2671],{"class":255},[164,14287,14289,14292,14294,14296],{"class":166,"line":14288},47,[164,14290,14291],{"class":791}," password",[164,14293,388],{"class":255},[164,14295,1136],{"class":597},[164,14297,421],{"class":255},[164,14299,14301,14303,14305,14307,14309,14311,14313,14315,14317,14319,14321,14323,14326,14328,14330,14332,14334,14336],{"class":166,"line":14300},48,[164,14302,13935],{"class":255},[164,14304,11692],{"class":597},[164,14306,1122],{"class":255},[164,14308,13942],{"class":597},[164,14310,263],{"class":255},[164,14312,285],{"class":255},[164,14314,11360],{"class":288},[164,14316,368],{"class":255},[164,14318,1160],{"class":255},[164,14320,3354],{"class":255},[164,14322,256],{"class":255},[164,14324,14325],{"class":384}," password",[164,14327,388],{"class":255},[164,14329,1313],{"class":255},[164,14331,797],{"class":352},[164,14333,12844],{"class":597},[164,14335,279],{"class":255},[164,14337,378],{"class":255},[164,14339,14341,14343,14345,14347,14349,14351],{"class":166,"line":14340},49,[164,14342,7024],{"class":255},[164,14344,13978],{"class":259},[164,14346,405],{"class":255},[164,14348,11360],{"class":259},[164,14350,601],{"class":255},[164,14352,14353],{"class":259}," password\n",[164,14355,14357,14359,14361,14363],{"class":166,"line":14356},50,[164,14358,1768],{"class":251},[164,14360,13994],{"class":255},[164,14362,3439],{"class":251},[164,14364,13348],{"class":597},[164,14366,14368],{"class":166,"line":14367},51,[164,14369,1260],{"class":255},[164,14371,14373],{"class":166,"line":14372},52,[164,14374,343],{"emptyLinePlaceholder":342},[164,14376,14378,14380,14382,14384,14386,14388,14390,14392],{"class":166,"line":14377},53,[164,14379,13777],{"class":384},[164,14381,365],{"class":255},[164,14383,13861],{"class":791},[164,14385,388],{"class":255},[164,14387,6994],{"class":597},[164,14389,1150],{"class":255},[164,14391,13994],{"class":597},[164,14393,378],{"class":255},[164,14395,14397,14399,14401,14403,14405,14407],{"class":166,"line":14396},54,[164,14398,7024],{"class":255},[164,14400,13978],{"class":259},[164,14402,405],{"class":255},[164,14404,13861],{"class":259},[164,14406,601],{"class":255},[164,14408,14409],{"class":259}," ssl\n",[164,14411,14413,14415],{"class":166,"line":14412},55,[164,14414,1768],{"class":251},[164,14416,14417],{"class":255}," this\n",[164,14419,14421],{"class":166,"line":14420},56,[164,14422,1260],{"class":255},[164,14424,14426],{"class":166,"line":14425},57,[164,14427,343],{"emptyLinePlaceholder":342},[164,14429,14431,14433,14435,14437,14439,14441,14443,14445],{"class":166,"line":14430},58,[164,14432,13786],{"class":384},[164,14434,365],{"class":255},[164,14436,13870],{"class":791},[164,14438,388],{"class":255},[164,14440,4388],{"class":597},[164,14442,1150],{"class":255},[164,14444,13994],{"class":597},[164,14446,378],{"class":255},[164,14448,14450,14452,14454,14456,14458,14460],{"class":166,"line":14449},59,[164,14451,7024],{"class":255},[164,14453,13978],{"class":259},[164,14455,405],{"class":255},[164,14457,13870],{"class":259},[164,14459,601],{"class":255},[164,14461,14462],{"class":259}," timeout\n",[164,14464,14466,14468],{"class":166,"line":14465},60,[164,14467,1768],{"class":251},[164,14469,14417],{"class":255},[164,14471,14473],{"class":166,"line":14472},61,[164,14474,1260],{"class":255},[164,14476,14478],{"class":166,"line":14477},62,[164,14479,343],{"emptyLinePlaceholder":342},[164,14481,14483,14486,14488,14490],{"class":166,"line":14482},63,[164,14484,14485],{"class":384}," build",[164,14487,12434],{"class":255},[164,14489,13728],{"class":597},[164,14491,378],{"class":255},[164,14493,14495,14497,14500,14502,14504,14507,14509],{"class":166,"line":14494},64,[164,14496,2757],{"class":352},[164,14498,14499],{"class":259}," requiredKeys",[164,14501,388],{"class":255},[164,14503,13805],{"class":597},[164,14505,14506],{"class":384},"[] ",[164,14508,359],{"class":255},[164,14510,9281],{"class":384},[164,14512,14514,14517,14519,14521],{"class":166,"line":14513},65,[164,14515,14516],{"class":255}," \"",[164,14518,13812],{"class":288},[164,14520,368],{"class":255},[164,14522,421],{"class":255},[164,14524,14526,14528,14530,14532],{"class":166,"line":14525},66,[164,14527,14516],{"class":255},[164,14529,13821],{"class":288},[164,14531,368],{"class":255},[164,14533,421],{"class":255},[164,14535,14537,14539,14541,14543],{"class":166,"line":14536},67,[164,14538,14516],{"class":255},[164,14540,13830],{"class":288},[164,14542,368],{"class":255},[164,14544,421],{"class":255},[164,14546,14548,14550,14552,14554],{"class":166,"line":14547},68,[164,14549,14516],{"class":255},[164,14551,11343],{"class":288},[164,14553,368],{"class":255},[164,14555,421],{"class":255},[164,14557,14559,14561,14563,14565],{"class":166,"line":14558},69,[164,14560,14516],{"class":255},[164,14562,11360],{"class":288},[164,14564,368],{"class":255},[164,14566,421],{"class":255},[164,14568,14570],{"class":166,"line":14569},70,[164,14571,14572],{"class":384}," ]\n",[164,14574,14576],{"class":166,"line":14575},71,[164,14577,343],{"emptyLinePlaceholder":342},[164,14579,14581,14584,14586,14588,14591,14594,14596,14598],{"class":166,"line":14580},72,[164,14582,14583],{"class":251}," for",[164,14585,788],{"class":384},[164,14587,721],{"class":352},[164,14589,14590],{"class":259}," key",[164,14592,14593],{"class":255}," of",[164,14595,14499],{"class":259},[164,14597,1223],{"class":384},[164,14599,906],{"class":255},[164,14601,14603,14605,14607,14609,14611,14614,14616,14618,14620,14623],{"class":166,"line":14602},73,[164,14604,8723],{"class":251},[164,14606,788],{"class":384},[164,14608,1212],{"class":255},[164,14610,365],{"class":384},[164,14612,14613],{"class":259},"key",[164,14615,10352],{"class":255},[164,14617,7066],{"class":255},[164,14619,13978],{"class":259},[164,14621,14622],{"class":384},")) ",[164,14624,906],{"class":255},[164,14626,14628,14631,14633,14635,14637,14639,14642,14644,14646,14648],{"class":166,"line":14627},74,[164,14629,14630],{"class":251}," throw",[164,14632,729],{"class":255},[164,14634,1235],{"class":362},[164,14636,365],{"class":384},[164,14638,1181],{"class":255},[164,14640,14641],{"class":288},"Missing required configuration: ",[164,14643,1187],{"class":255},[164,14645,14613],{"class":259},[164,14647,1192],{"class":255},[164,14649,532],{"class":384},[164,14651,14653],{"class":166,"line":14652},75,[164,14654,8817],{"class":255},[164,14656,14658],{"class":166,"line":14657},76,[164,14659,1743],{"class":255},[164,14661,14663],{"class":166,"line":14662},77,[164,14664,343],{"emptyLinePlaceholder":342},[164,14666,14668,14670,14672,14674,14676],{"class":166,"line":14667},78,[164,14669,1768],{"class":251},[164,14671,7066],{"class":255},[164,14673,13978],{"class":259},[164,14675,3439],{"class":251},[164,14677,14678],{"class":597}," DatabaseConfig\n",[164,14680,14682],{"class":166,"line":14681},79,[164,14683,1260],{"class":255},[164,14685,14687],{"class":166,"line":14686},80,[164,14688,1281],{"class":255},[164,14690,14692],{"class":166,"line":14691},81,[164,14693,343],{"emptyLinePlaceholder":342},[164,14695,14697],{"class":166,"line":14696},82,[164,14698,14699],{"class":170},"// Usage - TypeScript enforces all required methods are called\n",[164,14701,14703,14705,14707,14709,14711,14713],{"class":166,"line":14702},83,[164,14704,721],{"class":352},[164,14706,9049],{"class":259},[164,14708,359],{"class":255},[164,14710,729],{"class":255},[164,14712,13884],{"class":362},[164,14714,734],{"class":259},[164,14716,14718,14720,14722,14724,14726,14728,14730],{"class":166,"line":14717},84,[164,14719,12572],{"class":255},[164,14721,13812],{"class":362},[164,14723,365],{"class":259},[164,14725,368],{"class":255},[164,14727,9077],{"class":288},[164,14729,368],{"class":255},[164,14731,532],{"class":259},[164,14733,14735,14737,14739,14741,14744],{"class":166,"line":14734},85,[164,14736,12572],{"class":255},[164,14738,13821],{"class":362},[164,14740,365],{"class":259},[164,14742,14743],{"class":921},"5432",[164,14745,532],{"class":259},[164,14747,14749,14751,14753,14755,14757,14760,14762],{"class":166,"line":14748},86,[164,14750,12572],{"class":255},[164,14752,13830],{"class":362},[164,14754,365],{"class":259},[164,14756,368],{"class":255},[164,14758,14759],{"class":288},"myapp",[164,14761,368],{"class":255},[164,14763,532],{"class":259},[164,14765,14767,14769,14771,14773,14775,14777,14779],{"class":166,"line":14766},87,[164,14768,12572],{"class":255},[164,14770,11343],{"class":362},[164,14772,365],{"class":259},[164,14774,368],{"class":255},[164,14776,7857],{"class":288},[164,14778,368],{"class":255},[164,14780,532],{"class":259},[164,14782,14784,14786,14788,14790,14792,14794,14796],{"class":166,"line":14783},88,[164,14785,12572],{"class":255},[164,14787,11360],{"class":362},[164,14789,365],{"class":259},[164,14791,368],{"class":255},[164,14793,11360],{"class":288},[164,14795,368],{"class":255},[164,14797,532],{"class":259},[164,14799,14801,14803,14805,14807,14810],{"class":166,"line":14800},89,[164,14802,12572],{"class":255},[164,14804,13861],{"class":362},[164,14806,365],{"class":259},[164,14808,14809],{"class":1737},"true",[164,14811,532],{"class":259},[164,14813,14815,14817,14819],{"class":166,"line":14814},90,[164,14816,12572],{"class":255},[164,14818,6608],{"class":362},[164,14820,734],{"class":259},[149,14822,14824],{"id":14823},"factory-pattern-with-generic-constraints","Factory Pattern with Generic Constraints",[154,14826,14828],{"className":156,"code":14827,"language":158,"meta":159,"style":159},"// Generic factory with constraints\ninterface Entity {\n id: string\n createdAt: Date\n updatedAt: Date\n}\n\ninterface User extends Entity {\n name: string\n email: string\n}\n\ninterface Product extends Entity {\n name: string\n price: number\n category: string\n}\n\ntype EntityConstructor = new (\n data: Omit,\n) => T\n\nclass EntityFactory {\n constructor(private EntityClass: EntityConstructor) {}\n\n create(data: Omit): T {\n return new this.EntityClass(data)\n }\n\n createMany(dataArray: Omit[]): T[] {\n return dataArray.map((data) => this.create(data))\n }\n}\n\n// Implementation\nclass UserEntity implements User {\n id: string\n createdAt: Date\n updatedAt: Date\n name: string\n email: string\n\n constructor(data: Omit) {\n this.id = generateId()\n this.createdAt = new Date()\n this.updatedAt = new Date()\n this.name = data.name\n this.email = data.email\n }\n}\n\n// Usage\nconst userFactory = new EntityFactory(UserEntity)\nconst user = userFactory.create({ name: \"John\", email: \"john@example.com\" })\n",[161,14829,14830,14835,14844,14852,14861,14869,14873,14877,14889,14897,14905,14909,14913,14925,14933,14941,14949,14953,14957,14980,15000,15008,15012,15031,15055,15059,15087,15104,15108,15112,15148,15181,15185,15189,15193,15198,15212,15220,15228,15236,15244,15252,15256,15282,15295,15310,15325,15340,15355,15359,15363,15367,15371,15387],{"__ignoreMap":159},[164,14831,14832],{"class":166,"line":167},[164,14833,14834],{"class":170},"// Generic factory with constraints\n",[164,14836,14837,14839,14842],{"class":166,"line":174},[164,14838,3376],{"class":352},[164,14840,14841],{"class":597}," Entity",[164,14843,378],{"class":255},[164,14845,14846,14848,14850],{"class":166,"line":16},[164,14847,385],{"class":384},[164,14849,388],{"class":255},[164,14851,3389],{"class":597},[164,14853,14854,14856,14858],{"class":166,"line":185},[164,14855,493],{"class":384},[164,14857,388],{"class":255},[164,14859,14860],{"class":597}," Date\n",[164,14862,14863,14865,14867],{"class":166,"line":191},[164,14864,8239],{"class":384},[164,14866,388],{"class":255},[164,14868,14860],{"class":597},[164,14870,14871],{"class":166,"line":346},[164,14872,1281],{"class":255},[164,14874,14875],{"class":166,"line":381},[164,14876,343],{"emptyLinePlaceholder":342},[164,14878,14879,14881,14883,14885,14887],{"class":166,"line":424},[164,14880,3376],{"class":352},[164,14882,598],{"class":597},[164,14884,1878],{"class":352},[164,14886,14841],{"class":597},[164,14888,378],{"class":255},[164,14890,14891,14893,14895],{"class":166,"line":461},[164,14892,464],{"class":384},[164,14894,388],{"class":255},[164,14896,3389],{"class":597},[164,14898,14899,14901,14903],{"class":166,"line":490},[164,14900,427],{"class":384},[164,14902,388],{"class":255},[164,14904,3389],{"class":597},[164,14906,14907],{"class":166,"line":526},[164,14908,1281],{"class":255},[164,14910,14911],{"class":166,"line":535},[164,14912,343],{"emptyLinePlaceholder":342},[164,14914,14915,14917,14919,14921,14923],{"class":166,"line":29},[164,14916,3376],{"class":352},[164,14918,3033],{"class":597},[164,14920,1878],{"class":352},[164,14922,14841],{"class":597},[164,14924,378],{"class":255},[164,14926,14927,14929,14931],{"class":166,"line":545},[164,14928,464],{"class":384},[164,14930,388],{"class":255},[164,14932,3389],{"class":597},[164,14934,14935,14937,14939],{"class":166,"line":562},[164,14936,2540],{"class":384},[164,14938,388],{"class":255},[164,14940,6932],{"class":597},[164,14942,14943,14945,14947],{"class":166,"line":578},[164,14944,12493],{"class":384},[164,14946,388],{"class":255},[164,14948,3389],{"class":597},[164,14950,14951],{"class":166,"line":583},[164,14952,1281],{"class":255},[164,14954,14955],{"class":166,"line":589},[164,14956,343],{"emptyLinePlaceholder":342},[164,14958,14959,14961,14964,14966,14968,14970,14972,14974,14976,14978],{"class":166,"line":615},[164,14960,1094],{"class":352},[164,14962,14963],{"class":597}," EntityConstructor",[164,14965,1122],{"class":255},[164,14967,1125],{"class":597},[164,14969,1878],{"class":352},[164,14971,14841],{"class":597},[164,14973,1160],{"class":255},[164,14975,601],{"class":255},[164,14977,729],{"class":251},[164,14979,7285],{"class":255},[164,14981,14982,14984,14986,14988,14990,14992,14994,14996,14998],{"class":166,"line":978},[164,14983,4522],{"class":791},[164,14985,388],{"class":255},[164,14987,11692],{"class":597},[164,14989,1122],{"class":255},[164,14991,1125],{"class":597},[164,14993,263],{"class":255},[164,14995,10355],{"class":255},[164,14997,14841],{"class":597},[164,14999,1727],{"class":255},[164,15001,15002,15004,15006],{"class":166,"line":984},[164,15003,402],{"class":255},[164,15005,797],{"class":352},[164,15007,4527],{"class":597},[164,15009,15010],{"class":166,"line":992},[164,15011,343],{"emptyLinePlaceholder":342},[164,15013,15014,15016,15019,15021,15023,15025,15027,15029],{"class":166,"line":999},[164,15015,13881],{"class":352},[164,15017,15018],{"class":597}," EntityFactory",[164,15020,1122],{"class":255},[164,15022,1125],{"class":597},[164,15024,1878],{"class":352},[164,15026,14841],{"class":597},[164,15028,1160],{"class":255},[164,15030,378],{"class":255},[164,15032,15033,15035,15037,15039,15042,15044,15046,15048,15050,15053],{"class":166,"line":1004},[164,15034,6955],{"class":352},[164,15036,365],{"class":255},[164,15038,8534],{"class":352},[164,15040,15041],{"class":791}," EntityClass",[164,15043,388],{"class":255},[164,15045,14963],{"class":597},[164,15047,1122],{"class":255},[164,15049,1125],{"class":597},[164,15051,15052],{"class":255},">)",[164,15054,3357],{"class":255},[164,15056,15057],{"class":166,"line":1010},[164,15058,343],{"emptyLinePlaceholder":342},[164,15060,15061,15063,15065,15067,15069,15071,15073,15075,15077,15079,15081,15083,15085],{"class":166,"line":1466},[164,15062,1389],{"class":384},[164,15064,365],{"class":255},[164,15066,877],{"class":791},[164,15068,388],{"class":255},[164,15070,11692],{"class":597},[164,15072,1122],{"class":255},[164,15074,1125],{"class":597},[164,15076,263],{"class":255},[164,15078,10355],{"class":255},[164,15080,14841],{"class":597},[164,15082,12367],{"class":255},[164,15084,1895],{"class":597},[164,15086,378],{"class":255},[164,15088,15089,15091,15093,15095,15098,15100,15102],{"class":166,"line":1495},[164,15090,1768],{"class":251},[164,15092,729],{"class":255},[164,15094,7066],{"class":255},[164,15096,15097],{"class":362},"EntityClass",[164,15099,365],{"class":384},[164,15101,877],{"class":259},[164,15103,532],{"class":384},[164,15105,15106],{"class":166,"line":1505},[164,15107,1260],{"class":255},[164,15109,15110],{"class":166,"line":5434},[164,15111,343],{"emptyLinePlaceholder":342},[164,15113,15114,15117,15119,15122,15124,15126,15128,15130,15132,15134,15136,15138,15140,15142,15144,15146],{"class":166,"line":5454},[164,15115,15116],{"class":384}," createMany",[164,15118,365],{"class":255},[164,15120,15121],{"class":791},"dataArray",[164,15123,388],{"class":255},[164,15125,11692],{"class":597},[164,15127,1122],{"class":255},[164,15129,1125],{"class":597},[164,15131,263],{"class":255},[164,15133,10355],{"class":255},[164,15135,14841],{"class":597},[164,15137,1160],{"class":255},[164,15139,1325],{"class":259},[164,15141,1150],{"class":255},[164,15143,1895],{"class":597},[164,15145,14506],{"class":259},[164,15147,906],{"class":255},[164,15149,15150,15152,15155,15157,15160,15162,15164,15166,15168,15170,15172,15174,15176,15178],{"class":166,"line":5468},[164,15151,1768],{"class":251},[164,15153,15154],{"class":259}," dataArray",[164,15156,405],{"class":255},[164,15158,15159],{"class":362},"map",[164,15161,365],{"class":384},[164,15163,365],{"class":255},[164,15165,877],{"class":791},[164,15167,402],{"class":255},[164,15169,797],{"class":352},[164,15171,7066],{"class":255},[164,15173,3912],{"class":362},[164,15175,365],{"class":384},[164,15177,877],{"class":259},[164,15179,15180],{"class":384},"))\n",[164,15182,15183],{"class":166,"line":5482},[164,15184,1260],{"class":255},[164,15186,15187],{"class":166,"line":5496},[164,15188,1281],{"class":255},[164,15190,15191],{"class":166,"line":5511},[164,15192,343],{"emptyLinePlaceholder":342},[164,15194,15195],{"class":166,"line":8828},[164,15196,15197],{"class":170},"// Implementation\n",[164,15199,15200,15202,15205,15208,15210],{"class":166,"line":9970},[164,15201,13881],{"class":352},[164,15203,15204],{"class":597}," UserEntity",[164,15206,15207],{"class":352}," implements",[164,15209,598],{"class":597},[164,15211,378],{"class":255},[164,15213,15214,15216,15218],{"class":166,"line":12654},[164,15215,385],{"class":384},[164,15217,388],{"class":255},[164,15219,3389],{"class":597},[164,15221,15222,15224,15226],{"class":166,"line":12661},[164,15223,493],{"class":384},[164,15225,388],{"class":255},[164,15227,14860],{"class":597},[164,15229,15230,15232,15234],{"class":166,"line":12688},[164,15231,8239],{"class":384},[164,15233,388],{"class":255},[164,15235,14860],{"class":597},[164,15237,15238,15240,15242],{"class":166,"line":12703},[164,15239,464],{"class":384},[164,15241,388],{"class":255},[164,15243,3389],{"class":597},[164,15245,15246,15248,15250],{"class":166,"line":14204},[164,15247,427],{"class":384},[164,15249,388],{"class":255},[164,15251,3389],{"class":597},[164,15253,15254],{"class":166,"line":14244},[164,15255,343],{"emptyLinePlaceholder":342},[164,15257,15258,15260,15262,15264,15266,15268,15270,15272,15274,15276,15278,15280],{"class":166,"line":14260},[164,15259,6955],{"class":352},[164,15261,365],{"class":255},[164,15263,877],{"class":791},[164,15265,388],{"class":255},[164,15267,11692],{"class":597},[164,15269,1122],{"class":255},[164,15271,1724],{"class":597},[164,15273,263],{"class":255},[164,15275,10355],{"class":255},[164,15277,14841],{"class":597},[164,15279,15052],{"class":255},[164,15281,378],{"class":255},[164,15283,15284,15286,15288,15290,15293],{"class":166,"line":14271},[164,15285,7024],{"class":255},[164,15287,397],{"class":259},[164,15289,601],{"class":255},[164,15291,15292],{"class":362}," generateId",[164,15294,734],{"class":384},[164,15296,15297,15299,15302,15304,15306,15308],{"class":166,"line":14276},[164,15298,7024],{"class":255},[164,15300,15301],{"class":259},"createdAt",[164,15303,601],{"class":255},[164,15305,729],{"class":255},[164,15307,948],{"class":362},[164,15309,734],{"class":384},[164,15311,15312,15314,15317,15319,15321,15323],{"class":166,"line":14281},[164,15313,7024],{"class":255},[164,15315,15316],{"class":259},"updatedAt",[164,15318,601],{"class":255},[164,15320,729],{"class":255},[164,15322,948],{"class":362},[164,15324,734],{"class":384},[164,15326,15327,15329,15331,15333,15335,15337],{"class":166,"line":14288},[164,15328,7024],{"class":255},[164,15330,475],{"class":259},[164,15332,601],{"class":255},[164,15334,807],{"class":259},[164,15336,405],{"class":255},[164,15338,15339],{"class":259},"name\n",[164,15341,15342,15344,15346,15348,15350,15352],{"class":166,"line":14300},[164,15343,7024],{"class":255},[164,15345,438],{"class":259},[164,15347,601],{"class":255},[164,15349,807],{"class":259},[164,15351,405],{"class":255},[164,15353,15354],{"class":259},"email\n",[164,15356,15357],{"class":166,"line":14340},[164,15358,1260],{"class":255},[164,15360,15361],{"class":166,"line":14356},[164,15362,1281],{"class":255},[164,15364,15365],{"class":166,"line":14367},[164,15366,343],{"emptyLinePlaceholder":342},[164,15368,15369],{"class":166,"line":14372},[164,15370,11466],{"class":170},[164,15372,15373,15375,15378,15380,15382,15384],{"class":166,"line":14377},[164,15374,721],{"class":352},[164,15376,15377],{"class":259}," userFactory ",[164,15379,359],{"class":255},[164,15381,729],{"class":255},[164,15383,15018],{"class":362},[164,15385,15386],{"class":259},"(UserEntity)\n",[164,15388,15389,15391,15393,15395,15398,15400,15402,15404,15406,15408,15410,15412,15415,15417,15419,15421,15423,15425,15428,15430,15432],{"class":166,"line":14396},[164,15390,721],{"class":352},[164,15392,8966],{"class":259},[164,15394,359],{"class":255},[164,15396,15397],{"class":259}," userFactory",[164,15399,405],{"class":255},[164,15401,3912],{"class":362},[164,15403,365],{"class":259},[164,15405,2710],{"class":255},[164,15407,4626],{"class":384},[164,15409,388],{"class":255},[164,15411,285],{"class":255},[164,15413,15414],{"class":288},"John",[164,15416,368],{"class":255},[164,15418,263],{"class":255},[164,15420,13225],{"class":384},[164,15422,388],{"class":255},[164,15424,285],{"class":255},[164,15426,15427],{"class":288},"john@example.com",[164,15429,368],{"class":255},[164,15431,279],{"class":255},[164,15433,532],{"class":259},[149,15435,15437],{"id":15436},"observer-pattern-with-type-safety","Observer Pattern with Type Safety",[154,15439,15441],{"className":156,"code":15440,"language":158,"meta":159,"style":159},"// Type-safe observer pattern\ntype EventMap = {\n userCreated: { user: User }\n userUpdated: { user: User; changes: Partial }\n userDeleted: { userId: string }\n}\n\ntype EventListener = (data: T) => void | Promise\n\nclass TypedEventEmitter> {\n private listeners: {\n [K in keyof T]?: EventListener[]\n } = {}\n\n on(event: K, listener: EventListener): void {\n if (!this.listeners[event]) {\n this.listeners[event] = []\n }\n this.listeners[event]!.push(listener)\n }\n\n off(event: K, listener: EventListener): void {\n const eventListeners = this.listeners[event]\n if (eventListeners) {\n const index = eventListeners.indexOf(listener)\n if (index > -1) {\n eventListeners.splice(index, 1)\n }\n }\n }\n\n emit(event: K, data: T[K]): void {\n const eventListeners = this.listeners[event]\n if (eventListeners) {\n eventListeners.forEach((listener) => listener(data))\n }\n }\n}\n\n// Usage\nconst eventEmitter = new TypedEventEmitter()\n\neventEmitter.on(\"userCreated\", ({ user }) => {\n console.log(`User created: ${user.name}`)\n})\n\neventEmitter.on(\"userUpdated\", ({ user, changes }) => {\n console.log(`User ${user.name} updated:`, changes)\n})\n\n// Type-safe emission\neventEmitter.emit(\"userCreated\", { user: newUser })\neventEmitter.emit(\"userUpdated\", {\n user: updatedUser,\n changes: { name: \"New Name\" },\n})\n",[161,15442,15443,15448,15459,15476,15508,15526,15530,15534,15574,15578,15605,15616,15648,15656,15660,15709,15730,15748,15752,15777,15781,15785,15832,15851,15864,15886,15907,15928,15932,15936,15940,15944,15987,16005,16017,16045,16049,16053,16057,16061,16065,16087,16091,16122,16150,16156,16160,16193,16229,16235,16239,16244,16276,16296,16308,16330],{"__ignoreMap":159},[164,15444,15445],{"class":166,"line":167},[164,15446,15447],{"class":170},"// Type-safe observer pattern\n",[164,15449,15450,15452,15455,15457],{"class":166,"line":174},[164,15451,1094],{"class":352},[164,15453,15454],{"class":597}," EventMap",[164,15456,601],{"class":255},[164,15458,378],{"class":255},[164,15460,15461,15464,15466,15468,15470,15472,15474],{"class":166,"line":16},[164,15462,15463],{"class":384}," userCreated",[164,15465,388],{"class":255},[164,15467,256],{"class":255},[164,15469,848],{"class":384},[164,15471,388],{"class":255},[164,15473,598],{"class":597},[164,15475,4151],{"class":255},[164,15477,15478,15481,15483,15485,15487,15489,15491,15493,15496,15498,15500,15502,15504,15506],{"class":166,"line":185},[164,15479,15480],{"class":384}," userUpdated",[164,15482,388],{"class":255},[164,15484,256],{"class":255},[164,15486,848],{"class":384},[164,15488,388],{"class":255},[164,15490,598],{"class":597},[164,15492,4623],{"class":255},[164,15494,15495],{"class":384}," changes",[164,15497,388],{"class":255},[164,15499,11707],{"class":597},[164,15501,1122],{"class":255},[164,15503,1724],{"class":597},[164,15505,1160],{"class":255},[164,15507,4151],{"class":255},[164,15509,15510,15513,15515,15517,15520,15522,15524],{"class":166,"line":191},[164,15511,15512],{"class":384}," userDeleted",[164,15514,388],{"class":255},[164,15516,256],{"class":255},[164,15518,15519],{"class":384}," userId",[164,15521,388],{"class":255},[164,15523,1136],{"class":597},[164,15525,4151],{"class":255},[164,15527,15528],{"class":166,"line":346},[164,15529,1281],{"class":255},[164,15531,15532],{"class":166,"line":381},[164,15533,343],{"emptyLinePlaceholder":342},[164,15535,15536,15538,15541,15543,15545,15547,15549,15551,15553,15555,15557,15559,15561,15564,15566,15568,15570,15572],{"class":166,"line":424},[164,15537,1094],{"class":352},[164,15539,15540],{"class":597}," EventListener",[164,15542,1122],{"class":255},[164,15544,1125],{"class":597},[164,15546,1160],{"class":255},[164,15548,601],{"class":255},[164,15550,788],{"class":255},[164,15552,877],{"class":791},[164,15554,388],{"class":255},[164,15556,1895],{"class":597},[164,15558,402],{"class":255},[164,15560,797],{"class":352},[164,15562,15563],{"class":597}," void",[164,15565,4561],{"class":255},[164,15567,1153],{"class":597},[164,15569,1122],{"class":255},[164,15571,8078],{"class":597},[164,15573,1540],{"class":255},[164,15575,15576],{"class":166,"line":461},[164,15577,343],{"emptyLinePlaceholder":342},[164,15579,15580,15582,15585,15587,15589,15591,15593,15595,15597,15599,15601,15603],{"class":166,"line":490},[164,15581,13881],{"class":352},[164,15583,15584],{"class":597}," TypedEventEmitter",[164,15586,1122],{"class":255},[164,15588,1125],{"class":597},[164,15590,1878],{"class":352},[164,15592,13385],{"class":597},[164,15594,1122],{"class":255},[164,15596,1953],{"class":597},[164,15598,263],{"class":255},[164,15600,10229],{"class":597},[164,15602,13154],{"class":255},[164,15604,378],{"class":255},[164,15606,15607,15609,15612,15614],{"class":166,"line":526},[164,15608,13891],{"class":352},[164,15610,15611],{"class":384}," listeners",[164,15613,388],{"class":255},[164,15615,378],{"class":255},[164,15617,15618,15620,15622,15624,15626,15628,15630,15632,15634,15636,15638,15640,15642,15644,15646],{"class":166,"line":535},[164,15619,12216],{"class":259},[164,15621,11432],{"class":597},[164,15623,10352],{"class":255},[164,15625,10355],{"class":255},[164,15627,1895],{"class":597},[164,15629,925],{"class":259},[164,15631,1144],{"class":255},[164,15633,15540],{"class":597},[164,15635,1122],{"class":255},[164,15637,1125],{"class":597},[164,15639,918],{"class":259},[164,15641,11432],{"class":597},[164,15643,925],{"class":259},[164,15645,1160],{"class":255},[164,15647,12509],{"class":259},[164,15649,15650,15652,15654],{"class":166,"line":29},[164,15651,987],{"class":255},[164,15653,601],{"class":255},[164,15655,3357],{"class":255},[164,15657,15658],{"class":166,"line":545},[164,15659,343],{"emptyLinePlaceholder":342},[164,15661,15662,15665,15667,15669,15671,15673,15675,15677,15680,15682,15684,15686,15689,15691,15693,15695,15697,15699,15701,15703,15705,15707],{"class":166,"line":562},[164,15663,15664],{"class":384}," on",[164,15666,1122],{"class":255},[164,15668,11432],{"class":597},[164,15670,1878],{"class":352},[164,15672,10355],{"class":255},[164,15674,1895],{"class":597},[164,15676,1128],{"class":255},[164,15678,15679],{"class":791},"event",[164,15681,388],{"class":255},[164,15683,11679],{"class":597},[164,15685,263],{"class":255},[164,15687,15688],{"class":791}," listener",[164,15690,388],{"class":255},[164,15692,15540],{"class":597},[164,15694,1122],{"class":255},[164,15696,1125],{"class":597},[164,15698,918],{"class":259},[164,15700,11432],{"class":597},[164,15702,925],{"class":259},[164,15704,12367],{"class":255},[164,15706,15563],{"class":597},[164,15708,378],{"class":255},[164,15710,15711,15713,15715,15718,15721,15723,15725,15728],{"class":166,"line":578},[164,15712,2898],{"class":251},[164,15714,788],{"class":384},[164,15716,15717],{"class":255},"!this.",[164,15719,15720],{"class":259},"listeners",[164,15722,918],{"class":384},[164,15724,15679],{"class":259},[164,15726,15727],{"class":384},"]) ",[164,15729,906],{"class":255},[164,15731,15732,15735,15737,15739,15741,15743,15745],{"class":166,"line":583},[164,15733,15734],{"class":255}," this.",[164,15736,15720],{"class":259},[164,15738,918],{"class":384},[164,15740,15679],{"class":259},[164,15742,10370],{"class":384},[164,15744,359],{"class":255},[164,15746,15747],{"class":384}," []\n",[164,15749,15750],{"class":166,"line":589},[164,15751,1743],{"class":255},[164,15753,15754,15756,15758,15760,15762,15764,15767,15770,15772,15775],{"class":166,"line":615},[164,15755,7024],{"class":255},[164,15757,15720],{"class":259},[164,15759,918],{"class":384},[164,15761,15679],{"class":259},[164,15763,925],{"class":384},[164,15765,15766],{"class":255},"!.",[164,15768,15769],{"class":362},"push",[164,15771,365],{"class":384},[164,15773,15774],{"class":259},"listener",[164,15776,532],{"class":384},[164,15778,15779],{"class":166,"line":978},[164,15780,1260],{"class":255},[164,15782,15783],{"class":166,"line":984},[164,15784,343],{"emptyLinePlaceholder":342},[164,15786,15787,15790,15792,15794,15796,15798,15800,15802,15804,15806,15808,15810,15812,15814,15816,15818,15820,15822,15824,15826,15828,15830],{"class":166,"line":992},[164,15788,15789],{"class":384}," off",[164,15791,1122],{"class":255},[164,15793,11432],{"class":597},[164,15795,1878],{"class":352},[164,15797,10355],{"class":255},[164,15799,1895],{"class":597},[164,15801,1128],{"class":255},[164,15803,15679],{"class":791},[164,15805,388],{"class":255},[164,15807,11679],{"class":597},[164,15809,263],{"class":255},[164,15811,15688],{"class":791},[164,15813,388],{"class":255},[164,15815,15540],{"class":597},[164,15817,1122],{"class":255},[164,15819,1125],{"class":597},[164,15821,918],{"class":259},[164,15823,11432],{"class":597},[164,15825,925],{"class":259},[164,15827,12367],{"class":255},[164,15829,15563],{"class":597},[164,15831,378],{"class":255},[164,15833,15834,15836,15839,15841,15843,15845,15847,15849],{"class":166,"line":999},[164,15835,2757],{"class":352},[164,15837,15838],{"class":259}," eventListeners",[164,15840,601],{"class":255},[164,15842,7066],{"class":255},[164,15844,15720],{"class":259},[164,15846,918],{"class":384},[164,15848,15679],{"class":259},[164,15850,6542],{"class":384},[164,15852,15853,15855,15857,15860,15862],{"class":166,"line":1004},[164,15854,2898],{"class":251},[164,15856,788],{"class":384},[164,15858,15859],{"class":259},"eventListeners",[164,15861,1223],{"class":384},[164,15863,906],{"class":255},[164,15865,15866,15868,15871,15873,15875,15877,15880,15882,15884],{"class":166,"line":1010},[164,15867,8596],{"class":352},[164,15869,15870],{"class":259}," index",[164,15872,601],{"class":255},[164,15874,15838],{"class":259},[164,15876,405],{"class":255},[164,15878,15879],{"class":362},"indexOf",[164,15881,365],{"class":384},[164,15883,15774],{"class":259},[164,15885,532],{"class":384},[164,15887,15888,15890,15892,15895,15898,15901,15903,15905],{"class":166,"line":1466},[164,15889,8723],{"class":251},[164,15891,788],{"class":384},[164,15893,15894],{"class":259},"index",[164,15896,15897],{"class":255}," >",[164,15899,15900],{"class":255}," -",[164,15902,2168],{"class":921},[164,15904,1223],{"class":384},[164,15906,906],{"class":255},[164,15908,15909,15912,15914,15917,15919,15921,15923,15926],{"class":166,"line":1495},[164,15910,15911],{"class":259}," eventListeners",[164,15913,405],{"class":255},[164,15915,15916],{"class":362},"splice",[164,15918,365],{"class":384},[164,15920,15894],{"class":259},[164,15922,263],{"class":255},[164,15924,15925],{"class":921}," 1",[164,15927,532],{"class":384},[164,15929,15930],{"class":166,"line":1505},[164,15931,8817],{"class":255},[164,15933,15934],{"class":166,"line":5434},[164,15935,1743],{"class":255},[164,15937,15938],{"class":166,"line":5454},[164,15939,1260],{"class":255},[164,15941,15942],{"class":166,"line":5468},[164,15943,343],{"emptyLinePlaceholder":342},[164,15945,15946,15949,15951,15953,15955,15957,15959,15961,15963,15965,15967,15969,15971,15973,15975,15977,15979,15981,15983,15985],{"class":166,"line":5482},[164,15947,15948],{"class":384}," emit",[164,15950,1122],{"class":255},[164,15952,11432],{"class":597},[164,15954,1878],{"class":352},[164,15956,10355],{"class":255},[164,15958,1895],{"class":597},[164,15960,1128],{"class":255},[164,15962,15679],{"class":791},[164,15964,388],{"class":255},[164,15966,11679],{"class":597},[164,15968,263],{"class":255},[164,15970,807],{"class":791},[164,15972,388],{"class":255},[164,15974,1895],{"class":597},[164,15976,918],{"class":259},[164,15978,11432],{"class":597},[164,15980,925],{"class":259},[164,15982,1150],{"class":255},[164,15984,15563],{"class":597},[164,15986,378],{"class":255},[164,15988,15989,15991,15993,15995,15997,15999,16001,16003],{"class":166,"line":5496},[164,15990,2757],{"class":352},[164,15992,15838],{"class":259},[164,15994,601],{"class":255},[164,15996,7066],{"class":255},[164,15998,15720],{"class":259},[164,16000,918],{"class":384},[164,16002,15679],{"class":259},[164,16004,6542],{"class":384},[164,16006,16007,16009,16011,16013,16015],{"class":166,"line":5511},[164,16008,2898],{"class":251},[164,16010,788],{"class":384},[164,16012,15859],{"class":259},[164,16014,1223],{"class":384},[164,16016,906],{"class":255},[164,16018,16019,16022,16024,16027,16029,16031,16033,16035,16037,16039,16041,16043],{"class":166,"line":8828},[164,16020,16021],{"class":259}," eventListeners",[164,16023,405],{"class":255},[164,16025,16026],{"class":362},"forEach",[164,16028,365],{"class":384},[164,16030,365],{"class":255},[164,16032,15774],{"class":791},[164,16034,402],{"class":255},[164,16036,797],{"class":352},[164,16038,15688],{"class":362},[164,16040,365],{"class":384},[164,16042,877],{"class":259},[164,16044,15180],{"class":384},[164,16046,16047],{"class":166,"line":9970},[164,16048,1743],{"class":255},[164,16050,16051],{"class":166,"line":12654},[164,16052,1260],{"class":255},[164,16054,16055],{"class":166,"line":12661},[164,16056,1281],{"class":255},[164,16058,16059],{"class":166,"line":12688},[164,16060,343],{"emptyLinePlaceholder":342},[164,16062,16063],{"class":166,"line":12703},[164,16064,11466],{"class":170},[164,16066,16067,16069,16072,16074,16076,16078,16080,16083,16085],{"class":166,"line":14204},[164,16068,721],{"class":352},[164,16070,16071],{"class":259}," eventEmitter ",[164,16073,359],{"class":255},[164,16075,729],{"class":255},[164,16077,15584],{"class":362},[164,16079,1122],{"class":255},[164,16081,16082],{"class":597},"EventMap",[164,16084,1160],{"class":255},[164,16086,734],{"class":259},[164,16088,16089],{"class":166,"line":14244},[164,16090,343],{"emptyLinePlaceholder":342},[164,16092,16093,16096,16098,16100,16102,16104,16107,16109,16111,16114,16116,16118,16120],{"class":166,"line":14260},[164,16094,16095],{"class":259},"eventEmitter",[164,16097,405],{"class":255},[164,16099,5192],{"class":362},[164,16101,365],{"class":259},[164,16103,368],{"class":255},[164,16105,16106],{"class":288},"userCreated",[164,16108,368],{"class":255},[164,16110,263],{"class":255},[164,16112,16113],{"class":255}," ({",[164,16115,848],{"class":791},[164,16117,1761],{"class":255},[164,16119,797],{"class":352},[164,16121,378],{"class":255},[164,16123,16124,16126,16128,16131,16133,16135,16138,16140,16142,16144,16146,16148],{"class":166,"line":14271},[164,16125,7491],{"class":259},[164,16127,405],{"class":255},[164,16129,16130],{"class":362},"log",[164,16132,365],{"class":384},[164,16134,1181],{"class":255},[164,16136,16137],{"class":288},"User created: ",[164,16139,1187],{"class":255},[164,16141,7857],{"class":259},[164,16143,405],{"class":255},[164,16145,475],{"class":259},[164,16147,1192],{"class":255},[164,16149,532],{"class":384},[164,16151,16152,16154],{"class":166,"line":14276},[164,16153,529],{"class":255},[164,16155,532],{"class":259},[164,16157,16158],{"class":166,"line":14281},[164,16159,343],{"emptyLinePlaceholder":342},[164,16161,16162,16164,16166,16168,16170,16172,16175,16177,16179,16181,16183,16185,16187,16189,16191],{"class":166,"line":14288},[164,16163,16095],{"class":259},[164,16165,405],{"class":255},[164,16167,5192],{"class":362},[164,16169,365],{"class":259},[164,16171,368],{"class":255},[164,16173,16174],{"class":288},"userUpdated",[164,16176,368],{"class":255},[164,16178,263],{"class":255},[164,16180,16113],{"class":255},[164,16182,848],{"class":791},[164,16184,263],{"class":255},[164,16186,15495],{"class":791},[164,16188,1761],{"class":255},[164,16190,797],{"class":352},[164,16192,378],{"class":255},[164,16194,16195,16197,16199,16201,16203,16205,16208,16210,16212,16214,16216,16218,16221,16223,16225,16227],{"class":166,"line":14300},[164,16196,7491],{"class":259},[164,16198,405],{"class":255},[164,16200,16130],{"class":362},[164,16202,365],{"class":384},[164,16204,1181],{"class":255},[164,16206,16207],{"class":288},"User ",[164,16209,1187],{"class":255},[164,16211,7857],{"class":259},[164,16213,405],{"class":255},[164,16215,475],{"class":259},[164,16217,529],{"class":255},[164,16219,16220],{"class":288}," updated:",[164,16222,1181],{"class":255},[164,16224,263],{"class":255},[164,16226,15495],{"class":259},[164,16228,532],{"class":384},[164,16230,16231,16233],{"class":166,"line":14340},[164,16232,529],{"class":255},[164,16234,532],{"class":259},[164,16236,16237],{"class":166,"line":14356},[164,16238,343],{"emptyLinePlaceholder":342},[164,16240,16241],{"class":166,"line":14367},[164,16242,16243],{"class":170},"// Type-safe emission\n",[164,16245,16246,16248,16250,16253,16255,16257,16259,16261,16263,16265,16267,16269,16272,16274],{"class":166,"line":14372},[164,16247,16095],{"class":259},[164,16249,405],{"class":255},[164,16251,16252],{"class":362},"emit",[164,16254,365],{"class":259},[164,16256,368],{"class":255},[164,16258,16106],{"class":288},[164,16260,368],{"class":255},[164,16262,263],{"class":255},[164,16264,256],{"class":255},[164,16266,848],{"class":384},[164,16268,388],{"class":255},[164,16270,16271],{"class":259}," newUser ",[164,16273,529],{"class":255},[164,16275,532],{"class":259},[164,16277,16278,16280,16282,16284,16286,16288,16290,16292,16294],{"class":166,"line":14377},[164,16279,16095],{"class":259},[164,16281,405],{"class":255},[164,16283,16252],{"class":362},[164,16285,365],{"class":259},[164,16287,368],{"class":255},[164,16289,16174],{"class":288},[164,16291,368],{"class":255},[164,16293,263],{"class":255},[164,16295,378],{"class":255},[164,16297,16298,16301,16303,16306],{"class":166,"line":14396},[164,16299,16300],{"class":384}," user",[164,16302,388],{"class":255},[164,16304,16305],{"class":259}," updatedUser",[164,16307,421],{"class":255},[164,16309,16310,16313,16315,16317,16319,16321,16323,16326,16328],{"class":166,"line":14412},[164,16311,16312],{"class":384}," changes",[164,16314,388],{"class":255},[164,16316,256],{"class":255},[164,16318,4626],{"class":384},[164,16320,388],{"class":255},[164,16322,285],{"class":255},[164,16324,16325],{"class":288},"New Name",[164,16327,368],{"class":255},[164,16329,1492],{"class":255},[164,16331,16332,16334],{"class":166,"line":14420},[164,16333,529],{"class":255},[164,16335,532],{"class":259},[98,16337,16339],{"id":16338},"advanced-generic-patterns","Advanced Generic Patterns",[149,16341,16343],{"id":16342},"variance-and-generic-constraints","Variance and Generic Constraints",[154,16345,16347],{"className":156,"code":16346,"language":158,"meta":159,"style":159},"// Covariance and contravariance\ninterface Producer {\n produce(): T\n}\n\ninterface Consumer {\n consume(item: T): void\n}\n\ninterface Processor {\n process(input: T): T\n}\n\n// Generic constraints with multiple bounds\ninterface Identifiable {\n id: string\n}\n\ninterface Timestamped {\n createdAt: Date\n updatedAt: Date\n}\n\nfunction processEntity(\n entity: T,\n processor: (item: T) => T,\n): T {\n const processed = processor(entity)\n return {\n ...processed,\n updatedAt: new Date(),\n }\n}\n\n// Conditional generic constraints\ntype ApiEndpoint = T extends { id: infer ID }\n ? {\n get: (id: ID) => Promise\n update: (id: ID, data: Partial) => Promise\n delete: (id: ID) => Promise\n }\n : {\n create: (data: T) => Promise\n list: () => Promise\n }\n\ntype UserEndpoint = ApiEndpoint // Has get, update, delete methods\ntype CreateUserEndpoint = ApiEndpoint> // Has create, list methods\n",[161,16348,16349,16354,16372,16381,16385,16389,16406,16424,16428,16432,16447,16465,16469,16473,16478,16487,16495,16499,16503,16512,16520,16528,16532,16536,16557,16568,16591,16599,16618,16624,16633,16648,16652,16656,16660,16665,16696,16702,16729,16768,16795,16799,16805,16842,16863,16867,16871,16891],{"__ignoreMap":159},[164,16350,16351],{"class":166,"line":167},[164,16352,16353],{"class":170},"// Covariance and contravariance\n",[164,16355,16356,16358,16361,16363,16366,16368,16370],{"class":166,"line":174},[164,16357,3376],{"class":352},[164,16359,16360],{"class":597}," Producer",[164,16362,1122],{"class":255},[164,16364,16365],{"class":352},"out",[164,16367,1895],{"class":597},[164,16369,1160],{"class":255},[164,16371,378],{"class":255},[164,16373,16374,16377,16379],{"class":166,"line":16},[164,16375,16376],{"class":384}," produce",[164,16378,12434],{"class":255},[164,16380,4527],{"class":597},[164,16382,16383],{"class":166,"line":185},[164,16384,1281],{"class":255},[164,16386,16387],{"class":166,"line":191},[164,16388,343],{"emptyLinePlaceholder":342},[164,16390,16391,16393,16396,16398,16400,16402,16404],{"class":166,"line":346},[164,16392,3376],{"class":352},[164,16394,16395],{"class":597}," Consumer",[164,16397,1122],{"class":255},[164,16399,12161],{"class":352},[164,16401,1895],{"class":597},[164,16403,1160],{"class":255},[164,16405,378],{"class":255},[164,16407,16408,16411,16413,16416,16418,16420,16422],{"class":166,"line":381},[164,16409,16410],{"class":384}," consume",[164,16412,365],{"class":255},[164,16414,16415],{"class":791},"item",[164,16417,388],{"class":255},[164,16419,1895],{"class":597},[164,16421,1150],{"class":255},[164,16423,10536],{"class":597},[164,16425,16426],{"class":166,"line":424},[164,16427,1281],{"class":255},[164,16429,16430],{"class":166,"line":461},[164,16431,343],{"emptyLinePlaceholder":342},[164,16433,16434,16436,16439,16441,16443,16445],{"class":166,"line":490},[164,16435,3376],{"class":352},[164,16437,16438],{"class":597}," Processor",[164,16440,1122],{"class":255},[164,16442,1125],{"class":597},[164,16444,1160],{"class":255},[164,16446,378],{"class":255},[164,16448,16449,16452,16454,16457,16459,16461,16463],{"class":166,"line":526},[164,16450,16451],{"class":384}," process",[164,16453,365],{"class":255},[164,16455,16456],{"class":791},"input",[164,16458,388],{"class":255},[164,16460,1895],{"class":597},[164,16462,1150],{"class":255},[164,16464,4527],{"class":597},[164,16466,16467],{"class":166,"line":535},[164,16468,1281],{"class":255},[164,16470,16471],{"class":166,"line":29},[164,16472,343],{"emptyLinePlaceholder":342},[164,16474,16475],{"class":166,"line":545},[164,16476,16477],{"class":170},"// Generic constraints with multiple bounds\n",[164,16479,16480,16482,16485],{"class":166,"line":562},[164,16481,3376],{"class":352},[164,16483,16484],{"class":597}," Identifiable",[164,16486,378],{"class":255},[164,16488,16489,16491,16493],{"class":166,"line":578},[164,16490,385],{"class":384},[164,16492,388],{"class":255},[164,16494,3389],{"class":597},[164,16496,16497],{"class":166,"line":583},[164,16498,1281],{"class":255},[164,16500,16501],{"class":166,"line":589},[164,16502,343],{"emptyLinePlaceholder":342},[164,16504,16505,16507,16510],{"class":166,"line":615},[164,16506,3376],{"class":352},[164,16508,16509],{"class":597}," Timestamped",[164,16511,378],{"class":255},[164,16513,16514,16516,16518],{"class":166,"line":978},[164,16515,493],{"class":384},[164,16517,388],{"class":255},[164,16519,14860],{"class":597},[164,16521,16522,16524,16526],{"class":166,"line":984},[164,16523,8239],{"class":384},[164,16525,388],{"class":255},[164,16527,14860],{"class":597},[164,16529,16530],{"class":166,"line":992},[164,16531,1281],{"class":255},[164,16533,16534],{"class":166,"line":999},[164,16535,343],{"emptyLinePlaceholder":342},[164,16537,16538,16540,16543,16545,16547,16549,16551,16553,16555],{"class":166,"line":1004},[164,16539,3410],{"class":352},[164,16541,16542],{"class":362}," processEntity",[164,16544,1122],{"class":255},[164,16546,1125],{"class":597},[164,16548,1878],{"class":352},[164,16550,16484],{"class":597},[164,16552,3354],{"class":255},[164,16554,16509],{"class":597},[164,16556,11568],{"class":255},[164,16558,16559,16562,16564,16566],{"class":166,"line":1010},[164,16560,16561],{"class":791}," entity",[164,16563,388],{"class":255},[164,16565,1895],{"class":597},[164,16567,421],{"class":255},[164,16569,16570,16573,16575,16577,16579,16581,16583,16585,16587,16589],{"class":166,"line":1466},[164,16571,16572],{"class":362}," processor",[164,16574,388],{"class":255},[164,16576,788],{"class":255},[164,16578,16415],{"class":791},[164,16580,388],{"class":255},[164,16582,1895],{"class":597},[164,16584,402],{"class":255},[164,16586,797],{"class":352},[164,16588,1895],{"class":597},[164,16590,421],{"class":255},[164,16592,16593,16595,16597],{"class":166,"line":1495},[164,16594,1150],{"class":255},[164,16596,1895],{"class":597},[164,16598,378],{"class":255},[164,16600,16601,16603,16606,16608,16611,16613,16616],{"class":166,"line":1505},[164,16602,804],{"class":352},[164,16604,16605],{"class":259}," processed",[164,16607,601],{"class":255},[164,16609,16610],{"class":362}," processor",[164,16612,365],{"class":384},[164,16614,16615],{"class":259},"entity",[164,16617,532],{"class":384},[164,16619,16620,16622],{"class":166,"line":5434},[164,16621,895],{"class":251},[164,16623,378],{"class":255},[164,16625,16626,16628,16631],{"class":166,"line":5454},[164,16627,9373],{"class":255},[164,16629,16630],{"class":259},"processed",[164,16632,421],{"class":255},[164,16634,16635,16638,16640,16642,16644,16646],{"class":166,"line":5468},[164,16636,16637],{"class":384}," updatedAt",[164,16639,388],{"class":255},[164,16641,729],{"class":255},[164,16643,948],{"class":362},[164,16645,411],{"class":384},[164,16647,421],{"class":255},[164,16649,16650],{"class":166,"line":5482},[164,16651,1260],{"class":255},[164,16653,16654],{"class":166,"line":5496},[164,16655,1281],{"class":255},[164,16657,16658],{"class":166,"line":5511},[164,16659,343],{"emptyLinePlaceholder":342},[164,16661,16662],{"class":166,"line":8828},[164,16663,16664],{"class":170},"// Conditional generic constraints\n",[164,16666,16667,16669,16671,16673,16675,16677,16679,16681,16683,16685,16687,16689,16691,16694],{"class":166,"line":9970},[164,16668,1094],{"class":352},[164,16670,10857],{"class":597},[164,16672,1122],{"class":255},[164,16674,1125],{"class":597},[164,16676,1160],{"class":255},[164,16678,601],{"class":255},[164,16680,1895],{"class":597},[164,16682,1878],{"class":352},[164,16684,256],{"class":255},[164,16686,2713],{"class":384},[164,16688,388],{"class":255},[164,16690,10238],{"class":255},[164,16692,16693],{"class":597}," ID",[164,16695,4151],{"class":255},[164,16697,16698,16700],{"class":166,"line":12654},[164,16699,4395],{"class":255},[164,16701,378],{"class":255},[164,16703,16704,16707,16709,16711,16713,16715,16717,16719,16721,16723,16725,16727],{"class":166,"line":12661},[164,16705,16706],{"class":384}," get",[164,16708,388],{"class":255},[164,16710,788],{"class":255},[164,16712,397],{"class":791},[164,16714,388],{"class":255},[164,16716,16693],{"class":597},[164,16718,402],{"class":255},[164,16720,797],{"class":352},[164,16722,1153],{"class":597},[164,16724,1122],{"class":255},[164,16726,1125],{"class":597},[164,16728,1540],{"class":255},[164,16730,16731,16734,16736,16738,16740,16742,16744,16746,16748,16750,16752,16754,16756,16758,16760,16762,16764,16766],{"class":166,"line":12688},[164,16732,16733],{"class":384}," update",[164,16735,388],{"class":255},[164,16737,788],{"class":255},[164,16739,397],{"class":791},[164,16741,388],{"class":255},[164,16743,16693],{"class":597},[164,16745,263],{"class":255},[164,16747,807],{"class":791},[164,16749,388],{"class":255},[164,16751,11707],{"class":597},[164,16753,1122],{"class":255},[164,16755,1125],{"class":597},[164,16757,15052],{"class":255},[164,16759,797],{"class":352},[164,16761,1153],{"class":597},[164,16763,1122],{"class":255},[164,16765,1125],{"class":597},[164,16767,1540],{"class":255},[164,16769,16770,16773,16775,16777,16779,16781,16783,16785,16787,16789,16791,16793],{"class":166,"line":12703},[164,16771,16772],{"class":384}," delete",[164,16774,388],{"class":255},[164,16776,788],{"class":255},[164,16778,397],{"class":791},[164,16780,388],{"class":255},[164,16782,16693],{"class":597},[164,16784,402],{"class":255},[164,16786,797],{"class":352},[164,16788,1153],{"class":597},[164,16790,1122],{"class":255},[164,16792,8078],{"class":597},[164,16794,1540],{"class":255},[164,16796,16797],{"class":166,"line":14204},[164,16798,1743],{"class":255},[164,16800,16801,16803],{"class":166,"line":14244},[164,16802,4403],{"class":255},[164,16804,378],{"class":255},[164,16806,16807,16810,16812,16814,16816,16818,16820,16822,16824,16826,16828,16830,16832,16834,16836,16838,16840],{"class":166,"line":14260},[164,16808,16809],{"class":384}," create",[164,16811,388],{"class":255},[164,16813,788],{"class":255},[164,16815,877],{"class":791},[164,16817,388],{"class":255},[164,16819,1895],{"class":597},[164,16821,402],{"class":255},[164,16823,797],{"class":352},[164,16825,1153],{"class":597},[164,16827,1122],{"class":255},[164,16829,1125],{"class":597},[164,16831,3354],{"class":255},[164,16833,256],{"class":255},[164,16835,2713],{"class":384},[164,16837,388],{"class":255},[164,16839,1136],{"class":597},[164,16841,10692],{"class":255},[164,16843,16844,16847,16849,16851,16853,16855,16857,16859,16861],{"class":166,"line":14271},[164,16845,16846],{"class":384}," list",[164,16848,388],{"class":255},[164,16850,1313],{"class":255},[164,16852,797],{"class":352},[164,16854,1153],{"class":597},[164,16856,1122],{"class":255},[164,16858,1125],{"class":597},[164,16860,1325],{"class":259},[164,16862,1540],{"class":255},[164,16864,16865],{"class":166,"line":14276},[164,16866,1743],{"class":255},[164,16868,16869],{"class":166,"line":14281},[164,16870,343],{"emptyLinePlaceholder":342},[164,16872,16873,16875,16878,16880,16882,16884,16886,16888],{"class":166,"line":14288},[164,16874,1094],{"class":352},[164,16876,16877],{"class":597}," UserEndpoint",[164,16879,601],{"class":255},[164,16881,10857],{"class":597},[164,16883,1122],{"class":255},[164,16885,1724],{"class":597},[164,16887,1160],{"class":255},[164,16889,16890],{"class":170}," // Has get, update, delete methods\n",[164,16892,16893,16895,16898,16900,16902,16904,16907,16909,16911,16913,16915,16917,16919,16921],{"class":166,"line":14300},[164,16894,1094],{"class":352},[164,16896,16897],{"class":597}," CreateUserEndpoint",[164,16899,601],{"class":255},[164,16901,10857],{"class":597},[164,16903,1122],{"class":255},[164,16905,16906],{"class":597},"Omit",[164,16908,1122],{"class":255},[164,16910,1724],{"class":597},[164,16912,263],{"class":255},[164,16914,285],{"class":255},[164,16916,397],{"class":288},[164,16918,368],{"class":255},[164,16920,13154],{"class":255},[164,16922,16923],{"class":170}," // Has create, list methods\n",[149,16925,16927],{"id":16926},"higher-order-type-functions","Higher-Order Type Functions",[154,16929,16931],{"className":156,"code":16930,"language":158,"meta":159,"style":159},"// Type-level functions\ntype Curry = T extends (arg1: infer A, ...rest: infer R) => infer Return\n ? R extends []\n ? (arg1: A) => Return\n : (arg1: A) => Curry<(...rest: R) => Return>\n : never\n\ntype Add = (a: number, b: number, c: number) => number\ntype CurriedAdd = Curry // (a: number) => (b: number) => (c: number) => number\n\n// Compose function types\ntype Compose = F extends (arg: infer A) => infer B\n ? G extends (arg: B) => infer C\n ? (arg: A) => C\n : never\n : never\n\ntype StringToNumber = (s: string) => number\ntype NumberToBoolean = (n: number) => boolean\ntype StringToBoolean = Compose // (s: string) => boolean\n\n// Pipeline type\ntype Pipe = Fns extends readonly [\n (arg: T) => infer U,\n ...infer Rest,\n]\n ? Rest extends readonly any[]\n ? Pipe\n : U\n : T\n\ntype PipelineResult = Pipe<\n string,\n [(s: string) => number, (n: number) => boolean, (b: boolean) => string]\n> // string\n",[161,16932,16933,16938,16992,17002,17020,17056,17062,17066,17106,17127,17131,17136,17180,17206,17224,17230,17236,17240,17264,17288,17313,17317,17322,17358,17379,17389,17393,17407,17424,17431,17437,17441,17454,17461,17514],{"__ignoreMap":159},[164,16934,16935],{"class":166,"line":167},[164,16936,16937],{"class":170},"// Type-level functions\n",[164,16939,16940,16942,16945,16947,16949,16951,16953,16955,16957,16959,16962,16964,16966,16969,16971,16974,16977,16979,16981,16983,16985,16987,16989],{"class":166,"line":174},[164,16941,1094],{"class":352},[164,16943,16944],{"class":597}," Curry",[164,16946,1122],{"class":255},[164,16948,1125],{"class":597},[164,16950,1160],{"class":255},[164,16952,601],{"class":255},[164,16954,1895],{"class":597},[164,16956,1878],{"class":352},[164,16958,788],{"class":255},[164,16960,16961],{"class":791},"arg1",[164,16963,388],{"class":255},[164,16965,10238],{"class":255},[164,16967,16968],{"class":597}," A",[164,16970,263],{"class":255},[164,16972,16973],{"class":255}," ...",[164,16975,16976],{"class":791},"rest",[164,16978,388],{"class":255},[164,16980,10238],{"class":255},[164,16982,10241],{"class":597},[164,16984,402],{"class":255},[164,16986,797],{"class":352},[164,16988,10238],{"class":255},[164,16990,16991],{"class":597}," Return\n",[164,16993,16994,16996,16998,17000],{"class":166,"line":16},[164,16995,4395],{"class":255},[164,16997,10241],{"class":597},[164,16999,1878],{"class":352},[164,17001,15747],{"class":259},[164,17003,17004,17006,17008,17010,17012,17014,17016,17018],{"class":166,"line":185},[164,17005,10381],{"class":255},[164,17007,788],{"class":255},[164,17009,16961],{"class":791},[164,17011,388],{"class":255},[164,17013,16968],{"class":597},[164,17015,402],{"class":255},[164,17017,797],{"class":352},[164,17019,16991],{"class":597},[164,17021,17022,17024,17026,17028,17030,17032,17034,17036,17038,17041,17043,17045,17047,17049,17051,17054],{"class":166,"line":191},[164,17023,10429],{"class":255},[164,17025,788],{"class":255},[164,17027,16961],{"class":791},[164,17029,388],{"class":255},[164,17031,16968],{"class":597},[164,17033,402],{"class":255},[164,17035,797],{"class":352},[164,17037,16944],{"class":597},[164,17039,17040],{"class":255},"<(...",[164,17042,16976],{"class":791},[164,17044,388],{"class":255},[164,17046,10241],{"class":597},[164,17048,402],{"class":255},[164,17050,797],{"class":352},[164,17052,17053],{"class":597}," Return",[164,17055,1540],{"class":255},[164,17057,17058,17060],{"class":166,"line":346},[164,17059,4403],{"class":255},[164,17061,4406],{"class":597},[164,17063,17064],{"class":166,"line":381},[164,17065,343],{"emptyLinePlaceholder":342},[164,17067,17068,17070,17073,17075,17077,17079,17081,17083,17085,17088,17090,17092,17094,17096,17098,17100,17102,17104],{"class":166,"line":424},[164,17069,1094],{"class":352},[164,17071,17072],{"class":597}," Add",[164,17074,601],{"class":255},[164,17076,788],{"class":255},[164,17078,4843],{"class":791},[164,17080,388],{"class":255},[164,17082,4388],{"class":597},[164,17084,263],{"class":255},[164,17086,17087],{"class":791}," b",[164,17089,388],{"class":255},[164,17091,4388],{"class":597},[164,17093,263],{"class":255},[164,17095,812],{"class":791},[164,17097,388],{"class":255},[164,17099,4388],{"class":597},[164,17101,402],{"class":255},[164,17103,797],{"class":352},[164,17105,6932],{"class":597},[164,17107,17108,17110,17113,17115,17117,17119,17122,17124],{"class":166,"line":461},[164,17109,1094],{"class":352},[164,17111,17112],{"class":597}," CurriedAdd",[164,17114,601],{"class":255},[164,17116,16944],{"class":597},[164,17118,1122],{"class":255},[164,17120,17121],{"class":597},"Add",[164,17123,1160],{"class":255},[164,17125,17126],{"class":170}," // (a: number) => (b: number) => (c: number) => number\n",[164,17128,17129],{"class":166,"line":490},[164,17130,343],{"emptyLinePlaceholder":342},[164,17132,17133],{"class":166,"line":526},[164,17134,17135],{"class":170},"// Compose function types\n",[164,17137,17138,17140,17143,17145,17147,17149,17152,17154,17156,17158,17160,17162,17165,17167,17169,17171,17173,17175,17177],{"class":166,"line":535},[164,17139,1094],{"class":352},[164,17141,17142],{"class":597}," Compose",[164,17144,1122],{"class":255},[164,17146,11378],{"class":597},[164,17148,263],{"class":255},[164,17150,17151],{"class":597}," G",[164,17153,1160],{"class":255},[164,17155,601],{"class":255},[164,17157,11578],{"class":597},[164,17159,1878],{"class":352},[164,17161,788],{"class":255},[164,17163,17164],{"class":791},"arg",[164,17166,388],{"class":255},[164,17168,10238],{"class":255},[164,17170,16968],{"class":597},[164,17172,402],{"class":255},[164,17174,797],{"class":352},[164,17176,10238],{"class":255},[164,17178,17179],{"class":597}," B\n",[164,17181,17182,17184,17186,17188,17190,17192,17194,17197,17199,17201,17203],{"class":166,"line":29},[164,17183,4395],{"class":255},[164,17185,17151],{"class":597},[164,17187,1878],{"class":352},[164,17189,788],{"class":255},[164,17191,17164],{"class":791},[164,17193,388],{"class":255},[164,17195,17196],{"class":597}," B",[164,17198,402],{"class":255},[164,17200,797],{"class":352},[164,17202,10238],{"class":255},[164,17204,17205],{"class":597}," C\n",[164,17207,17208,17210,17212,17214,17216,17218,17220,17222],{"class":166,"line":545},[164,17209,10381],{"class":255},[164,17211,788],{"class":255},[164,17213,17164],{"class":791},[164,17215,388],{"class":255},[164,17217,16968],{"class":597},[164,17219,402],{"class":255},[164,17221,797],{"class":352},[164,17223,17205],{"class":597},[164,17225,17226,17228],{"class":166,"line":562},[164,17227,10429],{"class":255},[164,17229,4406],{"class":597},[164,17231,17232,17234],{"class":166,"line":578},[164,17233,4403],{"class":255},[164,17235,4406],{"class":597},[164,17237,17238],{"class":166,"line":583},[164,17239,343],{"emptyLinePlaceholder":342},[164,17241,17242,17244,17247,17249,17251,17254,17256,17258,17260,17262],{"class":166,"line":589},[164,17243,1094],{"class":352},[164,17245,17246],{"class":597}," StringToNumber",[164,17248,601],{"class":255},[164,17250,788],{"class":255},[164,17252,17253],{"class":791},"s",[164,17255,388],{"class":255},[164,17257,1136],{"class":597},[164,17259,402],{"class":255},[164,17261,797],{"class":352},[164,17263,6932],{"class":597},[164,17265,17266,17268,17271,17273,17275,17278,17280,17282,17284,17286],{"class":166,"line":615},[164,17267,1094],{"class":352},[164,17269,17270],{"class":597}," NumberToBoolean",[164,17272,601],{"class":255},[164,17274,788],{"class":255},[164,17276,17277],{"class":791},"n",[164,17279,388],{"class":255},[164,17281,4388],{"class":597},[164,17283,402],{"class":255},[164,17285,797],{"class":352},[164,17287,6946],{"class":597},[164,17289,17290,17292,17295,17297,17299,17301,17304,17306,17308,17310],{"class":166,"line":978},[164,17291,1094],{"class":352},[164,17293,17294],{"class":597}," StringToBoolean",[164,17296,601],{"class":255},[164,17298,17142],{"class":597},[164,17300,1122],{"class":255},[164,17302,17303],{"class":597},"StringToNumber",[164,17305,263],{"class":255},[164,17307,17270],{"class":597},[164,17309,1160],{"class":255},[164,17311,17312],{"class":170}," // (s: string) => boolean\n",[164,17314,17315],{"class":166,"line":984},[164,17316,343],{"emptyLinePlaceholder":342},[164,17318,17319],{"class":166,"line":992},[164,17320,17321],{"class":170},"// Pipeline type\n",[164,17323,17324,17326,17329,17331,17333,17335,17338,17340,17342,17344,17346,17348,17350,17352,17354,17356],{"class":166,"line":999},[164,17325,1094],{"class":352},[164,17327,17328],{"class":597}," Pipe",[164,17330,1122],{"class":255},[164,17332,1125],{"class":597},[164,17334,263],{"class":255},[164,17336,17337],{"class":597}," Fns",[164,17339,1878],{"class":352},[164,17341,6924],{"class":352},[164,17343,10229],{"class":597},[164,17345,1325],{"class":259},[164,17347,1160],{"class":255},[164,17349,601],{"class":255},[164,17351,17337],{"class":597},[164,17353,1878],{"class":352},[164,17355,6924],{"class":352},[164,17357,9281],{"class":259},[164,17359,17360,17363,17365,17367,17369,17371,17373,17375,17377],{"class":166,"line":1004},[164,17361,17362],{"class":255}," (",[164,17364,17164],{"class":791},[164,17366,388],{"class":255},[164,17368,1895],{"class":597},[164,17370,402],{"class":255},[164,17372,797],{"class":352},[164,17374,10238],{"class":255},[164,17376,12244],{"class":597},[164,17378,421],{"class":255},[164,17380,17381,17384,17387],{"class":166,"line":1010},[164,17382,17383],{"class":255}," ...infer",[164,17385,17386],{"class":597}," Rest",[164,17388,421],{"class":255},[164,17390,17391],{"class":166,"line":1466},[164,17392,6542],{"class":259},[164,17394,17395,17397,17399,17401,17403,17405],{"class":166,"line":1495},[164,17396,4395],{"class":255},[164,17398,17386],{"class":597},[164,17400,1878],{"class":352},[164,17402,6924],{"class":352},[164,17404,10229],{"class":597},[164,17406,12509],{"class":259},[164,17408,17409,17411,17413,17415,17418,17420,17422],{"class":166,"line":1505},[164,17410,10381],{"class":255},[164,17412,17328],{"class":597},[164,17414,1122],{"class":255},[164,17416,17417],{"class":597},"U",[164,17419,263],{"class":255},[164,17421,17386],{"class":597},[164,17423,1540],{"class":255},[164,17425,17426,17428],{"class":166,"line":5434},[164,17427,10429],{"class":255},[164,17429,17430],{"class":597}," U\n",[164,17432,17433,17435],{"class":166,"line":5454},[164,17434,4403],{"class":255},[164,17436,4527],{"class":597},[164,17438,17439],{"class":166,"line":5468},[164,17440,343],{"emptyLinePlaceholder":342},[164,17442,17443,17445,17448,17450,17452],{"class":166,"line":5482},[164,17444,1094],{"class":352},[164,17446,17447],{"class":597}," PipelineResult",[164,17449,601],{"class":255},[164,17451,17328],{"class":597},[164,17453,11194],{"class":255},[164,17455,17456,17459],{"class":166,"line":5496},[164,17457,17458],{"class":597}," string",[164,17460,421],{"class":255},[164,17462,17463,17465,17467,17469,17471,17473,17475,17477,17479,17481,17483,17485,17487,17489,17491,17493,17495,17497,17499,17502,17504,17506,17508,17510,17512],{"class":166,"line":5511},[164,17464,11429],{"class":259},[164,17466,365],{"class":255},[164,17468,17253],{"class":791},[164,17470,388],{"class":255},[164,17472,1136],{"class":597},[164,17474,402],{"class":255},[164,17476,797],{"class":352},[164,17478,4388],{"class":597},[164,17480,263],{"class":255},[164,17482,788],{"class":255},[164,17484,17277],{"class":791},[164,17486,388],{"class":255},[164,17488,4388],{"class":597},[164,17490,402],{"class":255},[164,17492,797],{"class":352},[164,17494,6994],{"class":597},[164,17496,263],{"class":255},[164,17498,788],{"class":255},[164,17500,17501],{"class":791},"b",[164,17503,388],{"class":255},[164,17505,6994],{"class":597},[164,17507,402],{"class":255},[164,17509,797],{"class":352},[164,17511,1136],{"class":597},[164,17513,6542],{"class":259},[164,17515,17516,17518],{"class":166,"line":8828},[164,17517,1160],{"class":255},[164,17519,10276],{"class":170},[98,17521,17523],{"id":17522},"real-world-application-type-safe-api-client","Real-World Application: Type-Safe API Client",[154,17525,17527],{"className":156,"code":17526,"language":158,"meta":159,"style":159},"// Complete type-safe API client implementation\ninterface ApiSchema {\n \"/users\": {\n GET: {\n query?: { page?: number; limit?: number }\n response: { users: User[]; total: number }\n }\n POST: {\n body: Omit\n response: User\n }\n }\n \"/users/:id\": {\n GET: {\n params: { id: string }\n response: User\n }\n PUT: {\n params: { id: string }\n body: Partial>\n response: User\n }\n DELETE: {\n params: { id: string }\n response: void\n }\n }\n}\n\ntype ExtractParams =\n T extends `${string}:${infer Param}/${infer Rest}`\n ? { [K in Param]: string } & ExtractParams<`/${Rest}`>\n : T extends `${string}:${infer Param}`\n ? { [K in Param]: string }\n : {}\n\ntype ApiMethod<\n Schema extends Record,\n Path extends keyof Schema,\n Method extends keyof Schema[Path],\n> = Schema[Path][Method] extends {\n params: infer P\n query?: infer Q\n body?: infer B\n response: infer R\n}\n ? (params: P, options?: { query?: Q; body?: B }) => Promise\n : Schema[Path][Method] extends {\n query?: infer Q\n body?: infer B\n response: infer R\n }\n ? (options?: { query?: Q; body?: B }) => Promise\n : Schema[Path][Method] extends { response: infer R }\n ? () => Promise\n : never\n\nclass TypedApiClient> {\n constructor(private baseUrl: string) {}\n\n request(\n method: Method,\n path: Path,\n ...args: Parameters>\n ): ReturnType> {\n // Implementation here\n return null as any\n }\n\n get(\n path: Path,\n ...args: Parameters>\n ) {\n return this.request(\"GET\", path, ...args)\n }\n\n post(\n path: Path,\n ...args: Parameters>\n ) {\n return this.request(\"POST\", path, ...args)\n }\n\n put(\n path: Path,\n ...args: Parameters>\n ) {\n return this.request(\"PUT\", path, ...args)\n }\n\n delete(\n path: Path,\n ...args: Parameters>\n ) {\n return this.request(\"DELETE\", path, ...args)\n }\n}\n\n// Usage\nconst api = new TypedApiClient(\"https://api.example.com\")\n\n// Type-safe API calls\nconst users = await api.get(\"/users\", { query: { page: 1, limit: 10 } })\nconst user = await api.get(\"/users/:id\", { id: \"123\" })\nconst newUser = await api.post(\"/users\", {\n body: { name: \"John\", email: \"john@example.com\" },\n})\n",[161,17528,17529,17534,17543,17555,17564,17591,17619,17623,17632,17670,17679,17683,17687,17700,17708,17725,17733,17737,17746,17762,17804,17812,17816,17825,17841,17849,17853,17857,17861,17865,17885,17918,17959,17983,18005,18011,18015,18024,18043,18057,18077,18101,18112,18124,18135,18146,18150,18200,18220,18231,18242,18253,18257,18296,18326,18342,18348,18352,18380,18399,18403,18437,18448,18460,18489,18515,18520,18530,18534,18538,18555,18565,18597,18603,18633,18637,18641,18658,18668,18700,18706,18734,18738,18742,18759,18769,18801,18807,18835,18839,18843,18861,18872,18905,18912,18941,18946,18951,18956,18961,18992,18997,19003,19059,19103,19132,19165],{"__ignoreMap":159},[164,17530,17531],{"class":166,"line":167},[164,17532,17533],{"class":170},"// Complete type-safe API client implementation\n",[164,17535,17536,17538,17541],{"class":166,"line":174},[164,17537,3376],{"class":352},[164,17539,17540],{"class":597}," ApiSchema",[164,17542,378],{"class":255},[164,17544,17545,17547,17549,17551,17553],{"class":166,"line":16},[164,17546,2676],{"class":255},[164,17548,760],{"class":288},[164,17550,368],{"class":255},[164,17552,388],{"class":255},[164,17554,378],{"class":255},[164,17556,17557,17560,17562],{"class":166,"line":185},[164,17558,17559],{"class":384}," GET",[164,17561,388],{"class":255},[164,17563,378],{"class":255},[164,17565,17566,17569,17571,17573,17576,17578,17580,17582,17585,17587,17589],{"class":166,"line":191},[164,17567,17568],{"class":384}," query",[164,17570,1144],{"class":255},[164,17572,256],{"class":255},[164,17574,17575],{"class":384}," page",[164,17577,1144],{"class":255},[164,17579,4388],{"class":597},[164,17581,4623],{"class":255},[164,17583,17584],{"class":384}," limit",[164,17586,1144],{"class":255},[164,17588,4388],{"class":597},[164,17590,4151],{"class":255},[164,17592,17593,17596,17598,17600,17602,17604,17606,17608,17610,17613,17615,17617],{"class":166,"line":346},[164,17594,17595],{"class":384}," response",[164,17597,388],{"class":255},[164,17599,256],{"class":255},[164,17601,607],{"class":384},[164,17603,388],{"class":255},[164,17605,598],{"class":597},[164,17607,1325],{"class":259},[164,17609,4623],{"class":255},[164,17611,17612],{"class":384}," total",[164,17614,388],{"class":255},[164,17616,4388],{"class":597},[164,17618,4151],{"class":255},[164,17620,17621],{"class":166,"line":381},[164,17622,1743],{"class":255},[164,17624,17625,17628,17630],{"class":166,"line":424},[164,17626,17627],{"class":384}," POST",[164,17629,388],{"class":255},[164,17631,378],{"class":255},[164,17633,17634,17636,17638,17640,17642,17644,17646,17648,17650,17652,17654,17656,17658,17660,17662,17664,17666,17668],{"class":166,"line":461},[164,17635,1448],{"class":384},[164,17637,388],{"class":255},[164,17639,11692],{"class":597},[164,17641,1122],{"class":255},[164,17643,1724],{"class":597},[164,17645,263],{"class":255},[164,17647,285],{"class":255},[164,17649,397],{"class":288},[164,17651,368],{"class":255},[164,17653,4561],{"class":255},[164,17655,285],{"class":255},[164,17657,15301],{"class":288},[164,17659,368],{"class":255},[164,17661,4561],{"class":255},[164,17663,285],{"class":255},[164,17665,15316],{"class":288},[164,17667,368],{"class":255},[164,17669,1540],{"class":255},[164,17671,17672,17674,17676],{"class":166,"line":490},[164,17673,17595],{"class":384},[164,17675,388],{"class":255},[164,17677,17678],{"class":597}," User\n",[164,17680,17681],{"class":166,"line":526},[164,17682,1743],{"class":255},[164,17684,17685],{"class":166,"line":535},[164,17686,1260],{"class":255},[164,17688,17689,17691,17694,17696,17698],{"class":166,"line":29},[164,17690,2676],{"class":255},[164,17692,17693],{"class":288},"/users/:id",[164,17695,368],{"class":255},[164,17697,388],{"class":255},[164,17699,378],{"class":255},[164,17701,17702,17704,17706],{"class":166,"line":545},[164,17703,17559],{"class":384},[164,17705,388],{"class":255},[164,17707,378],{"class":255},[164,17709,17710,17713,17715,17717,17719,17721,17723],{"class":166,"line":562},[164,17711,17712],{"class":384}," params",[164,17714,388],{"class":255},[164,17716,256],{"class":255},[164,17718,2713],{"class":384},[164,17720,388],{"class":255},[164,17722,1136],{"class":597},[164,17724,4151],{"class":255},[164,17726,17727,17729,17731],{"class":166,"line":578},[164,17728,17595],{"class":384},[164,17730,388],{"class":255},[164,17732,17678],{"class":597},[164,17734,17735],{"class":166,"line":583},[164,17736,1743],{"class":255},[164,17738,17739,17742,17744],{"class":166,"line":589},[164,17740,17741],{"class":384}," PUT",[164,17743,388],{"class":255},[164,17745,378],{"class":255},[164,17747,17748,17750,17752,17754,17756,17758,17760],{"class":166,"line":615},[164,17749,17712],{"class":384},[164,17751,388],{"class":255},[164,17753,256],{"class":255},[164,17755,2713],{"class":384},[164,17757,388],{"class":255},[164,17759,1136],{"class":597},[164,17761,4151],{"class":255},[164,17763,17764,17766,17768,17770,17772,17774,17776,17778,17780,17782,17784,17786,17788,17790,17792,17794,17796,17798,17800,17802],{"class":166,"line":978},[164,17765,1448],{"class":384},[164,17767,388],{"class":255},[164,17769,11707],{"class":597},[164,17771,1122],{"class":255},[164,17773,16906],{"class":597},[164,17775,1122],{"class":255},[164,17777,1724],{"class":597},[164,17779,263],{"class":255},[164,17781,285],{"class":255},[164,17783,397],{"class":288},[164,17785,368],{"class":255},[164,17787,4561],{"class":255},[164,17789,285],{"class":255},[164,17791,15301],{"class":288},[164,17793,368],{"class":255},[164,17795,4561],{"class":255},[164,17797,285],{"class":255},[164,17799,15316],{"class":288},[164,17801,368],{"class":255},[164,17803,11723],{"class":255},[164,17805,17806,17808,17810],{"class":166,"line":984},[164,17807,17595],{"class":384},[164,17809,388],{"class":255},[164,17811,17678],{"class":597},[164,17813,17814],{"class":166,"line":992},[164,17815,1743],{"class":255},[164,17817,17818,17821,17823],{"class":166,"line":999},[164,17819,17820],{"class":384}," DELETE",[164,17822,388],{"class":255},[164,17824,378],{"class":255},[164,17826,17827,17829,17831,17833,17835,17837,17839],{"class":166,"line":1004},[164,17828,17712],{"class":384},[164,17830,388],{"class":255},[164,17832,256],{"class":255},[164,17834,2713],{"class":384},[164,17836,388],{"class":255},[164,17838,1136],{"class":597},[164,17840,4151],{"class":255},[164,17842,17843,17845,17847],{"class":166,"line":1010},[164,17844,17595],{"class":384},[164,17846,388],{"class":255},[164,17848,10536],{"class":597},[164,17850,17851],{"class":166,"line":1466},[164,17852,1743],{"class":255},[164,17854,17855],{"class":166,"line":1495},[164,17856,1260],{"class":255},[164,17858,17859],{"class":166,"line":1505},[164,17860,1281],{"class":255},[164,17862,17863],{"class":166,"line":5434},[164,17864,343],{"emptyLinePlaceholder":342},[164,17866,17867,17869,17872,17874,17876,17878,17880,17882],{"class":166,"line":5454},[164,17868,1094],{"class":352},[164,17870,17871],{"class":597}," ExtractParams",[164,17873,1122],{"class":255},[164,17875,1125],{"class":597},[164,17877,1878],{"class":352},[164,17879,1136],{"class":597},[164,17881,1160],{"class":255},[164,17883,17884],{"class":255}," =\n",[164,17886,17887,17889,17891,17893,17895,17897,17899,17901,17903,17906,17908,17910,17912,17914,17916],{"class":166,"line":5468},[164,17888,13091],{"class":597},[164,17890,1878],{"class":352},[164,17892,11225],{"class":255},[164,17894,1953],{"class":597},[164,17896,529],{"class":255},[164,17898,388],{"class":288},[164,17900,1187],{"class":255},[164,17902,2046],{"class":255},[164,17904,17905],{"class":597}," Param",[164,17907,529],{"class":255},[164,17909,4796],{"class":288},[164,17911,1187],{"class":255},[164,17913,2046],{"class":255},[164,17915,17386],{"class":597},[164,17917,4345],{"class":255},[164,17919,17920,17922,17924,17926,17928,17930,17932,17934,17936,17938,17940,17942,17944,17946,17948,17950,17952,17955,17957],{"class":166,"line":5482},[164,17921,10381],{"class":255},[164,17923,256],{"class":255},[164,17925,6257],{"class":259},[164,17927,11432],{"class":597},[164,17929,10352],{"class":255},[164,17931,17905],{"class":597},[164,17933,925],{"class":259},[164,17935,388],{"class":255},[164,17937,1136],{"class":597},[164,17939,279],{"class":255},[164,17941,3354],{"class":255},[164,17943,17871],{"class":597},[164,17945,1122],{"class":255},[164,17947,1181],{"class":255},[164,17949,4796],{"class":288},[164,17951,1187],{"class":255},[164,17953,17954],{"class":597},"Rest",[164,17956,1192],{"class":255},[164,17958,1540],{"class":255},[164,17960,17961,17963,17965,17967,17969,17971,17973,17975,17977,17979,17981],{"class":166,"line":5496},[164,17962,10429],{"class":255},[164,17964,1895],{"class":597},[164,17966,1878],{"class":352},[164,17968,11225],{"class":255},[164,17970,1953],{"class":597},[164,17972,529],{"class":255},[164,17974,388],{"class":288},[164,17976,1187],{"class":255},[164,17978,2046],{"class":255},[164,17980,17905],{"class":597},[164,17982,4345],{"class":255},[164,17984,17985,17987,17989,17991,17993,17995,17997,17999,18001,18003],{"class":166,"line":5511},[164,17986,9396],{"class":255},[164,17988,256],{"class":255},[164,17990,6257],{"class":259},[164,17992,11432],{"class":597},[164,17994,10352],{"class":255},[164,17996,17905],{"class":597},[164,17998,925],{"class":259},[164,18000,388],{"class":255},[164,18002,1136],{"class":597},[164,18004,4151],{"class":255},[164,18006,18007,18009],{"class":166,"line":8828},[164,18008,9458],{"class":255},[164,18010,3357],{"class":255},[164,18012,18013],{"class":166,"line":9970},[164,18014,343],{"emptyLinePlaceholder":342},[164,18016,18017,18019,18022],{"class":166,"line":12654},[164,18018,1094],{"class":352},[164,18020,18021],{"class":597}," ApiMethod",[164,18023,11194],{"class":255},[164,18025,18026,18029,18031,18033,18035,18037,18039,18041],{"class":166,"line":12661},[164,18027,18028],{"class":597}," Schema",[164,18030,1878],{"class":352},[164,18032,13385],{"class":597},[164,18034,1122],{"class":255},[164,18036,1953],{"class":597},[164,18038,263],{"class":255},[164,18040,10229],{"class":597},[164,18042,1727],{"class":255},[164,18044,18045,18048,18050,18052,18055],{"class":166,"line":12688},[164,18046,18047],{"class":597}," Path",[164,18049,1878],{"class":352},[164,18051,10355],{"class":255},[164,18053,18054],{"class":597}," Schema",[164,18056,421],{"class":255},[164,18058,18059,18062,18064,18066,18068,18070,18073,18075],{"class":166,"line":12703},[164,18060,18061],{"class":597}," Method",[164,18063,1878],{"class":352},[164,18065,10355],{"class":255},[164,18067,18054],{"class":597},[164,18069,918],{"class":259},[164,18071,18072],{"class":597},"Path",[164,18074,925],{"class":259},[164,18076,421],{"class":255},[164,18078,18079,18081,18083,18085,18087,18089,18092,18095,18097,18099],{"class":166,"line":14204},[164,18080,1160],{"class":255},[164,18082,601],{"class":255},[164,18084,18054],{"class":597},[164,18086,918],{"class":259},[164,18088,18072],{"class":597},[164,18090,18091],{"class":259},"][",[164,18093,18094],{"class":597},"Method",[164,18096,10370],{"class":259},[164,18098,10373],{"class":352},[164,18100,378],{"class":255},[164,18102,18103,18106,18108,18110],{"class":166,"line":14244},[164,18104,18105],{"class":384}," params",[164,18107,388],{"class":255},[164,18109,10238],{"class":255},[164,18111,13339],{"class":597},[164,18113,18114,18117,18119,18121],{"class":166,"line":14260},[164,18115,18116],{"class":384}," query",[164,18118,1144],{"class":255},[164,18120,10238],{"class":255},[164,18122,18123],{"class":597}," Q\n",[164,18125,18126,18129,18131,18133],{"class":166,"line":14271},[164,18127,18128],{"class":384}," body",[164,18130,1144],{"class":255},[164,18132,10238],{"class":255},[164,18134,17179],{"class":597},[164,18136,18137,18140,18142,18144],{"class":166,"line":14276},[164,18138,18139],{"class":384}," response",[164,18141,388],{"class":255},[164,18143,10238],{"class":255},[164,18145,13662],{"class":597},[164,18147,18148],{"class":166,"line":14281},[164,18149,1281],{"class":255},[164,18151,18152,18154,18156,18159,18161,18164,18166,18168,18170,18172,18174,18176,18179,18181,18184,18186,18188,18190,18192,18194,18196,18198],{"class":166,"line":14288},[164,18153,4395],{"class":255},[164,18155,788],{"class":255},[164,18157,18158],{"class":791},"params",[164,18160,388],{"class":255},[164,18162,18163],{"class":597}," P",[164,18165,263],{"class":255},[164,18167,1141],{"class":791},[164,18169,1144],{"class":255},[164,18171,256],{"class":255},[164,18173,3316],{"class":384},[164,18175,1144],{"class":255},[164,18177,18178],{"class":597}," Q",[164,18180,4623],{"class":255},[164,18182,18183],{"class":384}," body",[164,18185,1144],{"class":255},[164,18187,17196],{"class":597},[164,18189,1761],{"class":255},[164,18191,797],{"class":352},[164,18193,1153],{"class":597},[164,18195,1122],{"class":255},[164,18197,10895],{"class":597},[164,18199,1540],{"class":255},[164,18201,18202,18204,18206,18208,18210,18212,18214,18216,18218],{"class":166,"line":14300},[164,18203,4403],{"class":255},[164,18205,18054],{"class":597},[164,18207,918],{"class":259},[164,18209,18072],{"class":597},[164,18211,18091],{"class":259},[164,18213,18094],{"class":597},[164,18215,10370],{"class":259},[164,18217,10373],{"class":352},[164,18219,378],{"class":255},[164,18221,18222,18225,18227,18229],{"class":166,"line":14340},[164,18223,18224],{"class":384}," query",[164,18226,1144],{"class":255},[164,18228,10238],{"class":255},[164,18230,18123],{"class":597},[164,18232,18233,18236,18238,18240],{"class":166,"line":14356},[164,18234,18235],{"class":384}," body",[164,18237,1144],{"class":255},[164,18239,10238],{"class":255},[164,18241,17179],{"class":597},[164,18243,18244,18247,18249,18251],{"class":166,"line":14367},[164,18245,18246],{"class":384}," response",[164,18248,388],{"class":255},[164,18250,10238],{"class":255},[164,18252,13662],{"class":597},[164,18254,18255],{"class":166,"line":14372},[164,18256,8817],{"class":255},[164,18258,18259,18261,18263,18266,18268,18270,18272,18274,18276,18278,18280,18282,18284,18286,18288,18290,18292,18294],{"class":166,"line":14377},[164,18260,10381],{"class":255},[164,18262,788],{"class":255},[164,18264,18265],{"class":791},"options",[164,18267,1144],{"class":255},[164,18269,256],{"class":255},[164,18271,3316],{"class":384},[164,18273,1144],{"class":255},[164,18275,18178],{"class":597},[164,18277,4623],{"class":255},[164,18279,18183],{"class":384},[164,18281,1144],{"class":255},[164,18283,17196],{"class":597},[164,18285,1761],{"class":255},[164,18287,797],{"class":352},[164,18289,1153],{"class":597},[164,18291,1122],{"class":255},[164,18293,10895],{"class":597},[164,18295,1540],{"class":255},[164,18297,18298,18300,18302,18304,18306,18308,18310,18312,18314,18316,18318,18320,18322,18324],{"class":166,"line":14396},[164,18299,10429],{"class":255},[164,18301,18054],{"class":597},[164,18303,918],{"class":259},[164,18305,18072],{"class":597},[164,18307,18091],{"class":259},[164,18309,18094],{"class":597},[164,18311,10370],{"class":259},[164,18313,10373],{"class":352},[164,18315,256],{"class":255},[164,18317,1169],{"class":384},[164,18319,388],{"class":255},[164,18321,10238],{"class":255},[164,18323,10241],{"class":597},[164,18325,4151],{"class":255},[164,18327,18328,18330,18332,18334,18336,18338,18340],{"class":166,"line":14412},[164,18329,9396],{"class":255},[164,18331,1313],{"class":255},[164,18333,797],{"class":352},[164,18335,1153],{"class":597},[164,18337,1122],{"class":255},[164,18339,10895],{"class":597},[164,18341,1540],{"class":255},[164,18343,18344,18346],{"class":166,"line":14420},[164,18345,9458],{"class":255},[164,18347,4406],{"class":597},[164,18349,18350],{"class":166,"line":14425},[164,18351,343],{"emptyLinePlaceholder":342},[164,18353,18354,18356,18359,18361,18364,18366,18368,18370,18372,18374,18376,18378],{"class":166,"line":14430},[164,18355,13881],{"class":352},[164,18357,18358],{"class":597}," TypedApiClient",[164,18360,1122],{"class":255},[164,18362,18363],{"class":597},"Schema",[164,18365,1878],{"class":352},[164,18367,13385],{"class":597},[164,18369,1122],{"class":255},[164,18371,1953],{"class":597},[164,18373,263],{"class":255},[164,18375,10229],{"class":597},[164,18377,13154],{"class":255},[164,18379,378],{"class":255},[164,18381,18382,18384,18386,18388,18391,18393,18395,18397],{"class":166,"line":14449},[164,18383,6955],{"class":352},[164,18385,365],{"class":255},[164,18387,8534],{"class":352},[164,18389,18390],{"class":791}," baseUrl",[164,18392,388],{"class":255},[164,18394,1136],{"class":597},[164,18396,402],{"class":255},[164,18398,3357],{"class":255},[164,18400,18401],{"class":166,"line":14465},[164,18402,343],{"emptyLinePlaceholder":342},[164,18404,18405,18408,18410,18412,18414,18416,18418,18420,18423,18425,18427,18429,18431,18433,18435],{"class":166,"line":14472},[164,18406,18407],{"class":384}," request",[164,18409,1122],{"class":255},[164,18411,18072],{"class":597},[164,18413,1878],{"class":352},[164,18415,10355],{"class":255},[164,18417,18054],{"class":597},[164,18419,263],{"class":255},[164,18421,18422],{"class":597}," Method",[164,18424,1878],{"class":352},[164,18426,10355],{"class":255},[164,18428,18054],{"class":597},[164,18430,918],{"class":259},[164,18432,18072],{"class":597},[164,18434,925],{"class":259},[164,18436,11568],{"class":255},[164,18438,18439,18442,18444,18446],{"class":166,"line":14477},[164,18440,18441],{"class":791}," method",[164,18443,388],{"class":255},[164,18445,18422],{"class":597},[164,18447,421],{"class":255},[164,18449,18450,18453,18455,18458],{"class":166,"line":14482},[164,18451,18452],{"class":791}," path",[164,18454,388],{"class":255},[164,18456,18457],{"class":597}," Path",[164,18459,421],{"class":255},[164,18461,18462,18464,18466,18468,18470,18472,18475,18477,18479,18481,18483,18485,18487],{"class":166,"line":14494},[164,18463,9373],{"class":255},[164,18465,10224],{"class":791},[164,18467,388],{"class":255},[164,18469,13295],{"class":597},[164,18471,1122],{"class":255},[164,18473,18474],{"class":597},"ApiMethod",[164,18476,1122],{"class":255},[164,18478,18363],{"class":597},[164,18480,263],{"class":255},[164,18482,18457],{"class":597},[164,18484,263],{"class":255},[164,18486,18422],{"class":597},[164,18488,11723],{"class":255},[164,18490,18491,18493,18495,18497,18499,18501,18503,18505,18507,18509,18511,18513],{"class":166,"line":14513},[164,18492,13935],{"class":255},[164,18494,10206],{"class":597},[164,18496,1122],{"class":255},[164,18498,18474],{"class":597},[164,18500,1122],{"class":255},[164,18502,18363],{"class":597},[164,18504,263],{"class":255},[164,18506,18457],{"class":597},[164,18508,263],{"class":255},[164,18510,18422],{"class":597},[164,18512,13154],{"class":255},[164,18514,378],{"class":255},[164,18516,18517],{"class":166,"line":14525},[164,18518,18519],{"class":170}," // Implementation here\n",[164,18521,18522,18524,18526,18528],{"class":166,"line":14536},[164,18523,1768],{"class":251},[164,18525,7842],{"class":255},[164,18527,3439],{"class":251},[164,18529,13348],{"class":597},[164,18531,18532],{"class":166,"line":14547},[164,18533,1260],{"class":255},[164,18535,18536],{"class":166,"line":14558},[164,18537,343],{"emptyLinePlaceholder":342},[164,18539,18540,18543,18545,18547,18549,18551,18553],{"class":166,"line":14569},[164,18541,18542],{"class":384}," get",[164,18544,1122],{"class":255},[164,18546,18072],{"class":597},[164,18548,1878],{"class":352},[164,18550,10355],{"class":255},[164,18552,18054],{"class":597},[164,18554,11568],{"class":255},[164,18556,18557,18559,18561,18563],{"class":166,"line":14575},[164,18558,18452],{"class":791},[164,18560,388],{"class":255},[164,18562,18457],{"class":597},[164,18564,421],{"class":255},[164,18566,18567,18569,18571,18573,18575,18577,18579,18581,18583,18585,18587,18589,18591,18593,18595],{"class":166,"line":14580},[164,18568,9373],{"class":255},[164,18570,10224],{"class":791},[164,18572,388],{"class":255},[164,18574,13295],{"class":597},[164,18576,1122],{"class":255},[164,18578,18474],{"class":597},[164,18580,1122],{"class":255},[164,18582,18363],{"class":597},[164,18584,263],{"class":255},[164,18586,18457],{"class":597},[164,18588,263],{"class":255},[164,18590,285],{"class":255},[164,18592,10762],{"class":288},[164,18594,368],{"class":255},[164,18596,11723],{"class":255},[164,18598,18599,18601],{"class":166,"line":14602},[164,18600,7005],{"class":255},[164,18602,378],{"class":255},[164,18604,18605,18607,18609,18612,18614,18616,18618,18620,18622,18625,18627,18629,18631],{"class":166,"line":14627},[164,18606,1768],{"class":251},[164,18608,7066],{"class":255},[164,18610,18611],{"class":362},"request",[164,18613,365],{"class":384},[164,18615,368],{"class":255},[164,18617,10762],{"class":288},[164,18619,368],{"class":255},[164,18621,263],{"class":255},[164,18623,18624],{"class":259}," path",[164,18626,263],{"class":255},[164,18628,16973],{"class":255},[164,18630,10224],{"class":259},[164,18632,532],{"class":384},[164,18634,18635],{"class":166,"line":14652},[164,18636,1260],{"class":255},[164,18638,18639],{"class":166,"line":14657},[164,18640,343],{"emptyLinePlaceholder":342},[164,18642,18643,18646,18648,18650,18652,18654,18656],{"class":166,"line":14662},[164,18644,18645],{"class":384}," post",[164,18647,1122],{"class":255},[164,18649,18072],{"class":597},[164,18651,1878],{"class":352},[164,18653,10355],{"class":255},[164,18655,18054],{"class":597},[164,18657,11568],{"class":255},[164,18659,18660,18662,18664,18666],{"class":166,"line":14667},[164,18661,18452],{"class":791},[164,18663,388],{"class":255},[164,18665,18457],{"class":597},[164,18667,421],{"class":255},[164,18669,18670,18672,18674,18676,18678,18680,18682,18684,18686,18688,18690,18692,18694,18696,18698],{"class":166,"line":14681},[164,18671,9373],{"class":255},[164,18673,10224],{"class":791},[164,18675,388],{"class":255},[164,18677,13295],{"class":597},[164,18679,1122],{"class":255},[164,18681,18474],{"class":597},[164,18683,1122],{"class":255},[164,18685,18363],{"class":597},[164,18687,263],{"class":255},[164,18689,18457],{"class":597},[164,18691,263],{"class":255},[164,18693,285],{"class":255},[164,18695,1439],{"class":288},[164,18697,368],{"class":255},[164,18699,11723],{"class":255},[164,18701,18702,18704],{"class":166,"line":14686},[164,18703,7005],{"class":255},[164,18705,378],{"class":255},[164,18707,18708,18710,18712,18714,18716,18718,18720,18722,18724,18726,18728,18730,18732],{"class":166,"line":14691},[164,18709,1768],{"class":251},[164,18711,7066],{"class":255},[164,18713,18611],{"class":362},[164,18715,365],{"class":384},[164,18717,368],{"class":255},[164,18719,1439],{"class":288},[164,18721,368],{"class":255},[164,18723,263],{"class":255},[164,18725,18624],{"class":259},[164,18727,263],{"class":255},[164,18729,16973],{"class":255},[164,18731,10224],{"class":259},[164,18733,532],{"class":384},[164,18735,18736],{"class":166,"line":14696},[164,18737,1260],{"class":255},[164,18739,18740],{"class":166,"line":14702},[164,18741,343],{"emptyLinePlaceholder":342},[164,18743,18744,18747,18749,18751,18753,18755,18757],{"class":166,"line":14717},[164,18745,18746],{"class":384}," put",[164,18748,1122],{"class":255},[164,18750,18072],{"class":597},[164,18752,1878],{"class":352},[164,18754,10355],{"class":255},[164,18756,18054],{"class":597},[164,18758,11568],{"class":255},[164,18760,18761,18763,18765,18767],{"class":166,"line":14734},[164,18762,18452],{"class":791},[164,18764,388],{"class":255},[164,18766,18457],{"class":597},[164,18768,421],{"class":255},[164,18770,18771,18773,18775,18777,18779,18781,18783,18785,18787,18789,18791,18793,18795,18797,18799],{"class":166,"line":14748},[164,18772,9373],{"class":255},[164,18774,10224],{"class":791},[164,18776,388],{"class":255},[164,18778,13295],{"class":597},[164,18780,1122],{"class":255},[164,18782,18474],{"class":597},[164,18784,1122],{"class":255},[164,18786,18363],{"class":597},[164,18788,263],{"class":255},[164,18790,18457],{"class":597},[164,18792,263],{"class":255},[164,18794,285],{"class":255},[164,18796,10779],{"class":288},[164,18798,368],{"class":255},[164,18800,11723],{"class":255},[164,18802,18803,18805],{"class":166,"line":14766},[164,18804,7005],{"class":255},[164,18806,378],{"class":255},[164,18808,18809,18811,18813,18815,18817,18819,18821,18823,18825,18827,18829,18831,18833],{"class":166,"line":14783},[164,18810,1768],{"class":251},[164,18812,7066],{"class":255},[164,18814,18611],{"class":362},[164,18816,365],{"class":384},[164,18818,368],{"class":255},[164,18820,10779],{"class":288},[164,18822,368],{"class":255},[164,18824,263],{"class":255},[164,18826,18624],{"class":259},[164,18828,263],{"class":255},[164,18830,16973],{"class":255},[164,18832,10224],{"class":259},[164,18834,532],{"class":384},[164,18836,18837],{"class":166,"line":14800},[164,18838,1260],{"class":255},[164,18840,18841],{"class":166,"line":14814},[164,18842,343],{"emptyLinePlaceholder":342},[164,18844,18846,18849,18851,18853,18855,18857,18859],{"class":166,"line":18845},91,[164,18847,18848],{"class":384}," delete",[164,18850,1122],{"class":255},[164,18852,18072],{"class":597},[164,18854,1878],{"class":352},[164,18856,10355],{"class":255},[164,18858,18054],{"class":597},[164,18860,11568],{"class":255},[164,18862,18864,18866,18868,18870],{"class":166,"line":18863},92,[164,18865,18452],{"class":791},[164,18867,388],{"class":255},[164,18869,18457],{"class":597},[164,18871,421],{"class":255},[164,18873,18875,18877,18879,18881,18883,18885,18887,18889,18891,18893,18895,18897,18899,18901,18903],{"class":166,"line":18874},93,[164,18876,9373],{"class":255},[164,18878,10224],{"class":791},[164,18880,388],{"class":255},[164,18882,13295],{"class":597},[164,18884,1122],{"class":255},[164,18886,18474],{"class":597},[164,18888,1122],{"class":255},[164,18890,18363],{"class":597},[164,18892,263],{"class":255},[164,18894,18457],{"class":597},[164,18896,263],{"class":255},[164,18898,285],{"class":255},[164,18900,10788],{"class":288},[164,18902,368],{"class":255},[164,18904,11723],{"class":255},[164,18906,18908,18910],{"class":166,"line":18907},94,[164,18909,7005],{"class":255},[164,18911,378],{"class":255},[164,18913,18915,18917,18919,18921,18923,18925,18927,18929,18931,18933,18935,18937,18939],{"class":166,"line":18914},95,[164,18916,1768],{"class":251},[164,18918,7066],{"class":255},[164,18920,18611],{"class":362},[164,18922,365],{"class":384},[164,18924,368],{"class":255},[164,18926,10788],{"class":288},[164,18928,368],{"class":255},[164,18930,263],{"class":255},[164,18932,18624],{"class":259},[164,18934,263],{"class":255},[164,18936,16973],{"class":255},[164,18938,10224],{"class":259},[164,18940,532],{"class":384},[164,18942,18944],{"class":166,"line":18943},96,[164,18945,1260],{"class":255},[164,18947,18949],{"class":166,"line":18948},97,[164,18950,1281],{"class":255},[164,18952,18954],{"class":166,"line":18953},98,[164,18955,343],{"emptyLinePlaceholder":342},[164,18957,18959],{"class":166,"line":18958},99,[164,18960,11466],{"class":170},[164,18962,18963,18965,18968,18970,18972,18974,18976,18979,18981,18983,18985,18988,18990],{"class":166,"line":23},[164,18964,721],{"class":352},[164,18966,18967],{"class":259}," api ",[164,18969,359],{"class":255},[164,18971,729],{"class":255},[164,18973,18358],{"class":362},[164,18975,1122],{"class":255},[164,18977,18978],{"class":597},"ApiSchema",[164,18980,1160],{"class":255},[164,18982,365],{"class":259},[164,18984,368],{"class":255},[164,18986,18987],{"class":288},"https://api.example.com",[164,18989,368],{"class":255},[164,18991,532],{"class":259},[164,18993,18995],{"class":166,"line":18994},101,[164,18996,343],{"emptyLinePlaceholder":342},[164,18998,19000],{"class":166,"line":18999},102,[164,19001,19002],{"class":170},"// Type-safe API calls\n",[164,19004,19006,19008,19010,19012,19014,19016,19018,19020,19022,19024,19026,19028,19030,19032,19034,19036,19038,19040,19042,19044,19046,19048,19050,19053,19055,19057],{"class":166,"line":19005},103,[164,19007,721],{"class":352},[164,19009,356],{"class":259},[164,19011,359],{"class":255},[164,19013,853],{"class":251},[164,19015,1119],{"class":259},[164,19017,405],{"class":255},[164,19019,2668],{"class":362},[164,19021,365],{"class":259},[164,19023,368],{"class":255},[164,19025,760],{"class":288},[164,19027,368],{"class":255},[164,19029,263],{"class":255},[164,19031,256],{"class":255},[164,19033,3316],{"class":384},[164,19035,388],{"class":255},[164,19037,256],{"class":255},[164,19039,17575],{"class":384},[164,19041,388],{"class":255},[164,19043,15925],{"class":921},[164,19045,263],{"class":255},[164,19047,17584],{"class":384},[164,19049,388],{"class":255},[164,19051,19052],{"class":921}," 10",[164,19054,279],{"class":255},[164,19056,279],{"class":255},[164,19058,532],{"class":259},[164,19060,19062,19064,19066,19068,19070,19072,19074,19076,19078,19080,19082,19084,19086,19088,19090,19092,19094,19097,19099,19101],{"class":166,"line":19061},104,[164,19063,721],{"class":352},[164,19065,8966],{"class":259},[164,19067,359],{"class":255},[164,19069,853],{"class":251},[164,19071,1119],{"class":259},[164,19073,405],{"class":255},[164,19075,2668],{"class":362},[164,19077,365],{"class":259},[164,19079,368],{"class":255},[164,19081,17693],{"class":288},[164,19083,368],{"class":255},[164,19085,263],{"class":255},[164,19087,256],{"class":255},[164,19089,2713],{"class":384},[164,19091,388],{"class":255},[164,19093,285],{"class":255},[164,19095,19096],{"class":288},"123",[164,19098,368],{"class":255},[164,19100,279],{"class":255},[164,19102,532],{"class":259},[164,19104,19106,19108,19110,19112,19114,19116,19118,19120,19122,19124,19126,19128,19130],{"class":166,"line":19105},105,[164,19107,721],{"class":352},[164,19109,16271],{"class":259},[164,19111,359],{"class":255},[164,19113,853],{"class":251},[164,19115,1119],{"class":259},[164,19117,405],{"class":255},[164,19119,753],{"class":362},[164,19121,365],{"class":259},[164,19123,368],{"class":255},[164,19125,760],{"class":288},[164,19127,368],{"class":255},[164,19129,263],{"class":255},[164,19131,378],{"class":255},[164,19133,19135,19137,19139,19141,19143,19145,19147,19149,19151,19153,19155,19157,19159,19161,19163],{"class":166,"line":19134},106,[164,19136,18128],{"class":384},[164,19138,388],{"class":255},[164,19140,256],{"class":255},[164,19142,4626],{"class":384},[164,19144,388],{"class":255},[164,19146,285],{"class":255},[164,19148,15414],{"class":288},[164,19150,368],{"class":255},[164,19152,263],{"class":255},[164,19154,13225],{"class":384},[164,19156,388],{"class":255},[164,19158,285],{"class":255},[164,19160,15427],{"class":288},[164,19162,368],{"class":255},[164,19164,1492],{"class":255},[164,19166,19168,19170],{"class":166,"line":19167},107,[164,19169,529],{"class":255},[164,19171,532],{"class":259},[98,19173,3988],{"id":3987},[102,19175,19176],{},"Advanced TypeScript patterns provide powerful tools for building robust, maintainable enterprise applications. These patterns offer:",[200,19178,19179,19185,19191,19197,19203],{},[116,19180,19181,19184],{},[119,19182,19183],{},"Enhanced Type Safety"," - Catch errors at compile time rather than runtime",[116,19186,19187,19190],{},[119,19188,19189],{},"Better Developer Experience"," - Intelligent autocomplete and refactoring support",[116,19192,19193,19196],{},[119,19194,19195],{},"Self-Documenting Code"," - Types serve as living documentation",[116,19198,19199,19202],{},[119,19200,19201],{},"Reduced Bugs"," - Impossible states become unrepresentable",[116,19204,19205,19208],{},[119,19206,19207],{},"Improved Maintainability"," - Changes propagate through the type system",[102,19210,19211],{},"The key to mastering these patterns is to start simple and gradually incorporate more advanced techniques as your understanding grows. Focus on solving real problems in your codebase rather than using complex types for their own sake.",[102,19213,19214],{},"Remember: the goal is not to write the most complex types possible, but to create types that make your code more reliable, maintainable, and enjoyable to work with.",[102,19216,19217],{},"Which of these patterns have you found most useful in your projects? Are there specific TypeScript challenges you're facing that these patterns could help solve? I'd love to hear about your experiences and help with any advanced TypeScript questions you might have.",[3996,19219],{},[98,19221,5842],{"id":5841},[102,19223,19224,19225,5848],{},"This post is part 3 of the ",[119,19226,4052],{},[200,19228,19229,19235,19241],{},[116,19230,19231,5863],{},[119,19232,19233],{},[4843,19234,5858],{"href":5857},[116,19236,19237,5872],{},[119,19238,19239],{},[4843,19240,5871],{"href":5870},[116,19242,19243,5812,19247,5881],{},[119,19244,19245],{},[4843,19246,5880],{"href":5879},[5860,19248,5862],{},[4005,19250,19251],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":159,"searchDepth":174,"depth":174,"links":19253},[19254,19255,19259,19263,19267,19271,19276,19280,19281,19282],{"id":10091,"depth":174,"text":10085},{"id":10097,"depth":174,"text":10098,"children":19256},[19257,19258],{"id":10104,"depth":16,"text":10105},{"id":10311,"depth":16,"text":10312},{"id":10730,"depth":174,"text":10731,"children":19260},[19261,19262],{"id":10737,"depth":16,"text":10738},{"id":11276,"depth":16,"text":11277},{"id":11645,"depth":174,"text":11646,"children":19264},[19265,19266],{"id":11652,"depth":16,"text":11653},{"id":12100,"depth":16,"text":12101},{"id":12713,"depth":174,"text":12714,"children":19268},[19269,19270],{"id":12717,"depth":16,"text":12718},{"id":13277,"depth":16,"text":13278},{"id":13706,"depth":174,"text":13707,"children":19272},[19273,19274,19275],{"id":13710,"depth":16,"text":13711},{"id":14823,"depth":16,"text":14824},{"id":15436,"depth":16,"text":15437},{"id":16338,"depth":174,"text":16339,"children":19277},[19278,19279],{"id":16342,"depth":16,"text":16343},{"id":16926,"depth":16,"text":16927},{"id":17522,"depth":174,"text":17523},{"id":3987,"depth":174,"text":3988},{"id":5841,"depth":174,"text":5842},"2025-02-22","Master advanced TypeScript patterns including conditional types, template literals, and design patterns for building robust enterprise applications.",false,"TypeScript Advanced Patterns Guide",{"readingTime":19288},"22 min read",{"title":10085,"description":19284},{"src":19291,"mime":4056,"alt":19292,"width":4058,"height":4059},"/img/blog/11-typescript-advanced-patterns/banner.svg","Advanced TypeScript patterns code examples","blog/11-typescript-advanced-patterns",[4062,19295,19296],"Advanced Patterns","Enterprise","4S-IsUSBHXfpYUfaGj6sxyH3wOV_UQRbhmuj6RAhnSU",{"id":90,"title":91,"abstract":92,"author":93,"authorUrl":92,"body":19299,"date":4045,"dateUpdated":4045,"description":4046,"excerpt":92,"extension":4047,"featured":342,"headline":92,"image":92,"meta":22666,"navigation":342,"ogImage":92,"path":4050,"seo":22667,"series":4052,"seriesDescription":4053,"seriesOrder":16,"socialImage":22668,"stem":4060,"tags":22669,"__hash__":4066},{"type":95,"value":19300,"toc":22629},[19301,19303,19305,19307,19309,19327,19329,19331,19333,19357,19359,19377,19379,19381,19383,19697,19699,20025,20027,20441,20443,20705,20707,20709,20929,20931,21121,21123,21241,21243,21245,21447,21449,21753,21755,22019,22021,22023,22077,22079,22287,22289,22293,22361,22363,22365,22383,22385,22399,22401,22415,22417,22589,22591,22593,22615,22617,22619,22621,22623,22627],[98,19302,91],{"id":100},[102,19304,104],{},[98,19306,108],{"id":107},[102,19308,111],{},[113,19310,19311,19315,19319,19323],{},[116,19312,19313,122],{},[119,19314,121],{},[116,19316,19317,128],{},[119,19318,127],{},[116,19320,19321,134],{},[119,19322,133],{},[116,19324,19325,140],{},[119,19326,139],{},[102,19328,143],{},[98,19330,147],{"id":146},[149,19332,152],{"id":151},[154,19334,19335],{"className":156,"code":157,"language":158,"meta":159,"style":159},[161,19336,19337,19341,19345,19349,19353],{"__ignoreMap":159},[164,19338,19339],{"class":166,"line":167},[164,19340,171],{"class":170},[164,19342,19343],{"class":166,"line":174},[164,19344,177],{"class":170},[164,19346,19347],{"class":166,"line":16},[164,19348,182],{"class":170},[164,19350,19351],{"class":166,"line":185},[164,19352,188],{"class":170},[164,19354,19355],{"class":166,"line":191},[164,19356,194],{"class":170},[149,19358,198],{"id":197},[200,19360,19361,19365,19369,19373],{},[116,19362,19363,207],{},[119,19364,206],{},[116,19366,19367,213],{},[119,19368,212],{},[116,19370,19371,219],{},[119,19372,218],{},[116,19374,19375,225],{},[119,19376,224],{},[98,19378,229],{"id":228},[149,19380,233],{"id":232},[102,19382,236],{},[154,19384,19385],{"className":156,"code":239,"language":158,"meta":159,"style":159},[161,19386,19387,19391,19421,19443,19461,19465,19489,19521,19553,19579,19611,19617,19621,19625,19639,19653,19657,19661,19679],{"__ignoreMap":159},[164,19388,19389],{"class":166,"line":167},[164,19390,246],{"class":170},[164,19392,19393,19395,19397,19399,19401,19403,19405,19407,19409,19411,19413,19415,19417,19419],{"class":166,"line":174},[164,19394,252],{"class":251},[164,19396,256],{"class":255},[164,19398,260],{"class":259},[164,19400,263],{"class":255},[164,19402,266],{"class":259},[164,19404,263],{"class":255},[164,19406,271],{"class":259},[164,19408,263],{"class":255},[164,19410,276],{"class":259},[164,19412,279],{"class":255},[164,19414,282],{"class":251},[164,19416,285],{"class":255},[164,19418,289],{"class":288},[164,19420,292],{"class":255},[164,19422,19423,19425,19427,19429,19431,19433,19435,19437,19439,19441],{"class":166,"line":16},[164,19424,252],{"class":251},[164,19426,256],{"class":255},[164,19428,301],{"class":259},[164,19430,263],{"class":255},[164,19432,306],{"class":259},[164,19434,279],{"class":255},[164,19436,282],{"class":251},[164,19438,285],{"class":255},[164,19440,315],{"class":288},[164,19442,292],{"class":255},[164,19444,19445,19447,19449,19451,19453,19455,19457,19459],{"class":166,"line":185},[164,19446,252],{"class":251},[164,19448,256],{"class":255},[164,19450,326],{"class":259},[164,19452,279],{"class":255},[164,19454,282],{"class":251},[164,19456,285],{"class":255},[164,19458,335],{"class":288},[164,19460,292],{"class":255},[164,19462,19463],{"class":166,"line":191},[164,19464,343],{"emptyLinePlaceholder":342},[164,19466,19467,19469,19471,19473,19475,19477,19479,19481,19483,19485,19487],{"class":166,"line":346},[164,19468,349],{"class":251},[164,19470,353],{"class":352},[164,19472,356],{"class":259},[164,19474,359],{"class":255},[164,19476,260],{"class":362},[164,19478,365],{"class":259},[164,19480,368],{"class":255},[164,19482,371],{"class":288},[164,19484,368],{"class":255},[164,19486,263],{"class":255},[164,19488,378],{"class":255},[164,19490,19491,19493,19495,19497,19499,19501,19503,19505,19507,19509,19511,19513,19515,19517,19519],{"class":166,"line":381},[164,19492,385],{"class":384},[164,19494,388],{"class":255},[164,19496,276],{"class":362},[164,19498,365],{"class":259},[164,19500,368],{"class":255},[164,19502,397],{"class":288},[164,19504,368],{"class":255},[164,19506,402],{"class":259},[164,19508,405],{"class":255},[164,19510,408],{"class":362},[164,19512,411],{"class":259},[164,19514,405],{"class":255},[164,19516,416],{"class":362},[164,19518,411],{"class":259},[164,19520,421],{"class":255},[164,19522,19523,19525,19527,19529,19531,19533,19535,19537,19539,19541,19543,19545,19547,19549,19551],{"class":166,"line":424},[164,19524,427],{"class":384},[164,19526,388],{"class":255},[164,19528,266],{"class":362},[164,19530,365],{"class":259},[164,19532,368],{"class":255},[164,19534,438],{"class":288},[164,19536,368],{"class":255},[164,19538,402],{"class":259},[164,19540,405],{"class":255},[164,19542,447],{"class":362},[164,19544,411],{"class":259},[164,19546,405],{"class":255},[164,19548,454],{"class":362},[164,19550,411],{"class":259},[164,19552,421],{"class":255},[164,19554,19555,19557,19559,19561,19563,19565,19567,19569,19571,19573,19575,19577],{"class":166,"line":461},[164,19556,464],{"class":384},[164,19558,388],{"class":255},[164,19560,266],{"class":362},[164,19562,365],{"class":259},[164,19564,368],{"class":255},[164,19566,475],{"class":288},[164,19568,368],{"class":255},[164,19570,402],{"class":259},[164,19572,405],{"class":255},[164,19574,447],{"class":362},[164,19576,411],{"class":259},[164,19578,421],{"class":255},[164,19580,19581,19583,19585,19587,19589,19591,19593,19595,19597,19599,19601,19603,19605,19607,19609],{"class":166,"line":490},[164,19582,493],{"class":384},[164,19584,388],{"class":255},[164,19586,271],{"class":362},[164,19588,365],{"class":259},[164,19590,368],{"class":255},[164,19592,504],{"class":288},[164,19594,368],{"class":255},[164,19596,402],{"class":259},[164,19598,405],{"class":255},[164,19600,513],{"class":362},[164,19602,411],{"class":259},[164,19604,405],{"class":255},[164,19606,447],{"class":362},[164,19608,411],{"class":259},[164,19610,421],{"class":255},[164,19612,19613,19615],{"class":166,"line":526},[164,19614,529],{"class":255},[164,19616,532],{"class":259},[164,19618,19619],{"class":166,"line":535},[164,19620,343],{"emptyLinePlaceholder":342},[164,19622,19623],{"class":166,"line":29},[164,19624,542],{"class":170},[164,19626,19627,19629,19631,19633,19635,19637],{"class":166,"line":545},[164,19628,349],{"class":251},[164,19630,353],{"class":352},[164,19632,552],{"class":259},[164,19634,359],{"class":255},[164,19636,301],{"class":362},[164,19638,559],{"class":259},[164,19640,19641,19643,19645,19647,19649,19651],{"class":166,"line":562},[164,19642,349],{"class":251},[164,19644,353],{"class":352},[164,19646,569],{"class":259},[164,19648,359],{"class":255},[164,19650,306],{"class":362},[164,19652,559],{"class":259},[164,19654,19655],{"class":166,"line":578},[164,19656,343],{"emptyLinePlaceholder":342},[164,19658,19659],{"class":166,"line":583},[164,19660,586],{"class":170},[164,19662,19663,19665,19667,19669,19671,19673,19675,19677],{"class":166,"line":589},[164,19664,349],{"class":251},[164,19666,594],{"class":352},[164,19668,598],{"class":597},[164,19670,601],{"class":255},[164,19672,604],{"class":255},[164,19674,607],{"class":259},[164,19676,405],{"class":255},[164,19678,612],{"class":259},[164,19680,19681,19683,19685,19687,19689,19691,19693,19695],{"class":166,"line":615},[164,19682,349],{"class":251},[164,19684,594],{"class":352},[164,19686,622],{"class":597},[164,19688,601],{"class":255},[164,19690,604],{"class":255},[164,19692,607],{"class":259},[164,19694,405],{"class":255},[164,19696,633],{"class":259},[149,19698,637],{"id":636},[154,19700,19701],{"className":156,"code":640,"language":158,"meta":159,"style":159},[161,19702,19703,19707,19725,19743,19765,19769,19783,19787,19791,19837,19865,19869,19873,19911,19915,19929,19945,19953,19973,19987,19991,19997,20003,20007,20011],{"__ignoreMap":159},[164,19704,19705],{"class":166,"line":167},[164,19706,647],{"class":170},[164,19708,19709,19711,19713,19715,19717,19719,19721,19723],{"class":166,"line":174},[164,19710,252],{"class":251},[164,19712,256],{"class":255},[164,19714,656],{"class":259},[164,19716,279],{"class":255},[164,19718,282],{"class":251},[164,19720,285],{"class":255},[164,19722,665],{"class":288},[164,19724,292],{"class":255},[164,19726,19727,19729,19731,19733,19735,19737,19739,19741],{"class":166,"line":16},[164,19728,252],{"class":251},[164,19730,256],{"class":255},[164,19732,676],{"class":259},[164,19734,279],{"class":255},[164,19736,282],{"class":251},[164,19738,285],{"class":255},[164,19740,685],{"class":288},[164,19742,292],{"class":255},[164,19744,19745,19747,19749,19751,19753,19755,19757,19759,19761,19763],{"class":166,"line":185},[164,19746,252],{"class":251},[164,19748,256],{"class":255},[164,19750,696],{"class":259},[164,19752,263],{"class":255},[164,19754,701],{"class":259},[164,19756,279],{"class":255},[164,19758,282],{"class":251},[164,19760,285],{"class":255},[164,19762,710],{"class":288},[164,19764,292],{"class":255},[164,19766,19767],{"class":166,"line":191},[164,19768,343],{"emptyLinePlaceholder":342},[164,19770,19771,19773,19775,19777,19779,19781],{"class":166,"line":346},[164,19772,721],{"class":352},[164,19774,724],{"class":259},[164,19776,359],{"class":255},[164,19778,729],{"class":255},[164,19780,656],{"class":362},[164,19782,734],{"class":259},[164,19784,19785],{"class":166,"line":381},[164,19786,343],{"emptyLinePlaceholder":342},[164,19788,19789],{"class":166,"line":424},[164,19790,743],{"class":170},[164,19792,19793,19795,19797,19799,19801,19803,19805,19807,19809,19811,19813,19815,19817,19819,19821,19823,19825,19827,19829,19831,19833,19835],{"class":166,"line":461},[164,19794,748],{"class":259},[164,19796,405],{"class":255},[164,19798,753],{"class":362},[164,19800,365],{"class":259},[164,19802,368],{"class":255},[164,19804,760],{"class":288},[164,19806,368],{"class":255},[164,19808,263],{"class":255},[164,19810,676],{"class":362},[164,19812,365],{"class":259},[164,19814,368],{"class":255},[164,19816,773],{"class":288},[164,19818,368],{"class":255},[164,19820,263],{"class":255},[164,19822,780],{"class":259},[164,19824,263],{"class":255},[164,19826,785],{"class":352},[164,19828,788],{"class":255},[164,19830,792],{"class":791},[164,19832,402],{"class":255},[164,19834,797],{"class":352},[164,19836,378],{"class":255},[164,19838,19839,19841,19843,19845,19847,19849,19851,19853,19855,19857,19859,19861,19863],{"class":166,"line":490},[164,19840,804],{"class":352},[164,19842,807],{"class":259},[164,19844,601],{"class":255},[164,19846,812],{"class":259},[164,19848,405],{"class":255},[164,19850,817],{"class":259},[164,19852,405],{"class":255},[164,19854,822],{"class":362},[164,19856,365],{"class":384},[164,19858,368],{"class":255},[164,19860,773],{"class":288},[164,19862,368],{"class":255},[164,19864,532],{"class":384},[164,19866,19867],{"class":166,"line":526},[164,19868,837],{"class":170},[164,19870,19871],{"class":166,"line":535},[164,19872,343],{"emptyLinePlaceholder":342},[164,19874,19875,19877,19879,19881,19883,19885,19887,19889,19891,19893,19895,19897,19899,19901,19903,19905,19907,19909],{"class":166,"line":29},[164,19876,804],{"class":352},[164,19878,848],{"class":259},[164,19880,601],{"class":255},[164,19882,853],{"class":251},[164,19884,856],{"class":259},[164,19886,405],{"class":255},[164,19888,861],{"class":362},[164,19890,365],{"class":384},[164,19892,371],{"class":259},[164,19894,402],{"class":384},[164,19896,405],{"class":255},[164,19898,872],{"class":362},[164,19900,365],{"class":384},[164,19902,877],{"class":259},[164,19904,402],{"class":384},[164,19906,405],{"class":255},[164,19908,884],{"class":362},[164,19910,734],{"class":384},[164,19912,19913],{"class":166,"line":545},[164,19914,343],{"emptyLinePlaceholder":342},[164,19916,19917,19919,19921,19923,19925,19927],{"class":166,"line":562},[164,19918,895],{"class":251},[164,19920,812],{"class":259},[164,19922,405],{"class":255},[164,19924,773],{"class":362},[164,19926,365],{"class":384},[164,19928,906],{"class":255},[164,19930,19931,19933,19935,19937,19939,19941,19943],{"class":166,"line":578},[164,19932,911],{"class":384},[164,19934,388],{"class":255},[164,19936,848],{"class":259},[164,19938,918],{"class":384},[164,19940,922],{"class":921},[164,19942,925],{"class":384},[164,19944,421],{"class":255},[164,19946,19947,19949,19951],{"class":166,"line":583},[164,19948,932],{"class":384},[164,19950,388],{"class":255},[164,19952,378],{"class":255},[164,19954,19955,19957,19959,19961,19963,19965,19967,19969,19971],{"class":166,"line":589},[164,19956,941],{"class":384},[164,19958,388],{"class":255},[164,19960,729],{"class":255},[164,19962,948],{"class":362},[164,19964,411],{"class":384},[164,19966,405],{"class":255},[164,19968,955],{"class":362},[164,19970,411],{"class":384},[164,19972,421],{"class":255},[164,19974,19975,19977,19979,19981,19983,19985],{"class":166,"line":615},[164,19976,964],{"class":384},[164,19978,388],{"class":255},[164,19980,285],{"class":255},[164,19982,971],{"class":288},[164,19984,368],{"class":255},[164,19986,421],{"class":255},[164,19988,19989],{"class":166,"line":978},[164,19990,981],{"class":255},[164,19992,19993,19995],{"class":166,"line":984},[164,19994,987],{"class":255},[164,19996,532],{"class":384},[164,19998,19999,20001],{"class":166,"line":992},[164,20000,529],{"class":255},[164,20002,532],{"class":259},[164,20004,20005],{"class":166,"line":999},[164,20006,343],{"emptyLinePlaceholder":342},[164,20008,20009],{"class":166,"line":1004},[164,20010,1007],{"class":170},[164,20012,20013,20015,20017,20019,20021,20023],{"class":166,"line":1010},[164,20014,349],{"class":251},[164,20016,594],{"class":352},[164,20018,1017],{"class":597},[164,20020,601],{"class":255},[164,20022,604],{"class":255},[164,20024,1024],{"class":259},[149,20026,1028],{"id":1027},[154,20028,20029],{"className":156,"code":1031,"language":158,"meta":159,"style":159},[161,20030,20031,20035,20055,20075,20079,20083,20095,20099,20139,20169,20173,20191,20217,20221,20225,20237,20241,20245,20249,20261,20293,20335,20353,20375,20389,20405,20429,20437],{"__ignoreMap":159},[164,20032,20033],{"class":166,"line":167},[164,20034,1038],{"class":170},[164,20036,20037,20039,20041,20043,20045,20047,20049,20051,20053],{"class":166,"line":174},[164,20038,252],{"class":251},[164,20040,594],{"class":251},[164,20042,256],{"class":255},[164,20044,1017],{"class":259},[164,20046,279],{"class":255},[164,20048,282],{"class":251},[164,20050,285],{"class":255},[164,20052,1057],{"class":288},[164,20054,292],{"class":255},[164,20056,20057,20059,20061,20063,20065,20067,20069,20071,20073],{"class":166,"line":16},[164,20058,252],{"class":251},[164,20060,594],{"class":251},[164,20062,256],{"class":255},[164,20064,1070],{"class":259},[164,20066,279],{"class":255},[164,20068,282],{"class":251},[164,20070,285],{"class":255},[164,20072,710],{"class":288},[164,20074,292],{"class":255},[164,20076,20077],{"class":166,"line":185},[164,20078,343],{"emptyLinePlaceholder":342},[164,20080,20081],{"class":166,"line":191},[164,20082,1089],{"class":170},[164,20084,20085,20087,20089,20091,20093],{"class":166,"line":346},[164,20086,1094],{"class":352},[164,20088,1097],{"class":597},[164,20090,601],{"class":255},[164,20092,604],{"class":255},[164,20094,1104],{"class":259},[164,20096,20097],{"class":166,"line":381},[164,20098,343],{"emptyLinePlaceholder":342},[164,20100,20101,20103,20105,20107,20109,20111,20113,20115,20117,20119,20121,20123,20125,20127,20129,20131,20133,20135,20137],{"class":166,"line":424},[164,20102,1113],{"class":352},[164,20104,1116],{"class":352},[164,20106,1119],{"class":362},[164,20108,1122],{"class":255},[164,20110,1125],{"class":597},[164,20112,1128],{"class":255},[164,20114,1131],{"class":791},[164,20116,388],{"class":255},[164,20118,1136],{"class":597},[164,20120,263],{"class":255},[164,20122,1141],{"class":791},[164,20124,1144],{"class":255},[164,20126,1147],{"class":597},[164,20128,1150],{"class":255},[164,20130,1153],{"class":597},[164,20132,1122],{"class":255},[164,20134,1125],{"class":597},[164,20136,1160],{"class":255},[164,20138,378],{"class":255},[164,20140,20141,20143,20145,20147,20149,20151,20153,20155,20157,20159,20161,20163,20165,20167],{"class":166,"line":461},[164,20142,804],{"class":352},[164,20144,1169],{"class":259},[164,20146,601],{"class":255},[164,20148,853],{"class":251},[164,20150,1176],{"class":362},[164,20152,365],{"class":384},[164,20154,1181],{"class":255},[164,20156,1184],{"class":288},[164,20158,1187],{"class":255},[164,20160,1131],{"class":259},[164,20162,1192],{"class":255},[164,20164,263],{"class":255},[164,20166,1141],{"class":259},[164,20168,532],{"class":384},[164,20170,20171],{"class":166,"line":490},[164,20172,343],{"emptyLinePlaceholder":342},[164,20174,20175,20177,20179,20181,20183,20185,20187,20189],{"class":166,"line":526},[164,20176,1207],{"class":251},[164,20178,788],{"class":384},[164,20180,1212],{"class":255},[164,20182,1215],{"class":259},[164,20184,405],{"class":255},[164,20186,1220],{"class":259},[164,20188,1223],{"class":384},[164,20190,906],{"class":255},[164,20192,20193,20195,20197,20199,20201,20203,20205,20207,20209,20211,20213,20215],{"class":166,"line":535},[164,20194,1230],{"class":251},[164,20196,729],{"class":255},[164,20198,1235],{"class":362},[164,20200,365],{"class":384},[164,20202,1181],{"class":255},[164,20204,1242],{"class":288},[164,20206,1187],{"class":255},[164,20208,1215],{"class":259},[164,20210,405],{"class":255},[164,20212,1251],{"class":259},[164,20214,1192],{"class":255},[164,20216,532],{"class":384},[164,20218,20219],{"class":166,"line":29},[164,20220,1260],{"class":255},[164,20222,20223],{"class":166,"line":545},[164,20224,343],{"emptyLinePlaceholder":342},[164,20226,20227,20229,20231,20233,20235],{"class":166,"line":562},[164,20228,895],{"class":251},[164,20230,1169],{"class":259},[164,20232,405],{"class":255},[164,20234,773],{"class":362},[164,20236,734],{"class":384},[164,20238,20239],{"class":166,"line":578},[164,20240,1281],{"class":255},[164,20242,20243],{"class":166,"line":583},[164,20244,343],{"emptyLinePlaceholder":342},[164,20246,20247],{"class":166,"line":589},[164,20248,1290],{"class":170},[164,20250,20251,20253,20255,20257,20259],{"class":166,"line":615},[164,20252,349],{"class":251},[164,20254,353],{"class":352},[164,20256,1299],{"class":259},[164,20258,359],{"class":255},[164,20260,378],{"class":255},[164,20262,20263,20265,20267,20269,20271,20273,20275,20277,20279,20281,20283,20285,20287,20289,20291],{"class":166,"line":978},[164,20264,1308],{"class":362},[164,20266,388],{"class":255},[164,20268,1313],{"class":255},[164,20270,797],{"class":352},[164,20272,1119],{"class":362},[164,20274,1122],{"class":255},[164,20276,1322],{"class":597},[164,20278,1325],{"class":259},[164,20280,1160],{"class":255},[164,20282,365],{"class":259},[164,20284,368],{"class":255},[164,20286,1334],{"class":288},[164,20288,368],{"class":255},[164,20290,402],{"class":259},[164,20292,421],{"class":255},[164,20294,20295,20297,20299,20301,20303,20305,20307,20309,20311,20313,20315,20317,20319,20321,20323,20325,20327,20329,20331,20333],{"class":166,"line":984},[164,20296,1345],{"class":362},[164,20298,388],{"class":255},[164,20300,788],{"class":255},[164,20302,397],{"class":791},[164,20304,388],{"class":255},[164,20306,1136],{"class":597},[164,20308,402],{"class":255},[164,20310,797],{"class":352},[164,20312,1119],{"class":362},[164,20314,1122],{"class":255},[164,20316,1322],{"class":597},[164,20318,1160],{"class":255},[164,20320,365],{"class":259},[164,20322,1181],{"class":255},[164,20324,1374],{"class":288},[164,20326,1187],{"class":255},[164,20328,397],{"class":259},[164,20330,1192],{"class":255},[164,20332,402],{"class":259},[164,20334,421],{"class":255},[164,20336,20337,20339,20341,20343,20345,20347,20349,20351],{"class":166,"line":992},[164,20338,1389],{"class":362},[164,20340,388],{"class":255},[164,20342,788],{"class":255},[164,20344,877],{"class":791},[164,20346,388],{"class":255},[164,20348,622],{"class":597},[164,20350,402],{"class":255},[164,20352,1404],{"class":352},[164,20354,20355,20357,20359,20361,20363,20365,20367,20369,20371,20373],{"class":166,"line":999},[164,20356,1409],{"class":362},[164,20358,1122],{"class":255},[164,20360,1322],{"class":597},[164,20362,1160],{"class":255},[164,20364,365],{"class":259},[164,20366,368],{"class":255},[164,20368,1334],{"class":288},[164,20370,368],{"class":255},[164,20372,263],{"class":255},[164,20374,378],{"class":255},[164,20376,20377,20379,20381,20383,20385,20387],{"class":166,"line":1004},[164,20378,1432],{"class":384},[164,20380,388],{"class":255},[164,20382,285],{"class":255},[164,20384,1439],{"class":288},[164,20386,368],{"class":255},[164,20388,421],{"class":255},[164,20390,20391,20393,20395,20397,20399,20401,20403],{"class":166,"line":1010},[164,20392,1448],{"class":384},[164,20394,388],{"class":255},[164,20396,1453],{"class":259},[164,20398,405],{"class":255},[164,20400,1458],{"class":362},[164,20402,1461],{"class":259},[164,20404,421],{"class":255},[164,20406,20407,20409,20411,20413,20415,20417,20419,20421,20423,20425,20427],{"class":166,"line":1466},[164,20408,1469],{"class":384},[164,20410,388],{"class":255},[164,20412,256],{"class":255},[164,20414,285],{"class":255},[164,20416,1478],{"class":384},[164,20418,368],{"class":255},[164,20420,388],{"class":255},[164,20422,285],{"class":255},[164,20424,1487],{"class":288},[164,20426,368],{"class":255},[164,20428,1492],{"class":255},[164,20430,20431,20433,20435],{"class":166,"line":1495},[164,20432,1498],{"class":255},[164,20434,402],{"class":259},[164,20436,421],{"class":255},[164,20438,20439],{"class":166,"line":1505},[164,20440,1281],{"class":255},[149,20442,1511],{"id":1510},[154,20444,20445],{"className":156,"code":1514,"language":158,"meta":159,"style":159},[161,20446,20447,20451,20467,20485,20505,20509,20513,20551,20561,20565,20569,20573,20597,20605,20613,20631,20639,20643,20647,20659,20687,20691,20697],{"__ignoreMap":159},[164,20448,20449],{"class":166,"line":167},[164,20450,1521],{"class":170},[164,20452,20453,20455,20457,20459,20461,20463,20465],{"class":166,"line":174},[164,20454,1122],{"class":255},[164,20456,1528],{"class":259},[164,20458,359],{"class":255},[164,20460,368],{"class":255},[164,20462,1535],{"class":288},[164,20464,368],{"class":255},[164,20466,1540],{"class":255},[164,20468,20469,20471,20473,20475,20477,20479,20481,20483],{"class":166,"line":16},[164,20470,252],{"class":251},[164,20472,256],{"class":255},[164,20474,1549],{"class":259},[164,20476,279],{"class":255},[164,20478,282],{"class":251},[164,20480,1556],{"class":255},[164,20482,1559],{"class":288},[164,20484,1562],{"class":255},[164,20486,20487,20489,20491,20493,20495,20497,20499,20501,20503],{"class":166,"line":185},[164,20488,252],{"class":251},[164,20490,594],{"class":251},[164,20492,256],{"class":255},[164,20494,598],{"class":259},[164,20496,279],{"class":255},[164,20498,282],{"class":251},[164,20500,1556],{"class":255},[164,20502,710],{"class":288},[164,20504,1562],{"class":255},[164,20506,20507],{"class":166,"line":191},[164,20508,343],{"emptyLinePlaceholder":342},[164,20510,20511],{"class":166,"line":346},[164,20512,1591],{"class":170},[164,20514,20515,20517,20519,20521,20523,20525,20527,20529,20531,20533,20535,20537,20539,20541,20543,20545,20547,20549],{"class":166,"line":381},[164,20516,721],{"class":352},[164,20518,256],{"class":255},[164,20520,807],{"class":384},[164,20522,388],{"class":255},[164,20524,607],{"class":259},[164,20526,263],{"class":255},[164,20528,1608],{"class":259},[164,20530,529],{"class":255},[164,20532,601],{"class":255},[164,20534,853],{"class":251},[164,20536,1617],{"class":362},[164,20538,365],{"class":259},[164,20540,1622],{"class":255},[164,20542,371],{"class":288},[164,20544,1622],{"class":255},[164,20546,263],{"class":255},[164,20548,1313],{"class":255},[164,20550,1404],{"class":352},[164,20552,20553,20555,20557,20559],{"class":166,"line":424},[164,20554,1637],{"class":259},[164,20556,405],{"class":255},[164,20558,1642],{"class":362},[164,20560,734],{"class":259},[164,20562,20563],{"class":166,"line":461},[164,20564,532],{"class":259},[164,20566,20567],{"class":166,"line":490},[164,20568,343],{"emptyLinePlaceholder":342},[164,20570,20571],{"class":166,"line":526},[164,20572,1657],{"class":170},[164,20574,20575,20577,20579,20581,20583,20585,20587,20589,20591,20593,20595],{"class":166,"line":535},[164,20576,721],{"class":352},[164,20578,1664],{"class":259},[164,20580,359],{"class":255},[164,20582,1669],{"class":362},[164,20584,1672],{"class":255},[164,20586,848],{"class":384},[164,20588,388],{"class":255},[164,20590,598],{"class":597},[164,20592,1681],{"class":255},[164,20594,365],{"class":259},[164,20596,906],{"class":255},[164,20598,20599,20601,20603],{"class":166,"line":29},[164,20600,1690],{"class":384},[164,20602,388],{"class":255},[164,20604,378],{"class":255},[164,20606,20607,20609,20611],{"class":166,"line":545},[164,20608,1699],{"class":384},[164,20610,388],{"class":255},[164,20612,378],{"class":255},[164,20614,20615,20617,20619,20621,20623,20625,20627,20629],{"class":166,"line":562},[164,20616,1708],{"class":384},[164,20618,388],{"class":255},[164,20620,1713],{"class":259},[164,20622,1716],{"class":251},[164,20624,1719],{"class":597},[164,20626,1122],{"class":255},[164,20628,1724],{"class":597},[164,20630,1727],{"class":255},[164,20632,20633,20635,20637],{"class":166,"line":578},[164,20634,1732],{"class":384},[164,20636,388],{"class":255},[164,20638,1738],{"class":1737},[164,20640,20641],{"class":166,"line":583},[164,20642,1743],{"class":255},[164,20644,20645],{"class":166,"line":589},[164,20646,1748],{"class":255},[164,20648,20649,20651,20653,20655,20657],{"class":166,"line":615},[164,20650,1753],{"class":384},[164,20652,1756],{"class":255},[164,20654,848],{"class":791},[164,20656,1761],{"class":255},[164,20658,378],{"class":255},[164,20660,20661,20663,20665,20667,20669,20671,20673,20675,20677,20679,20681,20683,20685],{"class":166,"line":978},[164,20662,1768],{"class":251},[164,20664,1313],{"class":255},[164,20666,797],{"class":352},[164,20668,1775],{"class":362},[164,20670,365],{"class":384},[164,20672,1622],{"class":255},[164,20674,1782],{"class":288},[164,20676,1622],{"class":255},[164,20678,263],{"class":255},[164,20680,848],{"class":259},[164,20682,405],{"class":255},[164,20684,475],{"class":259},[164,20686,532],{"class":384},[164,20688,20689],{"class":166,"line":984},[164,20690,1260],{"class":255},[164,20692,20693,20695],{"class":166,"line":992},[164,20694,529],{"class":255},[164,20696,532],{"class":259},[164,20698,20699,20701,20703],{"class":166,"line":999},[164,20700,1809],{"class":255},[164,20702,1812],{"class":259},[164,20704,1540],{"class":255},[98,20706,1818],{"id":1817},[149,20708,1822],{"id":1821},[154,20710,20711],{"className":156,"code":1825,"language":158,"meta":159,"style":159},[161,20712,20713,20717,20735,20739,20743,20777,20789,20799,20815,20837,20853,20875,20883,20889,20893],{"__ignoreMap":159},[164,20714,20715],{"class":166,"line":167},[164,20716,1832],{"class":170},[164,20718,20719,20721,20723,20725,20727,20729,20731,20733],{"class":166,"line":174},[164,20720,252],{"class":251},[164,20722,256],{"class":255},[164,20724,326],{"class":259},[164,20726,279],{"class":255},[164,20728,282],{"class":251},[164,20730,285],{"class":255},[164,20732,335],{"class":288},[164,20734,292],{"class":255},[164,20736,20737],{"class":166,"line":16},[164,20738,343],{"emptyLinePlaceholder":342},[164,20740,20741],{"class":166,"line":185},[164,20742,1859],{"class":170},[164,20744,20745,20747,20749,20751,20753,20755,20757,20759,20761,20763,20765,20767,20769,20771,20773,20775],{"class":166,"line":191},[164,20746,349],{"class":251},[164,20748,353],{"class":352},[164,20750,1868],{"class":259},[164,20752,359],{"class":255},[164,20754,1873],{"class":255},[164,20756,1125],{"class":597},[164,20758,1878],{"class":352},[164,20760,326],{"class":597},[164,20762,405],{"class":255},[164,20764,1885],{"class":597},[164,20766,1128],{"class":255},[164,20768,1890],{"class":791},[164,20770,388],{"class":255},[164,20772,1895],{"class":597},[164,20774,402],{"class":255},[164,20776,1404],{"class":352},[164,20778,20779,20781,20783,20785,20787],{"class":166,"line":346},[164,20780,1904],{"class":259},[164,20782,405],{"class":255},[164,20784,1909],{"class":362},[164,20786,365],{"class":259},[164,20788,906],{"class":255},[164,20790,20791,20793,20795,20797],{"class":166,"line":381},[164,20792,911],{"class":384},[164,20794,388],{"class":255},[164,20796,1922],{"class":259},[164,20798,421],{"class":255},[164,20800,20801,20803,20805,20807,20809,20811,20813],{"class":166,"line":424},[164,20802,932],{"class":384},[164,20804,388],{"class":255},[164,20806,326],{"class":259},[164,20808,405],{"class":255},[164,20810,1909],{"class":362},[164,20812,365],{"class":259},[164,20814,906],{"class":255},[164,20816,20817,20819,20821,20823,20825,20827,20829,20831,20833,20835],{"class":166,"line":461},[164,20818,941],{"class":384},[164,20820,388],{"class":255},[164,20822,326],{"class":259},[164,20824,405],{"class":255},[164,20826,1953],{"class":362},[164,20828,411],{"class":259},[164,20830,405],{"class":255},[164,20832,1960],{"class":362},[164,20834,411],{"class":259},[164,20836,421],{"class":255},[164,20838,20839,20841,20843,20845,20847,20849,20851],{"class":166,"line":490},[164,20840,964],{"class":384},[164,20842,388],{"class":255},[164,20844,326],{"class":259},[164,20846,405],{"class":255},[164,20848,1953],{"class":362},[164,20850,411],{"class":259},[164,20852,421],{"class":255},[164,20854,20855,20857,20859,20861,20863,20865,20867,20869,20871,20873],{"class":166,"line":526},[164,20856,1985],{"class":384},[164,20858,388],{"class":255},[164,20860,326],{"class":259},[164,20862,405],{"class":255},[164,20864,1953],{"class":362},[164,20866,411],{"class":259},[164,20868,405],{"class":255},[164,20870,2000],{"class":362},[164,20872,411],{"class":259},[164,20874,421],{"class":255},[164,20876,20877,20879,20881],{"class":166,"line":535},[164,20878,1498],{"class":255},[164,20880,402],{"class":259},[164,20882,421],{"class":255},[164,20884,20885,20887],{"class":166,"line":29},[164,20886,987],{"class":255},[164,20888,532],{"class":259},[164,20890,20891],{"class":166,"line":545},[164,20892,343],{"emptyLinePlaceholder":342},[164,20894,20895,20897,20899,20901,20903,20905,20907,20909,20911,20913,20915,20917,20919,20921,20923,20925,20927],{"class":166,"line":562},[164,20896,349],{"class":251},[164,20898,594],{"class":352},[164,20900,2031],{"class":597},[164,20902,1122],{"class":255},[164,20904,1125],{"class":597},[164,20906,1160],{"class":255},[164,20908,601],{"class":255},[164,20910,326],{"class":597},[164,20912,405],{"class":255},[164,20914,2046],{"class":597},[164,20916,1122],{"class":255},[164,20918,2051],{"class":597},[164,20920,2054],{"class":255},[164,20922,2057],{"class":259},[164,20924,1122],{"class":255},[164,20926,1125],{"class":597},[164,20928,2064],{"class":255},[149,20930,2068],{"id":2067},[154,20932,20933],{"className":156,"code":2071,"language":158,"meta":159,"style":159},[161,20934,20935,20939,20957,20961,20979,21001,21027,21067,21073,21077,21099],{"__ignoreMap":159},[164,20936,20937],{"class":166,"line":167},[164,20938,2078],{"class":170},[164,20940,20941,20943,20945,20947,20949,20951,20953,20955],{"class":166,"line":174},[164,20942,252],{"class":251},[164,20944,256],{"class":255},[164,20946,326],{"class":259},[164,20948,279],{"class":255},[164,20950,282],{"class":251},[164,20952,285],{"class":255},[164,20954,335],{"class":288},[164,20956,292],{"class":255},[164,20958,20959],{"class":166,"line":16},[164,20960,343],{"emptyLinePlaceholder":342},[164,20962,20963,20965,20967,20969,20971,20973,20975,20977],{"class":166,"line":185},[164,20964,721],{"class":352},[164,20966,2107],{"class":259},[164,20968,359],{"class":255},[164,20970,326],{"class":259},[164,20972,405],{"class":255},[164,20974,1909],{"class":362},[164,20976,365],{"class":259},[164,20978,906],{"class":255},[164,20980,20981,20983,20985,20987,20989,20991,20993,20995,20997,20999],{"class":166,"line":191},[164,20982,2124],{"class":384},[164,20984,388],{"class":255},[164,20986,326],{"class":259},[164,20988,405],{"class":255},[164,20990,1953],{"class":362},[164,20992,411],{"class":259},[164,20994,405],{"class":255},[164,20996,2139],{"class":362},[164,20998,411],{"class":259},[164,21000,421],{"class":255},[164,21002,21003,21005,21007,21009,21011,21013,21015,21017,21019,21021,21023,21025],{"class":166,"line":346},[164,21004,2148],{"class":384},[164,21006,388],{"class":255},[164,21008,326],{"class":259},[164,21010,405],{"class":255},[164,21012,1953],{"class":362},[164,21014,411],{"class":259},[164,21016,405],{"class":255},[164,21018,2163],{"class":362},[164,21020,365],{"class":259},[164,21022,2168],{"class":921},[164,21024,402],{"class":259},[164,21026,421],{"class":255},[164,21028,21029,21031,21033,21035,21037,21039,21041,21043,21045,21047,21049,21051,21053,21055,21057,21059,21061,21063,21065],{"class":166,"line":381},[164,21030,2177],{"class":384},[164,21032,388],{"class":255},[164,21034,326],{"class":259},[164,21036,405],{"class":255},[164,21038,2186],{"class":362},[164,21040,2189],{"class":259},[164,21042,368],{"class":255},[164,21044,2194],{"class":288},[164,21046,368],{"class":255},[164,21048,263],{"class":255},[164,21050,285],{"class":255},[164,21052,2203],{"class":288},[164,21054,368],{"class":255},[164,21056,263],{"class":255},[164,21058,285],{"class":255},[164,21060,2212],{"class":288},[164,21062,368],{"class":255},[164,21064,2217],{"class":259},[164,21066,421],{"class":255},[164,21068,21069,21071],{"class":166,"line":424},[164,21070,529],{"class":255},[164,21072,532],{"class":259},[164,21074,21075],{"class":166,"line":461},[164,21076,343],{"emptyLinePlaceholder":342},[164,21078,21079,21081,21083,21085,21087,21089,21091,21093,21095,21097],{"class":166,"line":490},[164,21080,349],{"class":251},[164,21082,353],{"class":352},[164,21084,2238],{"class":259},[164,21086,359],{"class":255},[164,21088,2243],{"class":259},[164,21090,405],{"class":255},[164,21092,2248],{"class":362},[164,21094,2251],{"class":259},[164,21096,405],{"class":255},[164,21098,2256],{"class":259},[164,21100,21101,21103,21105,21107,21109,21111,21113,21115,21117,21119],{"class":166,"line":526},[164,21102,349],{"class":251},[164,21104,594],{"class":352},[164,21106,2265],{"class":597},[164,21108,601],{"class":255},[164,21110,326],{"class":597},[164,21112,405],{"class":255},[164,21114,2046],{"class":597},[164,21116,2054],{"class":255},[164,21118,2243],{"class":259},[164,21120,1540],{"class":255},[149,21122,2283],{"id":2282},[154,21124,21125],{"className":156,"code":2286,"language":158,"meta":159,"style":159},[161,21126,21127,21131,21149,21153,21167,21175,21179,21183,21187,21191,21195,21199,21203,21207,21211,21225,21237],{"__ignoreMap":159},[164,21128,21129],{"class":166,"line":167},[164,21130,2293],{"class":170},[164,21132,21133,21135,21137,21139,21141,21143,21145,21147],{"class":166,"line":174},[164,21134,252],{"class":251},[164,21136,256],{"class":255},[164,21138,2302],{"class":259},[164,21140,279],{"class":255},[164,21142,282],{"class":251},[164,21144,285],{"class":255},[164,21146,2311],{"class":288},[164,21148,292],{"class":255},[164,21150,21151],{"class":166,"line":16},[164,21152,343],{"emptyLinePlaceholder":342},[164,21154,21155,21157,21159,21161,21163,21165],{"class":166,"line":185},[164,21156,349],{"class":251},[164,21158,785],{"class":352},[164,21160,1116],{"class":352},[164,21162,2328],{"class":362},[164,21164,411],{"class":255},[164,21166,378],{"class":255},[164,21168,21169,21171,21173],{"class":166,"line":191},[164,21170,2337],{"class":251},[164,21172,2302],{"class":362},[164,21174,2342],{"class":255},[164,21176,21177],{"class":166,"line":346},[164,21178,2347],{"class":288},[164,21180,21181],{"class":166,"line":381},[164,21182,2352],{"class":288},[164,21184,21185],{"class":166,"line":424},[164,21186,2357],{"class":288},[164,21188,21189],{"class":166,"line":461},[164,21190,2362],{"class":288},[164,21192,21193],{"class":166,"line":490},[164,21194,2367],{"class":288},[164,21196,21197],{"class":166,"line":526},[164,21198,2372],{"class":288},[164,21200,21201],{"class":166,"line":535},[164,21202,2377],{"class":255},[164,21204,21205],{"class":166,"line":29},[164,21206,1281],{"class":255},[164,21208,21209],{"class":166,"line":545},[164,21210,343],{"emptyLinePlaceholder":342},[164,21212,21213,21215,21217,21219,21221,21223],{"class":166,"line":562},[164,21214,349],{"class":251},[164,21216,785],{"class":352},[164,21218,1116],{"class":352},[164,21220,2396],{"class":362},[164,21222,411],{"class":255},[164,21224,378],{"class":255},[164,21226,21227,21229,21231,21233,21235],{"class":166,"line":578},[164,21228,2337],{"class":251},[164,21230,2302],{"class":362},[164,21232,1181],{"class":255},[164,21234,2411],{"class":288},[164,21236,2342],{"class":255},[164,21238,21239],{"class":166,"line":583},[164,21240,1281],{"class":255},[98,21242,2421],{"id":2420},[149,21244,2425],{"id":2424},[154,21246,21247],{"className":156,"code":2428,"language":158,"meta":159,"style":159},[161,21248,21249,21253,21277,21303,21329,21349,21375,21405,21441],{"__ignoreMap":159},[164,21250,21251],{"class":166,"line":167},[164,21252,2435],{"class":170},[164,21254,21255,21257,21259,21261,21263,21265,21267,21269,21271,21273,21275],{"class":166,"line":174},[164,21256,349],{"class":251},[164,21258,353],{"class":352},[164,21260,2444],{"class":259},[164,21262,359],{"class":255},[164,21264,260],{"class":362},[164,21266,365],{"class":259},[164,21268,368],{"class":255},[164,21270,2455],{"class":288},[164,21272,368],{"class":255},[164,21274,263],{"class":255},[164,21276,378],{"class":255},[164,21278,21279,21281,21283,21285,21287,21289,21291,21293,21295,21297,21299,21301],{"class":166,"line":16},[164,21280,385],{"class":384},[164,21282,388],{"class":255},[164,21284,276],{"class":362},[164,21286,365],{"class":259},[164,21288,368],{"class":255},[164,21290,397],{"class":288},[164,21292,368],{"class":255},[164,21294,402],{"class":259},[164,21296,405],{"class":255},[164,21298,408],{"class":362},[164,21300,411],{"class":259},[164,21302,421],{"class":255},[164,21304,21305,21307,21309,21311,21313,21315,21317,21319,21321,21323,21325,21327],{"class":166,"line":185},[164,21306,464],{"class":384},[164,21308,388],{"class":255},[164,21310,266],{"class":362},[164,21312,365],{"class":259},[164,21314,368],{"class":255},[164,21316,475],{"class":288},[164,21318,368],{"class":255},[164,21320,402],{"class":259},[164,21322,405],{"class":255},[164,21324,447],{"class":362},[164,21326,411],{"class":259},[164,21328,421],{"class":255},[164,21330,21331,21333,21335,21337,21339,21341,21343,21345,21347],{"class":166,"line":191},[164,21332,2518],{"class":384},[164,21334,388],{"class":255},[164,21336,266],{"class":362},[164,21338,365],{"class":259},[164,21340,368],{"class":255},[164,21342,2529],{"class":288},[164,21344,368],{"class":255},[164,21346,402],{"class":259},[164,21348,421],{"class":255},[164,21350,21351,21353,21355,21357,21359,21361,21363,21365,21367,21369,21371,21373],{"class":166,"line":346},[164,21352,2540],{"class":384},[164,21354,388],{"class":255},[164,21356,2545],{"class":362},[164,21358,365],{"class":259},[164,21360,368],{"class":255},[164,21362,2552],{"class":288},[164,21364,368],{"class":255},[164,21366,402],{"class":259},[164,21368,405],{"class":255},[164,21370,447],{"class":362},[164,21372,411],{"class":259},[164,21374,421],{"class":255},[164,21376,21377,21379,21381,21383,21385,21387,21389,21391,21393,21395,21397,21399,21401,21403],{"class":166,"line":381},[164,21378,2569],{"class":384},[164,21380,388],{"class":255},[164,21382,2574],{"class":362},[164,21384,365],{"class":259},[164,21386,368],{"class":255},[164,21388,2581],{"class":288},[164,21390,368],{"class":255},[164,21392,402],{"class":259},[164,21394,405],{"class":255},[164,21396,2590],{"class":362},[164,21398,365],{"class":259},[164,21400,922],{"class":921},[164,21402,402],{"class":259},[164,21404,421],{"class":255},[164,21406,21407,21409,21411,21413,21415,21417,21419,21421,21423,21425,21427,21429,21431,21433,21435,21437,21439],{"class":166,"line":424},[164,21408,2603],{"class":384},[164,21410,388],{"class":255},[164,21412,276],{"class":362},[164,21414,365],{"class":259},[164,21416,368],{"class":255},[164,21418,2614],{"class":288},[164,21420,368],{"class":255},[164,21422,402],{"class":259},[164,21424,405],{"class":255},[164,21426,2623],{"class":362},[164,21428,365],{"class":259},[164,21430,411],{"class":255},[164,21432,797],{"class":352},[164,21434,2632],{"class":259},[164,21436,405],{"class":255},[164,21438,2637],{"class":259},[164,21440,421],{"class":255},[164,21442,21443,21445],{"class":166,"line":461},[164,21444,529],{"class":255},[164,21446,532],{"class":259},[149,21448,2649],{"id":2648},[154,21450,21451],{"className":156,"code":2652,"language":158,"meta":159,"style":159},[161,21452,21453,21457,21467,21477,21525,21539,21571,21575,21603,21627,21635,21645,21655,21659,21665,21669,21683,21713,21717,21721,21745,21749],{"__ignoreMap":159},[164,21454,21455],{"class":166,"line":167},[164,21456,2659],{"class":170},[164,21458,21459,21461,21463,21465],{"class":166,"line":174},[164,21460,748],{"class":259},[164,21462,405],{"class":255},[164,21464,2668],{"class":362},[164,21466,2671],{"class":259},[164,21468,21469,21471,21473,21475],{"class":166,"line":16},[164,21470,2676],{"class":255},[164,21472,2679],{"class":288},[164,21474,368],{"class":255},[164,21476,421],{"class":255},[164,21478,21479,21481,21483,21485,21487,21489,21491,21493,21495,21497,21499,21501,21503,21505,21507,21509,21511,21513,21515,21517,21519,21521,21523],{"class":166,"line":185},[164,21480,2688],{"class":362},[164,21482,365],{"class":259},[164,21484,368],{"class":255},[164,21486,2695],{"class":288},[164,21488,368],{"class":255},[164,21490,263],{"class":255},[164,21492,326],{"class":259},[164,21494,405],{"class":255},[164,21496,1909],{"class":362},[164,21498,365],{"class":259},[164,21500,2710],{"class":255},[164,21502,2713],{"class":384},[164,21504,388],{"class":255},[164,21506,326],{"class":259},[164,21508,405],{"class":255},[164,21510,1953],{"class":362},[164,21512,411],{"class":259},[164,21514,405],{"class":255},[164,21516,2000],{"class":362},[164,21518,2730],{"class":259},[164,21520,529],{"class":255},[164,21522,2735],{"class":259},[164,21524,421],{"class":255},[164,21526,21527,21529,21531,21533,21535,21537],{"class":166,"line":191},[164,21528,2742],{"class":352},[164,21530,788],{"class":255},[164,21532,792],{"class":791},[164,21534,402],{"class":255},[164,21536,797],{"class":352},[164,21538,378],{"class":255},[164,21540,21541,21543,21545,21547,21549,21551,21553,21555,21557,21559,21561,21563,21565,21567,21569],{"class":166,"line":346},[164,21542,2757],{"class":352},[164,21544,256],{"class":255},[164,21546,2713],{"class":259},[164,21548,279],{"class":255},[164,21550,601],{"class":255},[164,21552,812],{"class":259},[164,21554,405],{"class":255},[164,21556,817],{"class":259},[164,21558,405],{"class":255},[164,21560,822],{"class":362},[164,21562,365],{"class":384},[164,21564,368],{"class":255},[164,21566,2695],{"class":288},[164,21568,368],{"class":255},[164,21570,532],{"class":384},[164,21572,21573],{"class":166,"line":381},[164,21574,343],{"emptyLinePlaceholder":342},[164,21576,21577,21579,21581,21583,21585,21587,21589,21591,21593,21595,21597,21599,21601],{"class":166,"line":424},[164,21578,2757],{"class":352},[164,21580,2796],{"class":259},[164,21582,601],{"class":255},[164,21584,853],{"class":251},[164,21586,856],{"class":259},[164,21588,405],{"class":255},[164,21590,2807],{"class":259},[164,21592,405],{"class":255},[164,21594,2455],{"class":259},[164,21596,405],{"class":255},[164,21598,2816],{"class":362},[164,21600,365],{"class":384},[164,21602,906],{"class":255},[164,21604,21605,21607,21609,21611,21613,21615,21617,21619,21621,21623,21625],{"class":166,"line":461},[164,21606,2825],{"class":384},[164,21608,388],{"class":255},[164,21610,2830],{"class":362},[164,21612,365],{"class":384},[164,21614,2455],{"class":259},[164,21616,405],{"class":255},[164,21618,397],{"class":259},[164,21620,263],{"class":255},[164,21622,2713],{"class":259},[164,21624,402],{"class":384},[164,21626,421],{"class":255},[164,21628,21629,21631,21633],{"class":166,"line":490},[164,21630,2851],{"class":384},[164,21632,388],{"class":255},[164,21634,378],{"class":255},[164,21636,21637,21639,21641,21643],{"class":166,"line":526},[164,21638,2860],{"class":384},[164,21640,388],{"class":255},[164,21642,2865],{"class":1737},[164,21644,421],{"class":255},[164,21646,21647,21649,21651,21653],{"class":166,"line":535},[164,21648,2872],{"class":384},[164,21650,388],{"class":255},[164,21652,2865],{"class":1737},[164,21654,421],{"class":255},[164,21656,21657],{"class":166,"line":29},[164,21658,2883],{"class":255},[164,21660,21661,21663],{"class":166,"line":545},[164,21662,1498],{"class":255},[164,21664,532],{"class":384},[164,21666,21667],{"class":166,"line":562},[164,21668,343],{"emptyLinePlaceholder":342},[164,21670,21671,21673,21675,21677,21679,21681],{"class":166,"line":578},[164,21672,2898],{"class":251},[164,21674,788],{"class":384},[164,21676,1212],{"class":255},[164,21678,2905],{"class":259},[164,21680,1223],{"class":384},[164,21682,906],{"class":255},[164,21684,21685,21687,21689,21691,21693,21695,21697,21699,21701,21703,21705,21707,21709,21711],{"class":166,"line":583},[164,21686,2914],{"class":251},[164,21688,812],{"class":259},[164,21690,405],{"class":255},[164,21692,773],{"class":362},[164,21694,365],{"class":384},[164,21696,2710],{"class":255},[164,21698,2927],{"class":384},[164,21700,388],{"class":255},[164,21702,285],{"class":255},[164,21704,2934],{"class":288},[164,21706,368],{"class":255},[164,21708,2939],{"class":255},[164,21710,2942],{"class":921},[164,21712,532],{"class":384},[164,21714,21715],{"class":166,"line":589},[164,21716,1743],{"class":255},[164,21718,21719],{"class":166,"line":615},[164,21720,343],{"emptyLinePlaceholder":342},[164,21722,21723,21725,21727,21729,21731,21733,21735,21737,21739,21741,21743],{"class":166,"line":978},[164,21724,1768],{"class":251},[164,21726,812],{"class":259},[164,21728,405],{"class":255},[164,21730,773],{"class":362},[164,21732,365],{"class":384},[164,21734,2710],{"class":255},[164,21736,807],{"class":384},[164,21738,388],{"class":255},[164,21740,2796],{"class":259},[164,21742,279],{"class":255},[164,21744,532],{"class":384},[164,21746,21747],{"class":166,"line":984},[164,21748,1748],{"class":255},[164,21750,21751],{"class":166,"line":992},[164,21752,532],{"class":259},[149,21754,2988],{"id":2987},[154,21756,21757],{"className":2991,"code":2992,"language":2993,"meta":159,"style":159},[161,21758,21759,21763,21783,21803,21807,21819,21827,21833,21837,21853,21875,21889,21903,21929,21933,21941,21945,21953,21971,21987,22003,22011],{"__ignoreMap":159},[164,21760,21761],{"class":166,"line":167},[164,21762,3000],{"class":170},[164,21764,21765,21767,21769,21771,21773,21775,21777,21779,21781],{"class":166,"line":174},[164,21766,1122],{"class":255},[164,21768,1812],{"class":384},[164,21770,3009],{"class":352},[164,21772,3012],{"class":352},[164,21774,359],{"class":255},[164,21776,368],{"class":255},[164,21778,1535],{"class":288},[164,21780,368],{"class":255},[164,21782,1540],{"class":255},[164,21784,21785,21787,21789,21791,21793,21795,21797,21799,21801],{"class":166,"line":16},[164,21786,252],{"class":251},[164,21788,594],{"class":251},[164,21790,256],{"class":255},[164,21792,3033],{"class":259},[164,21794,279],{"class":255},[164,21796,282],{"class":251},[164,21798,285],{"class":255},[164,21800,710],{"class":288},[164,21802,292],{"class":255},[164,21804,21805],{"class":166,"line":185},[164,21806,343],{"emptyLinePlaceholder":342},[164,21808,21809,21811,21813,21815,21817],{"class":166,"line":191},[164,21810,721],{"class":352},[164,21812,3054],{"class":259},[164,21814,359],{"class":255},[164,21816,3059],{"class":362},[164,21818,3062],{"class":255},[164,21820,21821,21823,21825],{"class":166,"line":346},[164,21822,3067],{"class":384},[164,21824,388],{"class":255},[164,21826,3072],{"class":597},[164,21828,21829,21831],{"class":166,"line":381},[164,21830,3077],{"class":255},[164,21832,734],{"class":259},[164,21834,21835],{"class":166,"line":424},[164,21836,343],{"emptyLinePlaceholder":342},[164,21838,21839,21841,21843,21845,21847,21849,21851],{"class":166,"line":461},[164,21840,721],{"class":352},[164,21842,3090],{"class":259},[164,21844,359],{"class":255},[164,21846,3095],{"class":362},[164,21848,365],{"class":259},[164,21850,411],{"class":255},[164,21852,1404],{"class":352},[164,21854,21855,21857,21859,21861,21863,21865,21867,21869,21871,21873],{"class":166,"line":490},[164,21856,3106],{"class":255},[164,21858,3109],{"class":259},[164,21860,405],{"class":255},[164,21862,3114],{"class":362},[164,21864,365],{"class":259},[164,21866,368],{"class":255},[164,21868,3121],{"class":288},[164,21870,368],{"class":255},[164,21872,263],{"class":255},[164,21874,378],{"class":255},[164,21876,21877,21879,21881,21883,21885,21887],{"class":166,"line":526},[164,21878,3132],{"class":384},[164,21880,388],{"class":255},[164,21882,285],{"class":255},[164,21884,3139],{"class":288},[164,21886,368],{"class":255},[164,21888,421],{"class":255},[164,21890,21891,21893,21895,21897,21899,21901],{"class":166,"line":535},[164,21892,3148],{"class":384},[164,21894,388],{"class":255},[164,21896,285],{"class":255},[164,21898,41],{"class":288},[164,21900,368],{"class":255},[164,21902,421],{"class":255},[164,21904,21905,21907,21909,21911,21913,21915,21917,21919,21921,21923,21925,21927],{"class":166,"line":29},[164,21906,987],{"class":255},[164,21908,402],{"class":259},[164,21910,405],{"class":255},[164,21912,3169],{"class":362},[164,21914,365],{"class":259},[164,21916,3174],{"class":362},[164,21918,3177],{"class":259},[164,21920,405],{"class":255},[164,21922,2905],{"class":259},[164,21924,405],{"class":255},[164,21926,3186],{"class":259},[164,21928,421],{"class":255},[164,21930,21931],{"class":166,"line":545},[164,21932,532],{"class":259},[164,21934,21935,21937,21939],{"class":166,"line":562},[164,21936,1809],{"class":255},[164,21938,1812],{"class":384},[164,21940,1540],{"class":255},[164,21942,21943],{"class":166,"line":578},[164,21944,343],{"emptyLinePlaceholder":342},[164,21946,21947,21949,21951],{"class":166,"line":583},[164,21948,1122],{"class":255},[164,21950,3211],{"class":384},[164,21952,1540],{"class":255},[164,21954,21955,21957,21959,21961,21963,21965,21967,21969],{"class":166,"line":589},[164,21956,3218],{"class":255},[164,21958,1782],{"class":384},[164,21960,3223],{"class":352},[164,21962,359],{"class":255},[164,21964,368],{"class":255},[164,21966,3230],{"class":288},[164,21968,368],{"class":255},[164,21970,1540],{"class":255},[164,21972,21973,21975,21977,21979,21981,21983,21985],{"class":166,"line":615},[164,21974,3239],{"class":255},[164,21976,149],{"class":384},[164,21978,1160],{"class":255},[164,21980,3246],{"class":259},[164,21982,1809],{"class":255},[164,21984,149],{"class":384},[164,21986,1540],{"class":255},[164,21988,21989,21991,21993,21995,21997,21999,22001],{"class":166,"line":978},[164,21990,3239],{"class":255},[164,21992,102],{"class":384},[164,21994,1160],{"class":255},[164,21996,3263],{"class":259},[164,21998,1809],{"class":255},[164,22000,102],{"class":384},[164,22002,1540],{"class":255},[164,22004,22005,22007,22009],{"class":166,"line":984},[164,22006,3274],{"class":255},[164,22008,1782],{"class":384},[164,22010,1540],{"class":255},[164,22012,22013,22015,22017],{"class":166,"line":992},[164,22014,1809],{"class":255},[164,22016,3211],{"class":384},[164,22018,1540],{"class":255},[98,22020,3290],{"id":3289},[149,22022,3294],{"id":3293},[154,22024,22025],{"className":156,"code":3297,"language":158,"meta":159,"style":159},[161,22026,22027,22031,22047,22051,22055],{"__ignoreMap":159},[164,22028,22029],{"class":166,"line":167},[164,22030,3304],{"class":170},[164,22032,22033,22035,22037,22039,22041,22043,22045],{"class":166,"line":174},[164,22034,721],{"class":352},[164,22036,3311],{"class":259},[164,22038,359],{"class":255},[164,22040,3316],{"class":259},[164,22042,405],{"class":255},[164,22044,3321],{"class":259},[164,22046,3324],{"class":170},[164,22048,22049],{"class":166,"line":16},[164,22050,343],{"emptyLinePlaceholder":342},[164,22052,22053],{"class":166,"line":185},[164,22054,3333],{"class":170},[164,22056,22057,22059,22061,22063,22065,22067,22069,22071,22073,22075],{"class":166,"line":191},[164,22058,721],{"class":352},[164,22060,3311],{"class":259},[164,22062,359],{"class":255},[164,22064,3316],{"class":259},[164,22066,405],{"class":255},[164,22068,3321],{"class":259},[164,22070,1716],{"class":251},[164,22072,1136],{"class":597},[164,22074,3354],{"class":255},[164,22076,3357],{"class":255},[149,22078,3361],{"id":3360},[154,22080,22081],{"className":156,"code":3364,"language":158,"meta":159,"style":159},[161,22082,22083,22087,22095,22103,22111,22115,22119,22137,22153,22157,22161,22165,22183,22205,22227,22233,22237,22255,22277,22283],{"__ignoreMap":159},[164,22084,22085],{"class":166,"line":167},[164,22086,3371],{"class":170},[164,22088,22089,22091,22093],{"class":166,"line":174},[164,22090,3376],{"class":352},[164,22092,598],{"class":597},[164,22094,378],{"class":255},[164,22096,22097,22099,22101],{"class":166,"line":16},[164,22098,385],{"class":384},[164,22100,388],{"class":255},[164,22102,3389],{"class":597},[164,22104,22105,22107,22109],{"class":166,"line":185},[164,22106,427],{"class":384},[164,22108,388],{"class":255},[164,22110,3389],{"class":597},[164,22112,22113],{"class":166,"line":191},[164,22114,1281],{"class":255},[164,22116,22117],{"class":166,"line":346},[164,22118,343],{"emptyLinePlaceholder":342},[164,22120,22121,22123,22125,22127,22129,22131,22133,22135],{"class":166,"line":381},[164,22122,3410],{"class":352},[164,22124,3413],{"class":362},[164,22126,365],{"class":255},[164,22128,877],{"class":791},[164,22130,388],{"class":255},[164,22132,3422],{"class":597},[164,22134,402],{"class":255},[164,22136,378],{"class":255},[164,22138,22139,22141,22143,22145,22147,22149,22151],{"class":166,"line":424},[164,22140,804],{"class":352},[164,22142,848],{"class":259},[164,22144,601],{"class":255},[164,22146,807],{"class":259},[164,22148,3439],{"class":251},[164,22150,598],{"class":597},[164,22152,3444],{"class":170},[164,22154,22155],{"class":166,"line":461},[164,22156,1281],{"class":255},[164,22158,22159],{"class":166,"line":490},[164,22160,343],{"emptyLinePlaceholder":342},[164,22162,22163],{"class":166,"line":526},[164,22164,3457],{"class":170},[164,22166,22167,22169,22171,22173,22175,22177,22179,22181],{"class":166,"line":535},[164,22168,721],{"class":352},[164,22170,3464],{"class":259},[164,22172,359],{"class":255},[164,22174,326],{"class":259},[164,22176,405],{"class":255},[164,22178,1909],{"class":362},[164,22180,365],{"class":259},[164,22182,906],{"class":255},[164,22184,22185,22187,22189,22191,22193,22195,22197,22199,22201,22203],{"class":166,"line":29},[164,22186,385],{"class":384},[164,22188,388],{"class":255},[164,22190,326],{"class":259},[164,22192,405],{"class":255},[164,22194,1953],{"class":362},[164,22196,411],{"class":259},[164,22198,405],{"class":255},[164,22200,2000],{"class":362},[164,22202,411],{"class":259},[164,22204,421],{"class":255},[164,22206,22207,22209,22211,22213,22215,22217,22219,22221,22223,22225],{"class":166,"line":545},[164,22208,427],{"class":384},[164,22210,388],{"class":255},[164,22212,326],{"class":259},[164,22214,405],{"class":255},[164,22216,1953],{"class":362},[164,22218,411],{"class":259},[164,22220,405],{"class":255},[164,22222,438],{"class":362},[164,22224,411],{"class":259},[164,22226,421],{"class":255},[164,22228,22229,22231],{"class":166,"line":562},[164,22230,529],{"class":255},[164,22232,532],{"class":259},[164,22234,22235],{"class":166,"line":578},[164,22236,343],{"emptyLinePlaceholder":342},[164,22238,22239,22241,22243,22245,22247,22249,22251,22253],{"class":166,"line":583},[164,22240,3410],{"class":352},[164,22242,3413],{"class":362},[164,22244,365],{"class":255},[164,22246,877],{"class":791},[164,22248,388],{"class":255},[164,22250,3422],{"class":597},[164,22252,402],{"class":255},[164,22254,378],{"class":255},[164,22256,22257,22259,22261,22263,22265,22267,22269,22271,22273,22275],{"class":166,"line":589},[164,22258,804],{"class":352},[164,22260,848],{"class":259},[164,22262,601],{"class":255},[164,22264,3559],{"class":259},[164,22266,405],{"class":255},[164,22268,2248],{"class":362},[164,22270,365],{"class":384},[164,22272,877],{"class":259},[164,22274,1223],{"class":384},[164,22276,3572],{"class":170},[164,22278,22279,22281],{"class":166,"line":615},[164,22280,895],{"class":251},[164,22282,3579],{"class":259},[164,22284,22285],{"class":166,"line":978},[164,22286,1281],{"class":255},[149,22288,3587],{"id":3586},[102,22290,22291,3593],{},[119,22292,3592],{},[154,22294,22295],{"className":3596,"code":3597,"language":3598,"meta":159,"style":159},[161,22296,22297,22301,22305,22319,22327,22341,22353,22357],{"__ignoreMap":159},[164,22298,22299],{"class":166,"line":167},[164,22300,3605],{"class":170},[164,22302,22303],{"class":166,"line":174},[164,22304,906],{"class":255},[164,22306,22307,22309,22311,22313,22315,22317],{"class":166,"line":16},[164,22308,3614],{"class":597},[164,22310,388],{"class":362},[164,22312,285],{"class":255},[164,22314,3621],{"class":288},[164,22316,368],{"class":255},[164,22318,421],{"class":288},[164,22320,22321,22323,22325],{"class":166,"line":185},[164,22322,3630],{"class":597},[164,22324,388],{"class":362},[164,22326,378],{"class":288},[164,22328,22329,22331,22333,22335,22337,22339],{"class":166,"line":191},[164,22330,3639],{"class":597},[164,22332,388],{"class":362},[164,22334,285],{"class":255},[164,22336,3646],{"class":288},[164,22338,368],{"class":255},[164,22340,421],{"class":288},[164,22342,22343,22345,22347,22349,22351],{"class":166,"line":346},[164,22344,3655],{"class":597},[164,22346,388],{"class":362},[164,22348,285],{"class":255},[164,22350,3662],{"class":288},[164,22352,292],{"class":255},[164,22354,22355],{"class":166,"line":381},[164,22356,1260],{"class":255},[164,22358,22359],{"class":166,"line":424},[164,22360,1281],{"class":259},[98,22362,3676],{"id":3675},[149,22364,3680],{"id":3679},[113,22366,22367,22371,22375,22379],{},[116,22368,22369,3688],{},[119,22370,3687],{},[116,22372,22373,3694],{},[119,22374,3693],{},[116,22376,22377,3700],{},[119,22378,3699],{},[116,22380,22381,3706],{},[119,22382,3705],{},[149,22384,3710],{"id":3709},[113,22386,22387,22391,22395],{},[116,22388,22389,3718],{},[119,22390,3717],{},[116,22392,22393,3724],{},[119,22394,3723],{},[116,22396,22397,3730],{},[119,22398,3729],{},[149,22400,3734],{"id":3733},[113,22402,22403,22407,22411],{},[116,22404,22405,3742],{},[119,22406,3741],{},[116,22408,22409,3748],{},[119,22410,3747],{},[116,22412,22413,3754],{},[119,22414,3753],{},[98,22416,3758],{"id":3757},[154,22418,22419],{"className":156,"code":3761,"language":158,"meta":159,"style":159},[161,22420,22421,22425,22443,22461,22465,22485,22517,22523,22527,22547,22583],{"__ignoreMap":159},[164,22422,22423],{"class":166,"line":167},[164,22424,3768],{"class":170},[164,22426,22427,22429,22431,22433,22435,22437,22439,22441],{"class":166,"line":174},[164,22428,252],{"class":251},[164,22430,256],{"class":255},[164,22432,3777],{"class":259},[164,22434,279],{"class":255},[164,22436,282],{"class":251},[164,22438,285],{"class":255},[164,22440,3786],{"class":288},[164,22442,292],{"class":255},[164,22444,22445,22447,22449,22451,22453,22455,22457,22459],{"class":166,"line":16},[164,22446,252],{"class":251},[164,22448,256],{"class":255},[164,22450,1549],{"class":259},[164,22452,279],{"class":255},[164,22454,282],{"class":251},[164,22456,285],{"class":255},[164,22458,1559],{"class":288},[164,22460,292],{"class":255},[164,22462,22463],{"class":166,"line":185},[164,22464,343],{"emptyLinePlaceholder":342},[164,22466,22467,22469,22471,22473,22475,22477,22479,22481,22483],{"class":166,"line":191},[164,22468,2212],{"class":362},[164,22470,365],{"class":259},[164,22472,368],{"class":255},[164,22474,3821],{"class":288},[164,22476,368],{"class":255},[164,22478,263],{"class":255},[164,22480,1313],{"class":255},[164,22482,797],{"class":352},[164,22484,378],{"class":255},[164,22486,22487,22489,22491,22493,22495,22497,22499,22501,22503,22505,22507,22509,22511,22513,22515],{"class":166,"line":346},[164,22488,3836],{"class":362},[164,22490,365],{"class":384},[164,22492,3841],{"class":259},[164,22494,405],{"class":255},[164,22496,1642],{"class":362},[164,22498,3848],{"class":384},[164,22500,405],{"class":255},[164,22502,3853],{"class":259},[164,22504,405],{"class":255},[164,22506,3858],{"class":362},[164,22508,1122],{"class":255},[164,22510,1724],{"class":597},[164,22512,1325],{"class":384},[164,22514,1160],{"class":255},[164,22516,734],{"class":384},[164,22518,22519,22521],{"class":166,"line":381},[164,22520,529],{"class":255},[164,22522,532],{"class":259},[164,22524,22525],{"class":166,"line":424},[164,22526,343],{"emptyLinePlaceholder":342},[164,22528,22529,22531,22533,22535,22537,22539,22541,22543,22545],{"class":166,"line":461},[164,22530,2212],{"class":362},[164,22532,365],{"class":259},[164,22534,368],{"class":255},[164,22536,3889],{"class":288},[164,22538,368],{"class":255},[164,22540,263],{"class":255},[164,22542,1313],{"class":255},[164,22544,797],{"class":352},[164,22546,378],{"class":255},[164,22548,22549,22551,22553,22555,22557,22559,22561,22563,22565,22567,22569,22571,22573,22575,22577,22579,22581],{"class":166,"line":490},[164,22550,3836],{"class":362},[164,22552,365],{"class":384},[164,22554,3841],{"class":259},[164,22556,405],{"class":255},[164,22558,3912],{"class":259},[164,22560,402],{"class":384},[164,22562,405],{"class":255},[164,22564,3919],{"class":362},[164,22566,365],{"class":384},[164,22568,922],{"class":921},[164,22570,402],{"class":384},[164,22572,405],{"class":255},[164,22574,3858],{"class":362},[164,22576,1122],{"class":255},[164,22578,3934],{"class":597},[164,22580,1160],{"class":255},[164,22582,734],{"class":384},[164,22584,22585,22587],{"class":166,"line":526},[164,22586,529],{"class":255},[164,22588,532],{"class":259},[98,22590,3948],{"id":3947},[102,22592,3951],{},[200,22594,22595,22599,22605,22611],{},[116,22596,22597,3959],{},[119,22598,3958],{},[116,22600,22601,3965,22603,3969],{},[119,22602,3964],{},[161,22604,3968],{},[116,22606,22607,3965,22609,3978],{},[119,22608,3974],{},[161,22610,3977],{},[116,22612,22613,3984],{},[119,22614,3983],{},[98,22616,3988],{"id":3987},[102,22618,3991],{},[102,22620,3994],{},[3996,22622],{},[102,22624,22625,4003],{},[119,22626,4002],{},[4005,22628,4007],{},{"title":159,"searchDepth":174,"depth":174,"links":22630},[22631,22632,22633,22637,22643,22648,22653,22658,22663,22664,22665],{"id":100,"depth":174,"text":91},{"id":107,"depth":174,"text":108},{"id":146,"depth":174,"text":147,"children":22634},[22635,22636],{"id":151,"depth":16,"text":152},{"id":197,"depth":16,"text":198},{"id":228,"depth":174,"text":229,"children":22638},[22639,22640,22641,22642],{"id":232,"depth":16,"text":233},{"id":636,"depth":16,"text":637},{"id":1027,"depth":16,"text":1028},{"id":1510,"depth":16,"text":1511},{"id":1817,"depth":174,"text":1818,"children":22644},[22645,22646,22647],{"id":1821,"depth":16,"text":1822},{"id":2067,"depth":16,"text":2068},{"id":2282,"depth":16,"text":2283},{"id":2420,"depth":174,"text":2421,"children":22649},[22650,22651,22652],{"id":2424,"depth":16,"text":2425},{"id":2648,"depth":16,"text":2649},{"id":2987,"depth":16,"text":2988},{"id":3289,"depth":174,"text":3290,"children":22654},[22655,22656,22657],{"id":3293,"depth":16,"text":3294},{"id":3360,"depth":16,"text":3361},{"id":3586,"depth":16,"text":3587},{"id":3675,"depth":174,"text":3676,"children":22659},[22660,22661,22662],{"id":3679,"depth":16,"text":3680},{"id":3709,"depth":16,"text":3710},{"id":3733,"depth":16,"text":3734},{"id":3757,"depth":174,"text":3758},{"id":3947,"depth":174,"text":3948},{"id":3987,"depth":174,"text":3988},{"readingTime":4049},{"title":91,"description":4046},{"src":4055,"mime":4056,"alt":4057,"width":4058,"height":4059},[4062,4063,4064,3717,4065],[22671,23260,26044],{"id":4069,"title":4070,"abstract":92,"author":93,"authorUrl":92,"body":22672,"date":4775,"dateUpdated":4775,"description":4776,"excerpt":92,"extension":4047,"featured":342,"headline":92,"image":92,"meta":23256,"navigation":342,"ogImage":92,"path":4779,"seo":23257,"series":4052,"seriesDescription":4781,"seriesOrder":167,"socialImage":23258,"stem":4785,"tags":23259,"__hash__":4790},{"type":95,"value":22673,"toc":23226},[22674,22676,22678,22680,22682,22684,22686,22688,22842,22844,22846,22848,22850,22852,22854,22858,22860,22862,22864,22866,22868,22870,22976,22978,22980,22982,22984,22986,22988,22990,22992,22994,22996,22998,23000,23002,23004,23006,23008,23010,23182,23184,23186,23188,23190,23192,23194,23216,23218,23220,23222,23224],[98,22675,4070],{"id":4075},[102,22677,4078],{},[102,22679,4081],{},[98,22681,4085],{"id":4084},[102,22683,4088],{},[149,22685,4092],{"id":4091},[102,22687,4095],{},[154,22689,22690],{"className":156,"code":4098,"language":158,"meta":159,"style":159},[161,22691,22692,22696,22728,22738,22742,22764,22768,22772,22806,22816,22820],{"__ignoreMap":159},[164,22693,22694],{"class":166,"line":167},[164,22695,4105],{"class":170},[164,22697,22698,22700,22702,22704,22706,22708,22710,22712,22714,22716,22718,22720,22722,22724,22726],{"class":166,"line":174},[164,22699,3410],{"class":352},[164,22701,4112],{"class":362},[164,22703,1122],{"class":255},[164,22705,1125],{"class":597},[164,22707,1128],{"class":255},[164,22709,4121],{"class":791},[164,22711,388],{"class":255},[164,22713,1895],{"class":597},[164,22715,1150],{"class":255},[164,22717,256],{"class":255},[164,22719,4132],{"class":384},[164,22721,388],{"class":255},[164,22723,1895],{"class":597},[164,22725,279],{"class":255},[164,22727,378],{"class":255},[164,22729,22730,22732,22734,22736],{"class":166,"line":16},[164,22731,895],{"class":251},[164,22733,256],{"class":255},[164,22735,4132],{"class":259},[164,22737,4151],{"class":255},[164,22739,22740],{"class":166,"line":185},[164,22741,1281],{"class":255},[164,22743,22744,22746,22748,22750,22752,22754,22756,22758,22760,22762],{"class":166,"line":191},[164,22745,721],{"class":352},[164,22747,4162],{"class":259},[164,22749,359],{"class":255},[164,22751,4112],{"class":362},[164,22753,365],{"class":259},[164,22755,368],{"class":255},[164,22757,4173],{"class":288},[164,22759,368],{"class":255},[164,22761,1223],{"class":259},[164,22763,4180],{"class":170},[164,22765,22766],{"class":166,"line":346},[164,22767,343],{"emptyLinePlaceholder":342},[164,22769,22770],{"class":166,"line":381},[164,22771,4189],{"class":170},[164,22773,22774,22776,22778,22780,22782,22784,22786,22788,22790,22792,22794,22796,22798,22800,22802,22804],{"class":166,"line":424},[164,22775,3410],{"class":352},[164,22777,4112],{"class":362},[164,22779,1122],{"class":255},[164,22781,721],{"class":352},[164,22783,1895],{"class":597},[164,22785,1128],{"class":255},[164,22787,4121],{"class":791},[164,22789,388],{"class":255},[164,22791,1895],{"class":597},[164,22793,1150],{"class":255},[164,22795,256],{"class":255},[164,22797,4132],{"class":384},[164,22799,388],{"class":255},[164,22801,1895],{"class":597},[164,22803,279],{"class":255},[164,22805,378],{"class":255},[164,22807,22808,22810,22812,22814],{"class":166,"line":461},[164,22809,895],{"class":251},[164,22811,256],{"class":255},[164,22813,4132],{"class":259},[164,22815,4151],{"class":255},[164,22817,22818],{"class":166,"line":490},[164,22819,1281],{"class":255},[164,22821,22822,22824,22826,22828,22830,22832,22834,22836,22838,22840],{"class":166,"line":526},[164,22823,721],{"class":352},[164,22825,4162],{"class":259},[164,22827,359],{"class":255},[164,22829,4112],{"class":362},[164,22831,365],{"class":259},[164,22833,368],{"class":255},[164,22835,4173],{"class":288},[164,22837,368],{"class":255},[164,22839,1223],{"class":259},[164,22841,4260],{"class":170},[102,22843,4263],{},[149,22845,4267],{"id":4266},[102,22847,4270],{},[98,22849,4274],{"id":4273},[102,22851,4277],{},[149,22853,4281],{"id":4280},[102,22855,4284,22856,4288],{},[161,22857,4287],{},[149,22859,4292],{"id":4291},[102,22861,4295],{},[98,22863,4299],{"id":4298},[102,22865,4302],{},[149,22867,4306],{"id":4305},[102,22869,4309],{},[154,22871,22872],{"className":156,"code":4312,"language":158,"meta":159,"style":159},[161,22873,22874,22900,22942,22948,22954],{"__ignoreMap":159},[164,22875,22876,22878,22880,22882,22884,22886,22888,22890,22892,22894,22896,22898],{"class":166,"line":167},[164,22877,1094],{"class":352},[164,22879,4321],{"class":597},[164,22881,601],{"class":255},[164,22883,4326],{"class":255},[164,22885,1184],{"class":288},[164,22887,1187],{"class":255},[164,22889,1953],{"class":597},[164,22891,529],{"class":255},[164,22893,4337],{"class":288},[164,22895,1187],{"class":255},[164,22897,4342],{"class":597},[164,22899,4345],{"class":255},[164,22901,22902,22904,22906,22908,22910,22912,22914,22916,22918,22920,22922,22924,22926,22928,22930,22932,22934,22936,22938,22940],{"class":166,"line":174},[164,22903,1094],{"class":352},[164,22905,4352],{"class":597},[164,22907,1122],{"class":255},[164,22909,1125],{"class":597},[164,22911,1160],{"class":255},[164,22913,601],{"class":255},[164,22915,1895],{"class":597},[164,22917,1878],{"class":352},[164,22919,4326],{"class":255},[164,22921,1184],{"class":288},[164,22923,1187],{"class":255},[164,22925,1953],{"class":597},[164,22927,529],{"class":255},[164,22929,4337],{"class":288},[164,22931,1187],{"class":255},[164,22933,2046],{"class":255},[164,22935,4383],{"class":597},[164,22937,1878],{"class":255},[164,22939,4388],{"class":597},[164,22941,4345],{"class":255},[164,22943,22944,22946],{"class":166,"line":16},[164,22945,4395],{"class":255},[164,22947,4398],{"class":597},[164,22949,22950,22952],{"class":166,"line":185},[164,22951,4403],{"class":255},[164,22953,4406],{"class":597},[164,22955,22956,22958,22960,22962,22964,22966,22968,22970,22972,22974],{"class":166,"line":191},[164,22957,1094],{"class":352},[164,22959,4413],{"class":597},[164,22961,601],{"class":255},[164,22963,4352],{"class":597},[164,22965,1122],{"class":255},[164,22967,1181],{"class":255},[164,22969,4424],{"class":288},[164,22971,1181],{"class":255},[164,22973,1160],{"class":255},[164,22975,4431],{"class":170},[149,22977,4435],{"id":4434},[102,22979,4438],{},[98,22981,4442],{"id":4441},[102,22983,4445],{},[149,22985,4449],{"id":4448},[102,22987,4452],{},[149,22989,4456],{"id":4455},[102,22991,4459],{},[98,22993,4463],{"id":4462},[102,22995,4466],{},[149,22997,4470],{"id":4469},[102,22999,4473],{},[149,23001,4477],{"id":4476},[102,23003,4480],{},[98,23005,4484],{"id":4483},[149,23007,4488],{"id":4487},[102,23009,4491],{},[154,23011,23012],{"className":156,"code":4494,"language":158,"meta":159,"style":159},[161,23013,23014,23018,23034,23042,23050,23058,23078,23082,23086,23090,23100,23110,23140,23166,23178],{"__ignoreMap":159},[164,23015,23016],{"class":166,"line":167},[164,23017,4501],{"class":170},[164,23019,23020,23022,23024,23026,23028,23030,23032],{"class":166,"line":174},[164,23021,1094],{"class":352},[164,23023,2031],{"class":597},[164,23025,1122],{"class":255},[164,23027,1125],{"class":597},[164,23029,1160],{"class":255},[164,23031,601],{"class":255},[164,23033,378],{"class":255},[164,23035,23036,23038,23040],{"class":166,"line":16},[164,23037,4522],{"class":384},[164,23039,388],{"class":255},[164,23041,4527],{"class":597},[164,23043,23044,23046,23048],{"class":166,"line":185},[164,23045,4532],{"class":384},[164,23047,388],{"class":255},[164,23049,378],{"class":255},[164,23051,23052,23054,23056],{"class":166,"line":191},[164,23053,4541],{"class":384},[164,23055,388],{"class":255},[164,23057,3389],{"class":597},[164,23059,23060,23062,23064,23066,23068,23070,23072,23074,23076],{"class":166,"line":346},[164,23061,4550],{"class":384},[164,23063,388],{"class":255},[164,23065,285],{"class":255},[164,23067,971],{"class":288},[164,23069,368],{"class":255},[164,23071,4561],{"class":255},[164,23073,285],{"class":255},[164,23075,4566],{"class":288},[164,23077,292],{"class":255},[164,23079,23080],{"class":166,"line":381},[164,23081,1260],{"class":255},[164,23083,23084],{"class":166,"line":424},[164,23085,1281],{"class":255},[164,23087,23088],{"class":166,"line":461},[164,23089,343],{"emptyLinePlaceholder":342},[164,23091,23092,23094,23096,23098],{"class":166,"line":490},[164,23093,1113],{"class":352},[164,23095,1116],{"class":352},[164,23097,4589],{"class":362},[164,23099,2671],{"class":255},[164,23101,23102,23104,23106,23108],{"class":166,"line":526},[164,23103,385],{"class":791},[164,23105,388],{"class":255},[164,23107,4388],{"class":597},[164,23109,421],{"class":255},[164,23111,23112,23114,23116,23118,23120,23122,23124,23126,23128,23130,23132,23134,23136,23138],{"class":166,"line":535},[164,23113,1150],{"class":255},[164,23115,1153],{"class":597},[164,23117,1122],{"class":255},[164,23119,4612],{"class":597},[164,23121,1672],{"class":255},[164,23123,2713],{"class":384},[164,23125,388],{"class":255},[164,23127,4388],{"class":597},[164,23129,4623],{"class":255},[164,23131,4626],{"class":384},[164,23133,388],{"class":255},[164,23135,1136],{"class":597},[164,23137,4633],{"class":255},[164,23139,378],{"class":255},[164,23141,23142,23144,23146,23148,23150,23152,23154,23156,23158,23160,23162,23164],{"class":166,"line":29},[164,23143,804],{"class":352},[164,23145,1169],{"class":259},[164,23147,601],{"class":255},[164,23149,853],{"class":251},[164,23151,1176],{"class":362},[164,23153,365],{"class":384},[164,23155,1181],{"class":255},[164,23157,1374],{"class":288},[164,23159,1187],{"class":255},[164,23161,397],{"class":259},[164,23163,1192],{"class":255},[164,23165,532],{"class":384},[164,23167,23168,23170,23172,23174,23176],{"class":166,"line":545},[164,23169,895],{"class":251},[164,23171,1169],{"class":259},[164,23173,405],{"class":255},[164,23175,773],{"class":362},[164,23177,734],{"class":384},[164,23179,23180],{"class":166,"line":562},[164,23181,1281],{"class":255},[149,23183,4681],{"id":4680},[102,23185,4684],{},[149,23187,4688],{"id":4687},[102,23189,4691],{},[98,23191,4695],{"id":4694},[102,23193,4698],{},[200,23195,23196,23200,23204,23208,23212],{},[116,23197,23198,4706],{},[119,23199,4705],{},[116,23201,23202,4712],{},[119,23203,4711],{},[116,23205,23206,4718],{},[119,23207,4717],{},[116,23209,23210,4724],{},[119,23211,4723],{},[116,23213,23214,4730],{},[119,23215,4729],{},[98,23217,3988],{"id":3987},[102,23219,4735],{},[102,23221,4738],{},[102,23223,4741],{},[4005,23225,4744],{},{"title":159,"searchDepth":174,"depth":174,"links":23227},[23228,23229,23233,23237,23241,23245,23249,23254,23255],{"id":4075,"depth":174,"text":4070},{"id":4084,"depth":174,"text":4085,"children":23230},[23231,23232],{"id":4091,"depth":16,"text":4092},{"id":4266,"depth":16,"text":4267},{"id":4273,"depth":174,"text":4274,"children":23234},[23235,23236],{"id":4280,"depth":16,"text":4281},{"id":4291,"depth":16,"text":4292},{"id":4298,"depth":174,"text":4299,"children":23238},[23239,23240],{"id":4305,"depth":16,"text":4306},{"id":4434,"depth":16,"text":4435},{"id":4441,"depth":174,"text":4442,"children":23242},[23243,23244],{"id":4448,"depth":16,"text":4449},{"id":4455,"depth":16,"text":4456},{"id":4462,"depth":174,"text":4463,"children":23246},[23247,23248],{"id":4469,"depth":16,"text":4470},{"id":4476,"depth":16,"text":4477},{"id":4483,"depth":174,"text":4484,"children":23250},[23251,23252,23253],{"id":4487,"depth":16,"text":4488},{"id":4680,"depth":16,"text":4681},{"id":4687,"depth":16,"text":4688},{"id":4694,"depth":174,"text":4695},{"id":3987,"depth":174,"text":3988},{"readingTime":4778},{"title":4070,"description":4776},{"src":4783,"mime":4056,"alt":4784,"width":4058,"height":4059},[4062,4787,4063,4788,4789],{"id":23261,"title":23262,"abstract":92,"author":93,"authorUrl":92,"body":23263,"date":26015,"dateUpdated":26015,"description":26016,"excerpt":92,"extension":4047,"featured":342,"headline":92,"image":92,"meta":26017,"navigation":342,"ogImage":92,"path":26030,"seo":26031,"series":26032,"seriesDescription":26033,"seriesOrder":174,"socialImage":26034,"stem":26037,"tags":26038,"__hash__":26043},"blog/blog/22-nuxt-3-to-4-migration-guide-2026.md","Nuxt 3 to Nuxt 4 Migration Guide: Complete Checklist for 2026",{"type":95,"value":23264,"toc":25958},[23265,23268,23277,23291,23304,23306,23310,23313,23339,23345,23347,23351,23355,23360,23371,23376,23397,23402,23413,23418,23429,23434,23445,23447,23451,23454,23458,23461,23539,23543,23546,23563,23568,23591,23596,23607,23611,23614,23629,23633,23636,23650,23654,23657,23676,23678,23682,23686,23689,23750,23755,23773,23777,23780,23827,23830,23842,23846,23851,23938,23944,24063,24067,24074,24079,24087,24092,24098,24101,24163,24166,24170,24177,24181,24248,24253,24326,24331,24489,24493,24496,24500,24564,24569,24653,24657,24660,24665,24707,24712,24777,24781,24784,24789,24806,24811,24853,24858,24971,24973,24977,24981,24984,24990,24999,25060,25064,25067,25072,25077,25083,25087,25090,25095,25175,25179,25184,25201,25206,25220,25222,25226,25230,25234,25283,25287,25291,25350,25354,25358,25396,25400,25404,25482,25486,25490,25507,25509,25513,25516,25520,25542,25546,25558,25562,25585,25589,25609,25613,25624,25626,25630,25635,25655,25661,25663,25667,25670,25776,25778,25782,25786,25792,25796,25803,25807,25813,25817,25820,25831,25835,25841,25845,25851,25855,25858,25860,25864,25867,25898,25900,25904,25912,25917,25947,25949,25955],[98,23266,23262],{"id":23267},"nuxt-3-to-nuxt-4-migration-guide-complete-checklist-for-2026",[102,23269,23270,23273,23274],{},[119,23271,23272],{},"Last updated:"," February 2026\n",[119,23275,23276],{},"What changed in this update:",[113,23278,23279,23282,23285,23288],{},[116,23280,23281],{},"Added migration timeline reminder (Nuxt 3 EOL: January 31, 2026)",[116,23283,23284],{},"Updated codemod tool instructions",[116,23286,23287],{},"Added new module compatibility matrix",[116,23289,23290],{},"Expanded troubleshooting section",[23292,23293,23294],"blockquote",{},[102,23295,23296,23299,23300,23303],{},[119,23297,23298],{},"⚠️ Critical Timeline",": Nuxt 3 official support ends ",[119,23301,23302],{},"January 31, 2026",". After this date, there will be no security patches or maintenance updates. Migrating to Nuxt 4 is essential for production applications.",[3996,23305],{},[98,23307,23309],{"id":23308},"why-migrate-to-nuxt-4-now","Why Migrate to Nuxt 4 Now?",[102,23311,23312],{},"If you're still on Nuxt 3 in early 2026, you're facing:",[200,23314,23315,23321,23327,23333],{},[116,23316,23317,23320],{},[119,23318,23319],{},"Security risks",": No security patches after January 2026",[116,23322,23323,23326],{},[119,23324,23325],{},"Module incompatibility",": New module versions target Nuxt 4+",[116,23328,23329,23332],{},[119,23330,23331],{},"Missing features",": Performance improvements and DX enhancements",[116,23334,23335,23338],{},[119,23336,23337],{},"No LTS support",": Critical for enterprise applications",[102,23340,23341,23344],{},[119,23342,23343],{},"The good news",": Nuxt 4 is a stability-focused release with a clear upgrade path. Most projects can migrate in a few hours with the right preparation.",[3996,23346],{},[98,23348,23350],{"id":23349},"whats-new-in-nuxt-4","What's New in Nuxt 4?",[149,23352,23354],{"id":23353},"key-improvements","Key Improvements",[102,23356,23357],{},[119,23358,23359],{},"1. Improved App Directory Structure",[113,23361,23362,23365,23368],{},[116,23363,23364],{},"Cleaner separation of concerns",[116,23366,23367],{},"Better TypeScript integration",[116,23369,23370],{},"Enhanced auto-imports",[102,23372,23373],{},[119,23374,23375],{},"2. Smarter Data Fetching",[113,23377,23378,23388,23391,23394],{},[116,23379,23380,23383,23384,23387],{},[161,23381,23382],{},"useAsyncData"," and ",[161,23385,23386],{},"useFetch"," automatically share data with same keys",[116,23389,23390],{},"Automatic cleanup on component unmount",[116,23392,23393],{},"Reactive keys for automatic refetching",[116,23395,23396],{},"Better caching strategies",[102,23398,23399],{},[119,23400,23401],{},"3. Enhanced TypeScript Ergonomics",[113,23403,23404,23407,23410],{},[116,23405,23406],{},"Zero-config TypeScript setup",[116,23408,23409],{},"Better type inference for composables",[116,23411,23412],{},"Improved module type generation",[102,23414,23415],{},[119,23416,23417],{},"4. Faster Development Tooling",[113,23419,23420,23423,23426],{},[116,23421,23422],{},"Optimized HMR (Hot Module Replacement)",[116,23424,23425],{},"Faster cold starts",[116,23427,23428],{},"Improved build performance",[102,23430,23431],{},[119,23432,23433],{},"5. Nitro v2 Integration",[113,23435,23436,23439,23442],{},[116,23437,23438],{},"Better server-side rendering",[116,23440,23441],{},"Enhanced API routes",[116,23443,23444],{},"Improved edge deployment support",[3996,23446],{},[98,23448,23450],{"id":23449},"pre-migration-checklist","Pre-Migration Checklist",[102,23452,23453],{},"Before starting the migration, complete these steps:",[149,23455,23457],{"id":23456},"_1-update-dependencies","✅ 1. Update Dependencies",[102,23459,23460],{},"Update to the latest Nuxt 3.x version first:",[154,23462,23464],{"className":3596,"code":23463,"language":3598,"meta":159,"style":159},"# Check current version\nnpx nuxi info\n\n# Update to latest Nuxt 3\nnpm install nuxt@latest\n\n# Or with yarn/pnpm/bun\nyarn add nuxt@latest\npnpm add nuxt@latest\nbun add nuxt@latest\n",[161,23465,23466,23471,23482,23486,23491,23502,23506,23511,23521,23530],{"__ignoreMap":159},[164,23467,23468],{"class":166,"line":167},[164,23469,23470],{"class":170},"# Check current version\n",[164,23472,23473,23476,23479],{"class":166,"line":174},[164,23474,23475],{"class":597},"npx",[164,23477,23478],{"class":288}," nuxi",[164,23480,23481],{"class":288}," info\n",[164,23483,23484],{"class":166,"line":16},[164,23485,343],{"emptyLinePlaceholder":342},[164,23487,23488],{"class":166,"line":185},[164,23489,23490],{"class":170},"# Update to latest Nuxt 3\n",[164,23492,23493,23496,23499],{"class":166,"line":191},[164,23494,23495],{"class":597},"npm",[164,23497,23498],{"class":288}," install",[164,23500,23501],{"class":288}," nuxt@latest\n",[164,23503,23504],{"class":166,"line":346},[164,23505,343],{"emptyLinePlaceholder":342},[164,23507,23508],{"class":166,"line":381},[164,23509,23510],{"class":170},"# Or with yarn/pnpm/bun\n",[164,23512,23513,23516,23519],{"class":166,"line":424},[164,23514,23515],{"class":597},"yarn",[164,23517,23518],{"class":288}," add",[164,23520,23501],{"class":288},[164,23522,23523,23526,23528],{"class":166,"line":461},[164,23524,23525],{"class":597},"pnpm",[164,23527,23518],{"class":288},[164,23529,23501],{"class":288},[164,23531,23532,23535,23537],{"class":166,"line":490},[164,23533,23534],{"class":597},"bun",[164,23536,23518],{"class":288},[164,23538,23501],{"class":288},[149,23540,23542],{"id":23541},"_2-review-module-compatibility","✅ 2. Review Module Compatibility",[102,23544,23545],{},"Check if your modules support Nuxt 4:",[154,23547,23549],{"className":3596,"code":23548,"language":3598,"meta":159,"style":159},"npx nuxi upgrade --force\n",[161,23550,23551],{"__ignoreMap":159},[164,23552,23553,23555,23557,23560],{"class":166,"line":167},[164,23554,23475],{"class":597},[164,23556,23478],{"class":288},[164,23558,23559],{"class":288}," upgrade",[164,23561,23562],{"class":288}," --force\n",[102,23564,23565],{},[119,23566,23567],{},"Compatible Modules (Nuxt 4 Ready):",[113,23569,23570,23573,23576,23579,23582,23585,23588],{},[116,23571,23572],{},"✅ @nuxt/content (v3+)",[116,23574,23575],{},"✅ @nuxt/ui (v3+)",[116,23577,23578],{},"✅ @nuxt/icon",[116,23580,23581],{},"✅ @nuxtjs/seo",[116,23583,23584],{},"✅ @nuxtjs/tailwindcss (v6+)",[116,23586,23587],{},"✅ @pinia/nuxt",[116,23589,23590],{},"✅ @vueuse/nuxt",[102,23592,23593],{},[119,23594,23595],{},"Modules Requiring Updates:",[113,23597,23598,23601,23604],{},[116,23599,23600],{},"⚠️ @nuxtjs/auth → Use @sidebase/nuxt-auth or nuxt-auth-utils",[116,23602,23603],{},"⚠️ @nuxtjs/i18n → Update to v8+",[116,23605,23606],{},"⚠️ Custom server middleware → Migrate to Nitro server routes",[149,23608,23610],{"id":23609},"_3-run-type-check","✅ 3. Run Type Check",[102,23612,23613],{},"Fix all TypeScript errors before migrating:",[154,23615,23617],{"className":3596,"code":23616,"language":3598,"meta":159,"style":159},"npm run type-check\n",[161,23618,23619],{"__ignoreMap":159},[164,23620,23621,23623,23626],{"class":166,"line":167},[164,23622,23495],{"class":597},[164,23624,23625],{"class":288}," run",[164,23627,23628],{"class":288}," type-check\n",[149,23630,23632],{"id":23631},"_4-update-test-suite","✅ 4. Update Test Suite",[102,23634,23635],{},"Ensure all tests pass on Nuxt 3 before migration:",[154,23637,23639],{"className":3596,"code":23638,"language":3598,"meta":159,"style":159},"npm run test\n",[161,23640,23641],{"__ignoreMap":159},[164,23642,23643,23645,23647],{"class":166,"line":167},[164,23644,23495],{"class":597},[164,23646,23625],{"class":288},[164,23648,23649],{"class":288}," test\n",[149,23651,23653],{"id":23652},"_5-backup-your-code","✅ 5. Backup Your Code",[102,23655,23656],{},"Create a git branch for migration:",[154,23658,23660],{"className":3596,"code":23659,"language":3598,"meta":159,"style":159},"git checkout -b migration/nuxt-4\n",[161,23661,23662],{"__ignoreMap":159},[164,23663,23664,23667,23670,23673],{"class":166,"line":167},[164,23665,23666],{"class":597},"git",[164,23668,23669],{"class":288}," checkout",[164,23671,23672],{"class":288}," -b",[164,23674,23675],{"class":288}," migration/nuxt-4\n",[3996,23677],{},[98,23679,23681],{"id":23680},"step-by-step-migration-process","Step-by-Step Migration Process",[149,23683,23685],{"id":23684},"step-1-use-the-codemod-tool-recommended","Step 1: Use the Codemod Tool (Recommended)",[102,23687,23688],{},"Nuxt partnered with Codemod to create an automated migration tool:",[154,23690,23692],{"className":3596,"code":23691,"language":3598,"meta":159,"style":159},"# Run the migration codemod\nnpx codemod@latest nuxt/4/migration-recipe\n\n# Or with your package manager\nyarn dlx codemod@latest nuxt/4/migration-recipe\npnpm dlx codemod@latest nuxt/4/migration-recipe\nbun x codemod@latest nuxt/4/migration-recipe\n",[161,23693,23694,23699,23709,23713,23718,23729,23739],{"__ignoreMap":159},[164,23695,23696],{"class":166,"line":167},[164,23697,23698],{"class":170},"# Run the migration codemod\n",[164,23700,23701,23703,23706],{"class":166,"line":174},[164,23702,23475],{"class":597},[164,23704,23705],{"class":288}," codemod@latest",[164,23707,23708],{"class":288}," nuxt/4/migration-recipe\n",[164,23710,23711],{"class":166,"line":16},[164,23712,343],{"emptyLinePlaceholder":342},[164,23714,23715],{"class":166,"line":185},[164,23716,23717],{"class":170},"# Or with your package manager\n",[164,23719,23720,23722,23725,23727],{"class":166,"line":191},[164,23721,23515],{"class":597},[164,23723,23724],{"class":288}," dlx",[164,23726,23705],{"class":288},[164,23728,23708],{"class":288},[164,23730,23731,23733,23735,23737],{"class":166,"line":346},[164,23732,23525],{"class":597},[164,23734,23724],{"class":288},[164,23736,23705],{"class":288},[164,23738,23708],{"class":288},[164,23740,23741,23743,23746,23748],{"class":166,"line":381},[164,23742,23534],{"class":597},[164,23744,23745],{"class":288}," x",[164,23747,23705],{"class":288},[164,23749,23708],{"class":288},[102,23751,23752],{},[119,23753,23754],{},"What the codemod does:",[113,23756,23757,23764,23767,23770],{},[116,23758,23759,23760,23763],{},"Updates ",[161,23761,23762],{},"nuxt.config.ts"," configuration",[116,23765,23766],{},"Migrates directory structure (if needed)",[116,23768,23769],{},"Updates deprecated imports",[116,23771,23772],{},"Fixes common API changes",[149,23774,23776],{"id":23775},"step-2-update-packagejson","Step 2: Update package.json",[102,23778,23779],{},"Change Nuxt version to 4:",[154,23781,23783],{"className":4974,"code":23782,"language":773,"meta":159,"style":159},"{\n \"devDependencies\": {\n \"nuxt\": \"^4.0.0\"\n }\n}\n",[161,23784,23785,23789,23801,23819,23823],{"__ignoreMap":159},[164,23786,23787],{"class":166,"line":167},[164,23788,906],{"class":255},[164,23790,23791,23793,23795,23797,23799],{"class":166,"line":174},[164,23792,2676],{"class":255},[164,23794,5967],{"class":352},[164,23796,368],{"class":255},[164,23798,388],{"class":255},[164,23800,378],{"class":255},[164,23802,23803,23805,23808,23810,23812,23814,23817],{"class":166,"line":16},[164,23804,5227],{"class":255},[164,23806,23807],{"class":597},"nuxt",[164,23809,368],{"class":255},[164,23811,388],{"class":255},[164,23813,285],{"class":255},[164,23815,23816],{"class":288},"^4.0.0",[164,23818,292],{"class":255},[164,23820,23821],{"class":166,"line":185},[164,23822,1260],{"class":255},[164,23824,23825],{"class":166,"line":191},[164,23826,1281],{"class":255},[102,23828,23829],{},"Then install:",[154,23831,23833],{"className":3596,"code":23832,"language":3598,"meta":159,"style":159},"npm install\n",[161,23834,23835],{"__ignoreMap":159},[164,23836,23837,23839],{"class":166,"line":167},[164,23838,23495],{"class":597},[164,23840,23841],{"class":288}," install\n",[149,23843,23845],{"id":23844},"step-3-update-nuxtconfigts","Step 3: Update nuxt.config.ts",[102,23847,23848],{},[119,23849,23850],{},"Nuxt 3:",[154,23852,23854],{"className":156,"code":23853,"language":158,"meta":159,"style":159},"export default defineNuxtConfig({\n modules: [\"@nuxt/content\"],\n app: {\n head: {\n title: \"My App\",\n },\n },\n})\n",[161,23855,23856,23870,23890,23899,23908,23924,23928,23932],{"__ignoreMap":159},[164,23857,23858,23860,23863,23866,23868],{"class":166,"line":167},[164,23859,349],{"class":251},[164,23861,23862],{"class":251}," default",[164,23864,23865],{"class":362}," defineNuxtConfig",[164,23867,365],{"class":259},[164,23869,906],{"class":255},[164,23871,23872,23875,23877,23879,23881,23884,23886,23888],{"class":166,"line":174},[164,23873,23874],{"class":384}," modules",[164,23876,388],{"class":255},[164,23878,6257],{"class":259},[164,23880,368],{"class":255},[164,23882,23883],{"class":288},"@nuxt/content",[164,23885,368],{"class":255},[164,23887,925],{"class":259},[164,23889,421],{"class":255},[164,23891,23892,23895,23897],{"class":166,"line":16},[164,23893,23894],{"class":384}," app",[164,23896,388],{"class":255},[164,23898,378],{"class":255},[164,23900,23901,23904,23906],{"class":166,"line":185},[164,23902,23903],{"class":384}," head",[164,23905,388],{"class":255},[164,23907,378],{"class":255},[164,23909,23910,23913,23915,23917,23920,23922],{"class":166,"line":191},[164,23911,23912],{"class":384}," title",[164,23914,388],{"class":255},[164,23916,285],{"class":255},[164,23918,23919],{"class":288},"My App",[164,23921,368],{"class":255},[164,23923,421],{"class":255},[164,23925,23926],{"class":166,"line":346},[164,23927,981],{"class":255},[164,23929,23930],{"class":166,"line":381},[164,23931,1748],{"class":255},[164,23933,23934,23936],{"class":166,"line":424},[164,23935,529],{"class":255},[164,23937,532],{"class":259},[102,23939,23940,23943],{},[119,23941,23942],{},"Nuxt 4:"," (mostly the same, but check for deprecated options)",[154,23945,23947],{"className":156,"code":23946,"language":158,"meta":159,"style":159},"export default defineNuxtConfig({\n modules: [\"@nuxt/content\"],\n app: {\n head: {\n title: \"My App\",\n },\n },\n // New in Nuxt 4: Better TypeScript defaults\n typescript: {\n strict: true,\n typeCheck: true,\n },\n})\n",[161,23948,23949,23961,23979,23987,23995,24009,24013,24017,24022,24031,24042,24053,24057],{"__ignoreMap":159},[164,23950,23951,23953,23955,23957,23959],{"class":166,"line":167},[164,23952,349],{"class":251},[164,23954,23862],{"class":251},[164,23956,23865],{"class":362},[164,23958,365],{"class":259},[164,23960,906],{"class":255},[164,23962,23963,23965,23967,23969,23971,23973,23975,23977],{"class":166,"line":174},[164,23964,23874],{"class":384},[164,23966,388],{"class":255},[164,23968,6257],{"class":259},[164,23970,368],{"class":255},[164,23972,23883],{"class":288},[164,23974,368],{"class":255},[164,23976,925],{"class":259},[164,23978,421],{"class":255},[164,23980,23981,23983,23985],{"class":166,"line":16},[164,23982,23894],{"class":384},[164,23984,388],{"class":255},[164,23986,378],{"class":255},[164,23988,23989,23991,23993],{"class":166,"line":185},[164,23990,23903],{"class":384},[164,23992,388],{"class":255},[164,23994,378],{"class":255},[164,23996,23997,23999,24001,24003,24005,24007],{"class":166,"line":191},[164,23998,23912],{"class":384},[164,24000,388],{"class":255},[164,24002,285],{"class":255},[164,24004,23919],{"class":288},[164,24006,368],{"class":255},[164,24008,421],{"class":255},[164,24010,24011],{"class":166,"line":346},[164,24012,981],{"class":255},[164,24014,24015],{"class":166,"line":381},[164,24016,1748],{"class":255},[164,24018,24019],{"class":166,"line":424},[164,24020,24021],{"class":170}," // New in Nuxt 4: Better TypeScript defaults\n",[164,24023,24024,24027,24029],{"class":166,"line":461},[164,24025,24026],{"class":384}," typescript",[164,24028,388],{"class":255},[164,24030,378],{"class":255},[164,24032,24033,24036,24038,24040],{"class":166,"line":490},[164,24034,24035],{"class":384}," strict",[164,24037,388],{"class":255},[164,24039,2865],{"class":1737},[164,24041,421],{"class":255},[164,24043,24044,24047,24049,24051],{"class":166,"line":526},[164,24045,24046],{"class":384}," typeCheck",[164,24048,388],{"class":255},[164,24050,2865],{"class":1737},[164,24052,421],{"class":255},[164,24054,24055],{"class":166,"line":535},[164,24056,1748],{"class":255},[164,24058,24059,24061],{"class":166,"line":29},[164,24060,529],{"class":255},[164,24062,532],{"class":259},[149,24064,24066],{"id":24065},"step-4-migrate-directory-structure-optional","Step 4: Migrate Directory Structure (Optional)",[102,24068,24069,24070,24073],{},"Nuxt 4 introduces an optional ",[161,24071,24072],{},"app/"," directory structure for better organization:",[102,24075,24076],{},[119,24077,24078],{},"Old Structure (still works):",[154,24080,24085],{"className":24081,"code":24083,"language":24084},[24082],"language-text","├── components/\n├── pages/\n├── composables/\n├── layouts/\n└── plugins/\n","text",[161,24086,24083],{"__ignoreMap":159},[102,24088,24089],{},[119,24090,24091],{},"New Structure (recommended for new projects):",[154,24093,24096],{"className":24094,"code":24095,"language":24084},[24082],"├── app/\n│ ├── components/\n│ ├── pages/\n│ ├── composables/\n│ ├── layouts/\n│ └── plugins/\n├── content/\n└── public/\n",[161,24097,24095],{"__ignoreMap":159},[102,24099,24100],{},"To adopt the new structure:",[154,24102,24104],{"className":3596,"code":24103,"language":3598,"meta":159,"style":159},"mkdir -p app\nmv components app/\nmv pages app/\nmv composables app/\nmv layouts app/\nmv plugins app/\n",[161,24105,24106,24116,24127,24136,24145,24154],{"__ignoreMap":159},[164,24107,24108,24111,24114],{"class":166,"line":167},[164,24109,24110],{"class":597},"mkdir",[164,24112,24113],{"class":288}," -p",[164,24115,1024],{"class":288},[164,24117,24118,24121,24124],{"class":166,"line":174},[164,24119,24120],{"class":597},"mv",[164,24122,24123],{"class":288}," components",[164,24125,24126],{"class":288}," app/\n",[164,24128,24129,24131,24134],{"class":166,"line":16},[164,24130,24120],{"class":597},[164,24132,24133],{"class":288}," pages",[164,24135,24126],{"class":288},[164,24137,24138,24140,24143],{"class":166,"line":185},[164,24139,24120],{"class":597},[164,24141,24142],{"class":288}," composables",[164,24144,24126],{"class":288},[164,24146,24147,24149,24152],{"class":166,"line":191},[164,24148,24120],{"class":597},[164,24150,24151],{"class":288}," layouts",[164,24153,24126],{"class":288},[164,24155,24156,24158,24161],{"class":166,"line":346},[164,24157,24120],{"class":597},[164,24159,24160],{"class":288}," plugins",[164,24162,24126],{"class":288},[102,24164,24165],{},"Update imports if necessary (most auto-imports work the same).",[149,24167,24169],{"id":24168},"step-5-update-data-fetching","Step 5: Update Data Fetching",[102,24171,24172,24173,23383,24175,388],{},"Nuxt 4 improves ",[161,24174,23382],{},[161,24176,23386],{},[102,24178,24179],{},[119,24180,23850],{},[154,24182,24184],{"className":156,"code":24183,"language":158,"meta":159,"style":159},"const { data } = await useFetch(\"/api/posts\", {\n key: \"posts\",\n lazy: true,\n})\n",[161,24185,24186,24216,24231,24242],{"__ignoreMap":159},[164,24187,24188,24190,24192,24194,24196,24198,24200,24203,24205,24207,24210,24212,24214],{"class":166,"line":167},[164,24189,721],{"class":352},[164,24191,256],{"class":255},[164,24193,8971],{"class":259},[164,24195,529],{"class":255},[164,24197,601],{"class":255},[164,24199,853],{"class":251},[164,24201,24202],{"class":362}," useFetch",[164,24204,365],{"class":259},[164,24206,368],{"class":255},[164,24208,24209],{"class":288},"/api/posts",[164,24211,368],{"class":255},[164,24213,263],{"class":255},[164,24215,378],{"class":255},[164,24217,24218,24221,24223,24225,24227,24229],{"class":166,"line":174},[164,24219,24220],{"class":384}," key",[164,24222,388],{"class":255},[164,24224,285],{"class":255},[164,24226,10835],{"class":288},[164,24228,368],{"class":255},[164,24230,421],{"class":255},[164,24232,24233,24236,24238,24240],{"class":166,"line":16},[164,24234,24235],{"class":384}," lazy",[164,24237,388],{"class":255},[164,24239,2865],{"class":1737},[164,24241,421],{"class":255},[164,24243,24244,24246],{"class":166,"line":185},[164,24245,529],{"class":255},[164,24247,532],{"class":259},[102,24249,24250,24252],{},[119,24251,23942],{}," (same API, better behavior)",[154,24254,24256],{"className":156,"code":24255,"language":158,"meta":159,"style":159},"const { data } = await useFetch(\"/api/posts\", {\n key: \"posts\",\n lazy: true,\n // Now automatically shares data across components with same key\n // Automatic cleanup on unmount\n})\n",[161,24257,24258,24286,24300,24310,24315,24320],{"__ignoreMap":159},[164,24259,24260,24262,24264,24266,24268,24270,24272,24274,24276,24278,24280,24282,24284],{"class":166,"line":167},[164,24261,721],{"class":352},[164,24263,256],{"class":255},[164,24265,8971],{"class":259},[164,24267,529],{"class":255},[164,24269,601],{"class":255},[164,24271,853],{"class":251},[164,24273,24202],{"class":362},[164,24275,365],{"class":259},[164,24277,368],{"class":255},[164,24279,24209],{"class":288},[164,24281,368],{"class":255},[164,24283,263],{"class":255},[164,24285,378],{"class":255},[164,24287,24288,24290,24292,24294,24296,24298],{"class":166,"line":174},[164,24289,24220],{"class":384},[164,24291,388],{"class":255},[164,24293,285],{"class":255},[164,24295,10835],{"class":288},[164,24297,368],{"class":255},[164,24299,421],{"class":255},[164,24301,24302,24304,24306,24308],{"class":166,"line":16},[164,24303,24235],{"class":384},[164,24305,388],{"class":255},[164,24307,2865],{"class":1737},[164,24309,421],{"class":255},[164,24311,24312],{"class":166,"line":185},[164,24313,24314],{"class":170}," // Now automatically shares data across components with same key\n",[164,24316,24317],{"class":166,"line":191},[164,24318,24319],{"class":170}," // Automatic cleanup on unmount\n",[164,24321,24322,24324],{"class":166,"line":346},[164,24323,529],{"class":255},[164,24325,532],{"class":259},[102,24327,24328],{},[119,24329,24330],{},"New Features:",[154,24332,24334],{"className":156,"code":24333,"language":158,"meta":159,"style":159},"// Reactive keys automatically refetch\nconst { data } = await useFetch(`/api/posts/${postId}`)\n\n// Multiple components with same key share data\n// Component A\nconst { data: posts } = await useFetch(\"/api/posts\", { key: \"posts\" })\n\n// Component B (gets same data, no duplicate request)\nconst { data: posts } = await useFetch(\"/api/posts\", { key: \"posts\" })\n",[161,24335,24336,24341,24373,24377,24382,24387,24434,24438,24443],{"__ignoreMap":159},[164,24337,24338],{"class":166,"line":167},[164,24339,24340],{"class":170},"// Reactive keys automatically refetch\n",[164,24342,24343,24345,24347,24349,24351,24353,24355,24357,24359,24361,24364,24366,24369,24371],{"class":166,"line":174},[164,24344,721],{"class":352},[164,24346,256],{"class":255},[164,24348,8971],{"class":259},[164,24350,529],{"class":255},[164,24352,601],{"class":255},[164,24354,853],{"class":251},[164,24356,24202],{"class":362},[164,24358,365],{"class":259},[164,24360,1181],{"class":255},[164,24362,24363],{"class":288},"/api/posts/",[164,24365,1187],{"class":255},[164,24367,24368],{"class":259},"postId",[164,24370,1192],{"class":255},[164,24372,532],{"class":259},[164,24374,24375],{"class":166,"line":16},[164,24376,343],{"emptyLinePlaceholder":342},[164,24378,24379],{"class":166,"line":185},[164,24380,24381],{"class":170},"// Multiple components with same key share data\n",[164,24383,24384],{"class":166,"line":191},[164,24385,24386],{"class":170},"// Component A\n",[164,24388,24389,24391,24393,24395,24397,24400,24402,24404,24406,24408,24410,24412,24414,24416,24418,24420,24422,24424,24426,24428,24430,24432],{"class":166,"line":346},[164,24390,721],{"class":352},[164,24392,256],{"class":255},[164,24394,807],{"class":384},[164,24396,388],{"class":255},[164,24398,24399],{"class":259}," posts ",[164,24401,529],{"class":255},[164,24403,601],{"class":255},[164,24405,853],{"class":251},[164,24407,24202],{"class":362},[164,24409,365],{"class":259},[164,24411,368],{"class":255},[164,24413,24209],{"class":288},[164,24415,368],{"class":255},[164,24417,263],{"class":255},[164,24419,256],{"class":255},[164,24421,14590],{"class":384},[164,24423,388],{"class":255},[164,24425,285],{"class":255},[164,24427,10835],{"class":288},[164,24429,368],{"class":255},[164,24431,279],{"class":255},[164,24433,532],{"class":259},[164,24435,24436],{"class":166,"line":381},[164,24437,343],{"emptyLinePlaceholder":342},[164,24439,24440],{"class":166,"line":424},[164,24441,24442],{"class":170},"// Component B (gets same data, no duplicate request)\n",[164,24444,24445,24447,24449,24451,24453,24455,24457,24459,24461,24463,24465,24467,24469,24471,24473,24475,24477,24479,24481,24483,24485,24487],{"class":166,"line":461},[164,24446,721],{"class":352},[164,24448,256],{"class":255},[164,24450,807],{"class":384},[164,24452,388],{"class":255},[164,24454,24399],{"class":259},[164,24456,529],{"class":255},[164,24458,601],{"class":255},[164,24460,853],{"class":251},[164,24462,24202],{"class":362},[164,24464,365],{"class":259},[164,24466,368],{"class":255},[164,24468,24209],{"class":288},[164,24470,368],{"class":255},[164,24472,263],{"class":255},[164,24474,256],{"class":255},[164,24476,14590],{"class":384},[164,24478,388],{"class":255},[164,24480,285],{"class":255},[164,24482,10835],{"class":288},[164,24484,368],{"class":255},[164,24486,279],{"class":255},[164,24488,532],{"class":259},[149,24490,24492],{"id":24491},"step-6-update-plugins","Step 6: Update Plugins",[102,24494,24495],{},"Nuxt 4 uses auto-imports for plugins by default:",[102,24497,24498],{},[119,24499,23850],{},[154,24501,24503],{"className":156,"code":24502,"language":158,"meta":159,"style":159},"// plugins/my-plugin.ts\nexport default defineNuxtPlugin((nuxtApp) => {\n nuxtApp.provide(\"myPlugin\", myPlugin)\n})\n",[161,24504,24505,24510,24532,24558],{"__ignoreMap":159},[164,24506,24507],{"class":166,"line":167},[164,24508,24509],{"class":170},"// plugins/my-plugin.ts\n",[164,24511,24512,24514,24516,24519,24521,24523,24526,24528,24530],{"class":166,"line":174},[164,24513,349],{"class":251},[164,24515,23862],{"class":251},[164,24517,24518],{"class":362}," defineNuxtPlugin",[164,24520,365],{"class":259},[164,24522,365],{"class":255},[164,24524,24525],{"class":791},"nuxtApp",[164,24527,402],{"class":255},[164,24529,797],{"class":352},[164,24531,378],{"class":255},[164,24533,24534,24537,24539,24542,24544,24546,24549,24551,24553,24556],{"class":166,"line":16},[164,24535,24536],{"class":259}," nuxtApp",[164,24538,405],{"class":255},[164,24540,24541],{"class":362},"provide",[164,24543,365],{"class":384},[164,24545,368],{"class":255},[164,24547,24548],{"class":288},"myPlugin",[164,24550,368],{"class":255},[164,24552,263],{"class":255},[164,24554,24555],{"class":259}," myPlugin",[164,24557,532],{"class":384},[164,24559,24560,24562],{"class":166,"line":185},[164,24561,529],{"class":255},[164,24563,532],{"class":259},[102,24565,24566,24568],{},[119,24567,23942],{}," (same, but better type inference)",[154,24570,24572],{"className":156,"code":24571,"language":158,"meta":159,"style":159},"// plugins/my-plugin.ts\nexport default defineNuxtPlugin((nuxtApp) => {\n nuxtApp.provide(\"myPlugin\", myPlugin)\n})\n\n// Usage in components (auto-typed)\nconst { $myPlugin } = useNuxtApp()\n",[161,24573,24574,24578,24598,24620,24626,24630,24635],{"__ignoreMap":159},[164,24575,24576],{"class":166,"line":167},[164,24577,24509],{"class":170},[164,24579,24580,24582,24584,24586,24588,24590,24592,24594,24596],{"class":166,"line":174},[164,24581,349],{"class":251},[164,24583,23862],{"class":251},[164,24585,24518],{"class":362},[164,24587,365],{"class":259},[164,24589,365],{"class":255},[164,24591,24525],{"class":791},[164,24593,402],{"class":255},[164,24595,797],{"class":352},[164,24597,378],{"class":255},[164,24599,24600,24602,24604,24606,24608,24610,24612,24614,24616,24618],{"class":166,"line":16},[164,24601,24536],{"class":259},[164,24603,405],{"class":255},[164,24605,24541],{"class":362},[164,24607,365],{"class":384},[164,24609,368],{"class":255},[164,24611,24548],{"class":288},[164,24613,368],{"class":255},[164,24615,263],{"class":255},[164,24617,24555],{"class":259},[164,24619,532],{"class":384},[164,24621,24622,24624],{"class":166,"line":185},[164,24623,529],{"class":255},[164,24625,532],{"class":259},[164,24627,24628],{"class":166,"line":191},[164,24629,343],{"emptyLinePlaceholder":342},[164,24631,24632],{"class":166,"line":346},[164,24633,24634],{"class":170},"// Usage in components (auto-typed)\n",[164,24636,24637,24639,24641,24644,24646,24648,24651],{"class":166,"line":381},[164,24638,721],{"class":352},[164,24640,256],{"class":255},[164,24642,24643],{"class":259}," $myPlugin ",[164,24645,529],{"class":255},[164,24647,601],{"class":255},[164,24649,24650],{"class":362}," useNuxtApp",[164,24652,734],{"class":259},[149,24654,24656],{"id":24655},"step-7-update-server-routes","Step 7: Update Server Routes",[102,24658,24659],{},"Migrate server middleware to Nitro server routes:",[102,24661,24662],{},[119,24663,24664],{},"Old (Nuxt 3 server middleware):",[154,24666,24668],{"className":156,"code":24667,"language":158,"meta":159,"style":159},"// server/middleware/auth.ts\nexport default defineEventHandler((event) => {\n // middleware logic\n})\n",[161,24669,24670,24675,24696,24701],{"__ignoreMap":159},[164,24671,24672],{"class":166,"line":167},[164,24673,24674],{"class":170},"// server/middleware/auth.ts\n",[164,24676,24677,24679,24681,24684,24686,24688,24690,24692,24694],{"class":166,"line":174},[164,24678,349],{"class":251},[164,24680,23862],{"class":251},[164,24682,24683],{"class":362}," defineEventHandler",[164,24685,365],{"class":259},[164,24687,365],{"class":255},[164,24689,15679],{"class":791},[164,24691,402],{"class":255},[164,24693,797],{"class":352},[164,24695,378],{"class":255},[164,24697,24698],{"class":166,"line":16},[164,24699,24700],{"class":170}," // middleware logic\n",[164,24702,24703,24705],{"class":166,"line":185},[164,24704,529],{"class":255},[164,24706,532],{"class":259},[102,24708,24709],{},[119,24710,24711],{},"New (Nitro server routes - same syntax, better performance):",[154,24713,24715],{"className":156,"code":24714,"language":158,"meta":159,"style":159},"// server/api/auth.ts\nexport default defineEventHandler((event) => {\n // API route logic\n return { user: event.context.user }\n})\n",[161,24716,24717,24722,24742,24747,24771],{"__ignoreMap":159},[164,24718,24719],{"class":166,"line":167},[164,24720,24721],{"class":170},"// server/api/auth.ts\n",[164,24723,24724,24726,24728,24730,24732,24734,24736,24738,24740],{"class":166,"line":174},[164,24725,349],{"class":251},[164,24727,23862],{"class":251},[164,24729,24683],{"class":362},[164,24731,365],{"class":259},[164,24733,365],{"class":255},[164,24735,15679],{"class":791},[164,24737,402],{"class":255},[164,24739,797],{"class":352},[164,24741,378],{"class":255},[164,24743,24744],{"class":166,"line":16},[164,24745,24746],{"class":170}," // API route logic\n",[164,24748,24749,24751,24753,24755,24757,24760,24762,24765,24767,24769],{"class":166,"line":185},[164,24750,895],{"class":251},[164,24752,256],{"class":255},[164,24754,848],{"class":384},[164,24756,388],{"class":255},[164,24758,24759],{"class":259}," event",[164,24761,405],{"class":255},[164,24763,24764],{"class":259},"context",[164,24766,405],{"class":255},[164,24768,7857],{"class":259},[164,24770,4151],{"class":255},[164,24772,24773,24775],{"class":166,"line":191},[164,24774,529],{"class":255},[164,24776,532],{"class":259},[149,24778,24780],{"id":24779},"step-8-replace-vuex-with-pinia","Step 8: Replace Vuex with Pinia",[102,24782,24783],{},"If you're still using Vuex, migrate to Pinia:",[102,24785,24786],{},[119,24787,24788],{},"Install Pinia:",[154,24790,24792],{"className":3596,"code":24791,"language":3598,"meta":159,"style":159},"npm install pinia @pinia/nuxt\n",[161,24793,24794],{"__ignoreMap":159},[164,24795,24796,24798,24800,24803],{"class":166,"line":167},[164,24797,23495],{"class":597},[164,24799,23498],{"class":288},[164,24801,24802],{"class":288}," pinia",[164,24804,24805],{"class":288}," @pinia/nuxt\n",[102,24807,24808],{},[119,24809,24810],{},"Add to nuxt.config.ts:",[154,24812,24814],{"className":156,"code":24813,"language":158,"meta":159,"style":159},"export default defineNuxtConfig({\n modules: [\"@pinia/nuxt\"],\n})\n",[161,24815,24816,24828,24847],{"__ignoreMap":159},[164,24817,24818,24820,24822,24824,24826],{"class":166,"line":167},[164,24819,349],{"class":251},[164,24821,23862],{"class":251},[164,24823,23865],{"class":362},[164,24825,365],{"class":259},[164,24827,906],{"class":255},[164,24829,24830,24832,24834,24836,24838,24841,24843,24845],{"class":166,"line":174},[164,24831,23874],{"class":384},[164,24833,388],{"class":255},[164,24835,6257],{"class":259},[164,24837,368],{"class":255},[164,24839,24840],{"class":288},"@pinia/nuxt",[164,24842,368],{"class":255},[164,24844,925],{"class":259},[164,24846,421],{"class":255},[164,24848,24849,24851],{"class":166,"line":16},[164,24850,529],{"class":255},[164,24852,532],{"class":259},[102,24854,24855],{},[119,24856,24857],{},"Migrate stores:",[154,24859,24861],{"className":156,"code":24860,"language":158,"meta":159,"style":159},"// stores/counter.ts\nexport const useCounterStore = defineStore(\"counter\", {\n state: () => ({\n count: 0,\n }),\n actions: {\n increment() {\n this.count++\n },\n },\n})\n",[161,24862,24863,24868,24895,24910,24922,24930,24939,24948,24957,24961,24965],{"__ignoreMap":159},[164,24864,24865],{"class":166,"line":167},[164,24866,24867],{"class":170},"// stores/counter.ts\n",[164,24869,24870,24872,24874,24877,24879,24882,24884,24886,24889,24891,24893],{"class":166,"line":174},[164,24871,349],{"class":251},[164,24873,353],{"class":352},[164,24875,24876],{"class":259}," useCounterStore ",[164,24878,359],{"class":255},[164,24880,24881],{"class":362}," defineStore",[164,24883,365],{"class":259},[164,24885,368],{"class":255},[164,24887,24888],{"class":288},"counter",[164,24890,368],{"class":255},[164,24892,263],{"class":255},[164,24894,378],{"class":255},[164,24896,24897,24900,24902,24904,24906,24908],{"class":166,"line":16},[164,24898,24899],{"class":362}," state",[164,24901,388],{"class":255},[164,24903,1313],{"class":255},[164,24905,797],{"class":352},[164,24907,788],{"class":259},[164,24909,906],{"class":255},[164,24911,24912,24915,24917,24920],{"class":166,"line":185},[164,24913,24914],{"class":384}," count",[164,24916,388],{"class":255},[164,24918,24919],{"class":921}," 0",[164,24921,421],{"class":255},[164,24923,24924,24926,24928],{"class":166,"line":191},[164,24925,987],{"class":255},[164,24927,402],{"class":259},[164,24929,421],{"class":255},[164,24931,24932,24935,24937],{"class":166,"line":346},[164,24933,24934],{"class":384}," actions",[164,24936,388],{"class":255},[164,24938,378],{"class":255},[164,24940,24941,24944,24946],{"class":166,"line":381},[164,24942,24943],{"class":384}," increment",[164,24945,411],{"class":255},[164,24947,378],{"class":255},[164,24949,24950,24952,24954],{"class":166,"line":424},[164,24951,15734],{"class":255},[164,24953,12412],{"class":259},[164,24955,24956],{"class":255},"++\n",[164,24958,24959],{"class":166,"line":461},[164,24960,981],{"class":255},[164,24962,24963],{"class":166,"line":490},[164,24964,1748],{"class":255},[164,24966,24967,24969],{"class":166,"line":526},[164,24968,529],{"class":255},[164,24970,532],{"class":259},[3996,24972],{},[98,24974,24976],{"id":24975},"breaking-changes-solutions","Breaking Changes & Solutions",[149,24978,24980],{"id":24979},"_1-stricter-typescript","1. Stricter TypeScript",[102,24982,24983],{},"Nuxt 4 enables stricter TypeScript by default.",[102,24985,24986,24989],{},[119,24987,24988],{},"Issue:"," Type errors that were ignored before",[102,24991,24992,24995,24996,388],{},[119,24993,24994],{},"Solution:"," Fix types or adjust ",[161,24997,24998],{},"tsconfig.json",[154,25000,25002],{"className":156,"code":25001,"language":158,"meta":159,"style":159},"// tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true\n }\n}\n",[161,25003,25004,25008,25012,25025,25039,25052,25056],{"__ignoreMap":159},[164,25005,25006],{"class":166,"line":167},[164,25007,6186],{"class":170},[164,25009,25010],{"class":166,"line":174},[164,25011,906],{"class":255},[164,25013,25014,25016,25018,25020,25023],{"class":166,"line":16},[164,25015,2676],{"class":255},[164,25017,6197],{"class":288},[164,25019,368],{"class":255},[164,25021,25022],{"class":384},": ",[164,25024,906],{"class":255},[164,25026,25027,25029,25031,25033,25035,25037],{"class":166,"line":185},[164,25028,5227],{"class":255},[164,25030,6313],{"class":384},[164,25032,368],{"class":255},[164,25034,388],{"class":255},[164,25036,2865],{"class":1737},[164,25038,421],{"class":255},[164,25040,25041,25043,25046,25048,25050],{"class":166,"line":191},[164,25042,5227],{"class":255},[164,25044,25045],{"class":384},"noImplicitAny",[164,25047,368],{"class":255},[164,25049,388],{"class":255},[164,25051,1738],{"class":1737},[164,25053,25054],{"class":166,"line":346},[164,25055,1260],{"class":255},[164,25057,25058],{"class":166,"line":381},[164,25059,1281],{"class":255},[149,25061,25063],{"id":25062},"_2-nested-routing-changes","2. Nested Routing Changes",[102,25065,25066],{},"Nuxt 4 has stricter nested routing behavior.",[102,25068,25069,25071],{},[119,25070,24988],{}," Routes not working as expected",[102,25073,25074,25076],{},[119,25075,24994],{}," Check file structure:",[154,25078,25081],{"className":25079,"code":25080,"language":24084},[24082],"pages/\n├── users/\n│ ├── index.vue → /users\n│ └── [id].vue → /users/:id\n",[161,25082,25080],{"__ignoreMap":159},[149,25084,25086],{"id":25085},"_3-module-api-changes","3. Module API Changes",[102,25088,25089],{},"Some modules changed their APIs.",[102,25091,25092],{},[119,25093,25094],{},"Example - @nuxt/content v3:",[154,25096,25098],{"className":156,"code":25097,"language":158,"meta":159,"style":159},"// Old\nconst articles = await queryContent(\"articles\").find()\n\n// New (same API, better types)\nconst articles = await queryCollection(\"articles\").find()\n",[161,25099,25100,25105,25137,25141,25146],{"__ignoreMap":159},[164,25101,25102],{"class":166,"line":167},[164,25103,25104],{"class":170},"// Old\n",[164,25106,25107,25109,25112,25114,25116,25119,25121,25123,25126,25128,25130,25132,25135],{"class":166,"line":174},[164,25108,721],{"class":352},[164,25110,25111],{"class":259}," articles ",[164,25113,359],{"class":255},[164,25115,853],{"class":251},[164,25117,25118],{"class":362}," queryContent",[164,25120,365],{"class":259},[164,25122,368],{"class":255},[164,25124,25125],{"class":288},"articles",[164,25127,368],{"class":255},[164,25129,402],{"class":259},[164,25131,405],{"class":255},[164,25133,25134],{"class":362},"find",[164,25136,734],{"class":259},[164,25138,25139],{"class":166,"line":16},[164,25140,343],{"emptyLinePlaceholder":342},[164,25142,25143],{"class":166,"line":185},[164,25144,25145],{"class":170},"// New (same API, better types)\n",[164,25147,25148,25150,25152,25154,25156,25159,25161,25163,25165,25167,25169,25171,25173],{"class":166,"line":191},[164,25149,721],{"class":352},[164,25151,25111],{"class":259},[164,25153,359],{"class":255},[164,25155,853],{"class":251},[164,25157,25158],{"class":362}," queryCollection",[164,25160,365],{"class":259},[164,25162,368],{"class":255},[164,25164,25125],{"class":288},[164,25166,368],{"class":255},[164,25168,402],{"class":259},[164,25170,405],{"class":255},[164,25172,25134],{"class":362},[164,25174,734],{"class":259},[149,25176,25178],{"id":25177},"_4-deprecated-apis","4. Deprecated APIs",[102,25180,25181],{},[119,25182,25183],{},"Removed:",[113,25185,25186,25192,25198],{},[116,25187,25188,25191],{},[161,25189,25190],{},"@nuxt/types"," (use built-in types)",[116,25193,25194,25197],{},[161,25195,25196],{},"nuxt.config.js"," (use .ts only)",[116,25199,25200],{},"Some legacy hooks",[102,25202,25203],{},[119,25204,25205],{},"Check deprecated APIs:",[154,25207,25209],{"className":3596,"code":25208,"language":3598,"meta":159,"style":159},"npx nuxi analyze\n",[161,25210,25211],{"__ignoreMap":159},[164,25212,25213,25215,25217],{"class":166,"line":167},[164,25214,23475],{"class":597},[164,25216,23478],{"class":288},[164,25218,25219],{"class":288}," analyze\n",[3996,25221],{},[98,25223,25225],{"id":25224},"common-issues-troubleshooting","Common Issues & Troubleshooting",[149,25227,25229],{"id":25228},"issue-1-module-x-is-not-compatible-with-nuxt-4","Issue 1: \"Module X is not compatible with Nuxt 4\"",[102,25231,25232],{},[119,25233,24994],{},[154,25235,25237],{"className":3596,"code":25236,"language":3598,"meta":159,"style":159},"# Check for updates\nnpm outdated\n\n# Update specific module\nnpm install @nuxt/content@latest\n\n# Or find alternative\n# Check Nuxt modules directory: https://nuxt.com/modules\n",[161,25238,25239,25244,25251,25255,25260,25269,25273,25278],{"__ignoreMap":159},[164,25240,25241],{"class":166,"line":167},[164,25242,25243],{"class":170},"# Check for updates\n",[164,25245,25246,25248],{"class":166,"line":174},[164,25247,23495],{"class":597},[164,25249,25250],{"class":288}," outdated\n",[164,25252,25253],{"class":166,"line":16},[164,25254,343],{"emptyLinePlaceholder":342},[164,25256,25257],{"class":166,"line":185},[164,25258,25259],{"class":170},"# Update specific module\n",[164,25261,25262,25264,25266],{"class":166,"line":191},[164,25263,23495],{"class":597},[164,25265,23498],{"class":288},[164,25267,25268],{"class":288}," @nuxt/content@latest\n",[164,25270,25271],{"class":166,"line":346},[164,25272,343],{"emptyLinePlaceholder":342},[164,25274,25275],{"class":166,"line":381},[164,25276,25277],{"class":170},"# Or find alternative\n",[164,25279,25280],{"class":166,"line":424},[164,25281,25282],{"class":170},"# Check Nuxt modules directory: https://nuxt.com/modules\n",[149,25284,25286],{"id":25285},"issue-2-typescript-errors-after-migration","Issue 2: TypeScript Errors After Migration",[102,25288,25289],{},[119,25290,24994],{},[154,25292,25294],{"className":3596,"code":25293,"language":3598,"meta":159,"style":159},"# Regenerate types\nnpx nuxi prepare\n\n# Clear cache\nnpx nuxi cleanup\n\n# Check specific file\nnpx tsc --noEmit --pretty\n",[161,25295,25296,25301,25310,25314,25319,25328,25332,25337],{"__ignoreMap":159},[164,25297,25298],{"class":166,"line":167},[164,25299,25300],{"class":170},"# Regenerate types\n",[164,25302,25303,25305,25307],{"class":166,"line":174},[164,25304,23475],{"class":597},[164,25306,23478],{"class":288},[164,25308,25309],{"class":288}," prepare\n",[164,25311,25312],{"class":166,"line":16},[164,25313,343],{"emptyLinePlaceholder":342},[164,25315,25316],{"class":166,"line":185},[164,25317,25318],{"class":170},"# Clear cache\n",[164,25320,25321,25323,25325],{"class":166,"line":191},[164,25322,23475],{"class":597},[164,25324,23478],{"class":288},[164,25326,25327],{"class":288}," cleanup\n",[164,25329,25330],{"class":166,"line":346},[164,25331,343],{"emptyLinePlaceholder":342},[164,25333,25334],{"class":166,"line":381},[164,25335,25336],{"class":170},"# Check specific file\n",[164,25338,25339,25341,25344,25347],{"class":166,"line":424},[164,25340,23475],{"class":597},[164,25342,25343],{"class":288}," tsc",[164,25345,25346],{"class":288}," --noEmit",[164,25348,25349],{"class":288}," --pretty\n",[149,25351,25353],{"id":25352},"issue-3-build-fails-with-cannot-find-module","Issue 3: Build Fails with \"Cannot find module\"",[102,25355,25356],{},[119,25357,24994],{},[154,25359,25361],{"className":3596,"code":25360,"language":3598,"meta":159,"style":159},"# Clear node_modules and reinstall\nrm -rf node_modules .nuxt\nnpm install\nnpx nuxi prepare\n",[161,25362,25363,25368,25382,25388],{"__ignoreMap":159},[164,25364,25365],{"class":166,"line":167},[164,25366,25367],{"class":170},"# Clear node_modules and reinstall\n",[164,25369,25370,25373,25376,25379],{"class":166,"line":174},[164,25371,25372],{"class":597},"rm",[164,25374,25375],{"class":288}," -rf",[164,25377,25378],{"class":288}," node_modules",[164,25380,25381],{"class":288}," .nuxt\n",[164,25383,25384,25386],{"class":166,"line":16},[164,25385,23495],{"class":597},[164,25387,23841],{"class":288},[164,25389,25390,25392,25394],{"class":166,"line":185},[164,25391,23475],{"class":597},[164,25393,23478],{"class":288},[164,25395,25309],{"class":288},[149,25397,25399],{"id":25398},"issue-4-hmr-not-working","Issue 4: HMR Not Working",[102,25401,25402],{},[119,25403,24994],{},[154,25405,25407],{"className":156,"code":25406,"language":158,"meta":159,"style":159},"// nuxt.config.ts\nexport default defineNuxtConfig({\n vite: {\n server: {\n watch: {\n usePolling: true,\n },\n },\n },\n})\n",[161,25408,25409,25414,25426,25435,25444,25453,25464,25468,25472,25476],{"__ignoreMap":159},[164,25410,25411],{"class":166,"line":167},[164,25412,25413],{"class":170},"// nuxt.config.ts\n",[164,25415,25416,25418,25420,25422,25424],{"class":166,"line":174},[164,25417,349],{"class":251},[164,25419,23862],{"class":251},[164,25421,23865],{"class":362},[164,25423,365],{"class":259},[164,25425,906],{"class":255},[164,25427,25428,25431,25433],{"class":166,"line":16},[164,25429,25430],{"class":384}," vite",[164,25432,388],{"class":255},[164,25434,378],{"class":255},[164,25436,25437,25440,25442],{"class":166,"line":185},[164,25438,25439],{"class":384}," server",[164,25441,388],{"class":255},[164,25443,378],{"class":255},[164,25445,25446,25449,25451],{"class":166,"line":191},[164,25447,25448],{"class":384}," watch",[164,25450,388],{"class":255},[164,25452,378],{"class":255},[164,25454,25455,25458,25460,25462],{"class":166,"line":346},[164,25456,25457],{"class":384}," usePolling",[164,25459,388],{"class":255},[164,25461,2865],{"class":1737},[164,25463,421],{"class":255},[164,25465,25466],{"class":166,"line":381},[164,25467,2883],{"class":255},[164,25469,25470],{"class":166,"line":424},[164,25471,981],{"class":255},[164,25473,25474],{"class":166,"line":461},[164,25475,1748],{"class":255},[164,25477,25478,25480],{"class":166,"line":490},[164,25479,529],{"class":255},[164,25481,532],{"class":259},[149,25483,25485],{"id":25484},"issue-5-server-routes-not-working","Issue 5: Server Routes Not Working",[102,25487,25488],{},[119,25489,24994],{},[113,25491,25492,25501,25504],{},[116,25493,25494,25495,5629,25498],{},"Ensure files are in ",[161,25496,25497],{},"server/api/",[161,25499,25500],{},"server/routes/",[116,25502,25503],{},"Check Nitro configuration",[116,25505,25506],{},"Restart dev server",[3996,25508],{},[98,25510,25512],{"id":25511},"post-migration-checklist","Post-Migration Checklist",[102,25514,25515],{},"After completing the migration:",[149,25517,25519],{"id":25518},"_1-run-full-test-suite","✅ 1. Run Full Test Suite",[154,25521,25523],{"className":3596,"code":25522,"language":3598,"meta":159,"style":159},"npm run test\nnpm run test:e2e\n",[161,25524,25525,25533],{"__ignoreMap":159},[164,25526,25527,25529,25531],{"class":166,"line":167},[164,25528,23495],{"class":597},[164,25530,23625],{"class":288},[164,25532,23649],{"class":288},[164,25534,25535,25537,25539],{"class":166,"line":174},[164,25536,23495],{"class":597},[164,25538,23625],{"class":288},[164,25540,25541],{"class":288}," test:e2e\n",[149,25543,25545],{"id":25544},"_2-type-check","✅ 2. Type Check",[154,25547,25548],{"className":3596,"code":23616,"language":3598,"meta":159,"style":159},[161,25549,25550],{"__ignoreMap":159},[164,25551,25552,25554,25556],{"class":166,"line":167},[164,25553,23495],{"class":597},[164,25555,23625],{"class":288},[164,25557,23628],{"class":288},[149,25559,25561],{"id":25560},"_3-build-production","✅ 3. Build Production",[154,25563,25565],{"className":3596,"code":25564,"language":3598,"meta":159,"style":159},"npm run build\nnpm run preview\n",[161,25566,25567,25576],{"__ignoreMap":159},[164,25568,25569,25571,25573],{"class":166,"line":167},[164,25570,23495],{"class":597},[164,25572,23625],{"class":288},[164,25574,25575],{"class":288}," build\n",[164,25577,25578,25580,25582],{"class":166,"line":174},[164,25579,23495],{"class":597},[164,25581,23625],{"class":288},[164,25583,25584],{"class":288}," preview\n",[149,25586,25588],{"id":25587},"_4-performance-audit","✅ 4. Performance Audit",[154,25590,25592],{"className":3596,"code":25591,"language":3598,"meta":159,"style":159},"# Run Lighthouse\nnpx lighthouse http://localhost:3000\n",[161,25593,25594,25599],{"__ignoreMap":159},[164,25595,25596],{"class":166,"line":167},[164,25597,25598],{"class":170},"# Run Lighthouse\n",[164,25600,25601,25603,25606],{"class":166,"line":174},[164,25602,23475],{"class":597},[164,25604,25605],{"class":288}," lighthouse",[164,25607,25608],{"class":288}," http://localhost:3000\n",[149,25610,25612],{"id":25611},"_5-monitor-in-production","✅ 5. Monitor in Production",[113,25614,25615,25618,25621],{},[116,25616,25617],{},"Set up error tracking (Sentry, LogRocket)",[116,25619,25620],{},"Monitor Core Web Vitals",[116,25622,25623],{},"Check analytics for issues",[3996,25625],{},[98,25627,25629],{"id":25628},"migration-timeline","Migration Timeline",[102,25631,25632],{},[119,25633,25634],{},"Recommended Schedule:",[113,25636,25637,25643,25649],{},[116,25638,25639,25642],{},[119,25640,25641],{},"Week 1",": Pre-migration preparation (updates, backups, compatibility check)",[116,25644,25645,25648],{},[119,25646,25647],{},"Week 2",": Run codemod, fix breaking changes, update modules",[116,25650,25651,25654],{},[119,25652,25653],{},"Week 3",": Testing, performance optimization, deployment",[102,25656,25657,25660],{},[119,25658,25659],{},"Don't wait until January 2026!"," Start your migration now to avoid last-minute issues.",[3996,25662],{},[98,25664,25666],{"id":25665},"performance-improvements-after-migration","Performance Improvements After Migration",[102,25668,25669],{},"Real-world results from migrating to Nuxt 4:",[25671,25672,25673,25692],"table",{},[25674,25675,25676],"thead",{},[25677,25678,25679,25683,25686,25689],"tr",{},[25680,25681,25682],"th",{},"Metric",[25680,25684,25685],{},"Nuxt 3",[25680,25687,25688],{},"Nuxt 4",[25680,25690,25691],{},"Improvement",[25693,25694,25695,25712,25728,25744,25760],"tbody",{},[25677,25696,25697,25701,25704,25707],{},[25698,25699,25700],"td",{},"Build Time",[25698,25702,25703],{},"45s",[25698,25705,25706],{},"32s",[25698,25708,25709],{},[119,25710,25711],{},"29% faster",[25677,25713,25714,25717,25720,25723],{},[25698,25715,25716],{},"HMR Update",[25698,25718,25719],{},"800ms",[25698,25721,25722],{},"350ms",[25698,25724,25725],{},[119,25726,25727],{},"56% faster",[25677,25729,25730,25733,25736,25739],{},[25698,25731,25732],{},"LCP",[25698,25734,25735],{},"2.1s",[25698,25737,25738],{},"1.6s",[25698,25740,25741],{},[119,25742,25743],{},"24% faster",[25677,25745,25746,25749,25752,25755],{},[25698,25747,25748],{},"Bundle Size",[25698,25750,25751],{},"185KB",[25698,25753,25754],{},"162KB",[25698,25756,25757],{},[119,25758,25759],{},"12% smaller",[25677,25761,25762,25765,25768,25771],{},[25698,25763,25764],{},"TTI",[25698,25766,25767],{},"3.2s",[25698,25769,25770],{},"2.4s",[25698,25772,25773],{},[119,25774,25775],{},"25% faster",[3996,25777],{},[98,25779,25781],{"id":25780},"faq-nuxt-3-to-nuxt-4-migration","FAQ: Nuxt 3 to Nuxt 4 Migration",[149,25783,25785],{"id":25784},"when-is-nuxt-3-end-of-life","When is Nuxt 3 end of life?",[102,25787,25788,25791],{},[119,25789,25790],{},"Nuxt 3 official support ends January 31, 2026."," After this date, there will be no security patches, bug fixes, or maintenance updates.",[149,25793,25795],{"id":25794},"how-long-does-migration-take","How long does migration take?",[102,25797,25798,25799,25802],{},"For most projects: ",[119,25800,25801],{},"4-8 hours"," of active work, spread over 2-3 days for testing. Large enterprise applications may take 1-2 weeks.",[149,25804,25806],{"id":25805},"is-nuxt-4-backward-compatible","Is Nuxt 4 backward compatible?",[102,25808,25809,25812],{},[119,25810,25811],{},"Mostly yes."," Nuxt 4 maintains compatibility with most Nuxt 3 APIs. The codemod tool handles most breaking changes automatically.",[149,25814,25816],{"id":25815},"what-if-my-module-isnt-nuxt-4-compatible","What if my module isn't Nuxt 4 compatible?",[102,25818,25819],{},"Check for:",[200,25821,25822,25825,25828],{},[116,25823,25824],{},"Module updates (many released Nuxt 4 versions)",[116,25826,25827],{},"Alternative modules",[116,25829,25830],{},"Native Nuxt 4 solutions (e.g., Nitro routes instead of middleware)",[149,25832,25834],{"id":25833},"can-i-rollback-if-migration-fails","Can I rollback if migration fails?",[102,25836,25837,25840],{},[119,25838,25839],{},"Yes."," That's why we recommend creating a git branch first. You can always checkout your pre-migration code.",[149,25842,25844],{"id":25843},"should-new-projects-start-with-nuxt-4","Should new projects start with Nuxt 4?",[102,25846,25847,25850],{},[119,25848,25849],{},"Absolutely."," Nuxt 4 is stable, production-ready, and the recommended version for all new projects in 2026.",[149,25852,25854],{"id":25853},"what-about-nuxt-5","What about Nuxt 5?",[102,25856,25857],{},"Nuxt 5 is planned for late 2026 with Nitro v3. Nuxt 4 provides a stable foundation with a clear upgrade path to Nuxt 5.",[3996,25859],{},[98,25861,25863],{"id":25862},"next-steps","Next Steps",[102,25865,25866],{},"Now that you've migrated to Nuxt 4:",[200,25868,25869,25879,25889],{},[116,25870,25871,25874,25875],{},[119,25872,25873],{},"Optimize Performance",": Read our ",[4843,25876,25878],{"href":25877},"/blog/16-nuxt-4-ssr-performance-optimization","Nuxt 4 Performance Optimization Guide",[116,25880,25881,25884,25885],{},[119,25882,25883],{},"Explore New Features",": Check out ",[4843,25886,25888],{"href":25887},"/blog/24-nuxt-4-edge-computing-guide","Nuxt UI v4",[116,25890,25891,25894,25895],{},[119,25892,25893],{},"Deploy to Edge",": Learn about ",[4843,25896,25897],{"href":25887},"Edge Computing with Nuxt 4",[3996,25899],{},[98,25901,25903],{"id":25902},"need-help","Need Help?",[102,25905,25906,25907,405],{},"Migration issues? Drop a comment below or reach out on Twitter ",[4843,25908,25911],{"href":25909,"rel":25910},"https://twitter.com/mubaidr",[4847],"@mubaidr",[102,25913,25914],{},[119,25915,25916],{},"Resources:",[113,25918,25919,25926,25933,25940],{},[116,25920,25921],{},[4843,25922,25925],{"href":25923,"rel":25924},"https://nuxt.com/docs/getting-started/upgrade",[4847],"Official Nuxt 4 Migration Guide",[116,25927,25928],{},[4843,25929,25932],{"href":25930,"rel":25931},"https://nuxt.com/blog/v4",[4847],"Nuxt 4 Release Notes",[116,25934,25935],{},[4843,25936,25939],{"href":25937,"rel":25938},"https://codemod.com/registry/nuxt-4-migration-recipe",[4847],"Codemod Tool",[116,25941,25942],{},[4843,25943,25946],{"href":25944,"rel":25945},"https://discord.nuxt.com",[4847],"Nuxt Discord",[3996,25948],{},[102,25950,25951,25954],{},[119,25952,25953],{},"Ready to migrate?"," Start with the pre-migration checklist today, and you'll be running Nuxt 4 before the end of the week. Your future self (and your users) will thank you!",[4005,25956,25957],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":159,"searchDepth":174,"depth":174,"links":25959},[25960,25961,25962,25965,25972,25982,25988,25995,26002,26003,26004,26013,26014],{"id":23267,"depth":174,"text":23262},{"id":23308,"depth":174,"text":23309},{"id":23349,"depth":174,"text":23350,"children":25963},[25964],{"id":23353,"depth":16,"text":23354},{"id":23449,"depth":174,"text":23450,"children":25966},[25967,25968,25969,25970,25971],{"id":23456,"depth":16,"text":23457},{"id":23541,"depth":16,"text":23542},{"id":23609,"depth":16,"text":23610},{"id":23631,"depth":16,"text":23632},{"id":23652,"depth":16,"text":23653},{"id":23680,"depth":174,"text":23681,"children":25973},[25974,25975,25976,25977,25978,25979,25980,25981],{"id":23684,"depth":16,"text":23685},{"id":23775,"depth":16,"text":23776},{"id":23844,"depth":16,"text":23845},{"id":24065,"depth":16,"text":24066},{"id":24168,"depth":16,"text":24169},{"id":24491,"depth":16,"text":24492},{"id":24655,"depth":16,"text":24656},{"id":24779,"depth":16,"text":24780},{"id":24975,"depth":174,"text":24976,"children":25983},[25984,25985,25986,25987],{"id":24979,"depth":16,"text":24980},{"id":25062,"depth":16,"text":25063},{"id":25085,"depth":16,"text":25086},{"id":25177,"depth":16,"text":25178},{"id":25224,"depth":174,"text":25225,"children":25989},[25990,25991,25992,25993,25994],{"id":25228,"depth":16,"text":25229},{"id":25285,"depth":16,"text":25286},{"id":25352,"depth":16,"text":25353},{"id":25398,"depth":16,"text":25399},{"id":25484,"depth":16,"text":25485},{"id":25511,"depth":174,"text":25512,"children":25996},[25997,25998,25999,26000,26001],{"id":25518,"depth":16,"text":25519},{"id":25544,"depth":16,"text":25545},{"id":25560,"depth":16,"text":25561},{"id":25587,"depth":16,"text":25588},{"id":25611,"depth":16,"text":25612},{"id":25628,"depth":174,"text":25629},{"id":25665,"depth":174,"text":25666},{"id":25780,"depth":174,"text":25781,"children":26005},[26006,26007,26008,26009,26010,26011,26012],{"id":25784,"depth":16,"text":25785},{"id":25794,"depth":16,"text":25795},{"id":25805,"depth":16,"text":25806},{"id":25815,"depth":16,"text":25816},{"id":25833,"depth":16,"text":25834},{"id":25843,"depth":16,"text":25844},{"id":25853,"depth":16,"text":25854},{"id":25862,"depth":174,"text":25863},{"id":25902,"depth":174,"text":25903},"2026-02-25","Step-by-step guide to migrate from Nuxt 3 to Nuxt 4 before January 2026 EOL. Includes codemod tools, breaking changes, module compatibility, and troubleshooting.",{"readingTime":26018,"keywords":26019},"15 min read",[26020,26021,26022,26023,26024,26025,26026,26027,26028,26029],"nuxt 3 to 4 migration","nuxt 4 upgrade guide","nuxt 4 breaking changes","migrate nuxt 3 to 4","nuxt 4 codemod","nuxt 4 migration checklist","nuxt 4 compatibility","vue 3 to vue 4","nuxt 4 typescript","nuxt 4 app directory","/blog/22-nuxt-3-to-4-migration-guide-2026",{"title":23262,"description":26016},"Modern Development","Exploring cutting-edge development practices and tools",{"src":26035,"mime":4056,"alt":26036,"width":4058,"height":4059},"/img/blog/22-nuxt-3-to-4-migration-guide-2026/banner.svg","Nuxt 3 to Nuxt 4 Migration Guide - Upgrade path diagram with before and after code examples","blog/22-nuxt-3-to-4-migration-guide-2026",[26039,26040,26041,4062,26042],"Nuxt","Vue","Migration","Web Development","s1UGLxrbneRBuHSmwjworg3f6K2Y8ZzD_eJLKdzGve8",{"id":26045,"title":26046,"abstract":92,"author":93,"authorUrl":92,"body":26047,"date":29382,"dateUpdated":29382,"description":29383,"excerpt":92,"extension":4047,"featured":342,"headline":92,"image":92,"meta":29384,"navigation":342,"ogImage":92,"path":29385,"seo":29386,"series":29387,"seriesDescription":29388,"seriesOrder":167,"socialImage":29389,"stem":29392,"tags":29393,"__hash__":29395},"blog/blog/33-full-stack-development-2026-roadmap.md","Full-Stack Development in 2026: Complete Roadmap",{"type":95,"value":26048,"toc":29340},[26049,26052,26055,26058,26062,26064,26070,26074,26078,26082,26173,26177,26284,26288,26292,26570,26574,26879,26883,26886,27252,27256,27307,27311,27313,27394,27398,27620,27624,27628,27985,27989,28289,28293,28676,28680,28684,28690,28694,28700,28704,28710,28714,28717,28783,28787,28871,28875,28879,28959,28963,28995,28999,29016,29020,29081,29085,29089,29149,29153,29183,29187,29256,29260,29264,29294,29298,29321,29323,29326,29329,29331,29337],[98,26050,26046],{"id":26051},"full-stack-development-in-2026-complete-roadmap",[102,26053,26054],{},"The role of a full-stack developer has evolved dramatically. In 2026, full-stack doesn't just mean knowing frontend and backend—it means understanding the entire development lifecycle, from database design to deployment, from performance optimization to security.",[102,26056,26057],{},"This comprehensive roadmap will guide you through becoming a successful full-stack developer in 2026.",[98,26059,26061],{"id":26060},"the-modern-full-stack-stack","The Modern Full-Stack Stack",[149,26063,152],{"id":151},[154,26065,26068],{"className":26066,"code":26067,"language":24084},[24082],"Frontend:\n- TypeScript (mandatory)\n- React/Vue/Svelte\n- Next.js/Nuxt/SvelteKit\n- Tailwind CSS\n- TanStack Query\n\nBackend:\n- Node.js/Deno/Bun\n- Hono/Express/Fastify\n- PostgreSQL/MySQL\n- Redis\n- GraphQL/REST/tRPC\n\nInfrastructure:\n- Docker\n- Kubernetes (basics)\n- AWS/GCP/Azure\n- Vercel/Netlify/Railway\n- GitHub Actions\n",[161,26069,26067],{"__ignoreMap":159},[98,26071,26073],{"id":26072},"learning-path","Learning Path",[149,26075,26077],{"id":26076},"phase-1-foundations-months-1-3","Phase 1: Foundations (Months 1-3)",[4935,26079,26081],{"id":26080},"javascripttypescript-mastery","JavaScript/TypeScript Mastery",[154,26083,26085],{"className":156,"code":26084,"language":158,"meta":159,"style":159},"// Essential concepts\nconst fundamentals = [\n \"Closures and scope\",\n \"Async/await and Promises\",\n \"Event loop\",\n \"ES6+ features\",\n \"TypeScript types\",\n \"Generics\",\n]\n",[161,26086,26087,26092,26103,26114,26125,26136,26147,26158,26169],{"__ignoreMap":159},[164,26088,26089],{"class":166,"line":167},[164,26090,26091],{"class":170},"// Essential concepts\n",[164,26093,26094,26096,26099,26101],{"class":166,"line":174},[164,26095,721],{"class":352},[164,26097,26098],{"class":259}," fundamentals ",[164,26100,359],{"class":255},[164,26102,9281],{"class":259},[164,26104,26105,26107,26110,26112],{"class":166,"line":16},[164,26106,2676],{"class":255},[164,26108,26109],{"class":288},"Closures and scope",[164,26111,368],{"class":255},[164,26113,421],{"class":255},[164,26115,26116,26118,26121,26123],{"class":166,"line":185},[164,26117,2676],{"class":255},[164,26119,26120],{"class":288},"Async/await and Promises",[164,26122,368],{"class":255},[164,26124,421],{"class":255},[164,26126,26127,26129,26132,26134],{"class":166,"line":191},[164,26128,2676],{"class":255},[164,26130,26131],{"class":288},"Event loop",[164,26133,368],{"class":255},[164,26135,421],{"class":255},[164,26137,26138,26140,26143,26145],{"class":166,"line":346},[164,26139,2676],{"class":255},[164,26141,26142],{"class":288},"ES6+ features",[164,26144,368],{"class":255},[164,26146,421],{"class":255},[164,26148,26149,26151,26154,26156],{"class":166,"line":381},[164,26150,2676],{"class":255},[164,26152,26153],{"class":288},"TypeScript types",[164,26155,368],{"class":255},[164,26157,421],{"class":255},[164,26159,26160,26162,26165,26167],{"class":166,"line":424},[164,26161,2676],{"class":255},[164,26163,26164],{"class":288},"Generics",[164,26166,368],{"class":255},[164,26168,421],{"class":255},[164,26170,26171],{"class":166,"line":461},[164,26172,6542],{"class":259},[4935,26174,26176],{"id":26175},"htmlcss-deep-dive","HTML/CSS Deep Dive",[154,26178,26182],{"className":26179,"code":26180,"language":26181,"meta":159,"style":159},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","/* Modern CSS features */\n.container {\n display: grid;\n gap: 1rem;\n container-type: inline-size;\n}\n\n@container (min-width: 600px) {\n .item {\n grid-column: span 2;\n }\n}\n","css",[161,26183,26184,26189,26198,26212,26224,26236,26240,26244,26254,26262,26276,26280],{"__ignoreMap":159},[164,26185,26186],{"class":166,"line":167},[164,26187,26188],{"class":170},"/* Modern CSS features */\n",[164,26190,26191,26193,26196],{"class":166,"line":174},[164,26192,405],{"class":255},[164,26194,26195],{"class":597},"container",[164,26197,378],{"class":255},[164,26199,26200,26204,26206,26209],{"class":166,"line":16},[164,26201,26203],{"class":26202},"sqsOY"," display",[164,26205,388],{"class":255},[164,26207,26208],{"class":259}," grid",[164,26210,26211],{"class":255},";\n",[164,26213,26214,26217,26219,26222],{"class":166,"line":185},[164,26215,26216],{"class":26202}," gap",[164,26218,388],{"class":255},[164,26220,26221],{"class":921}," 1rem",[164,26223,26211],{"class":255},[164,26225,26226,26229,26231,26234],{"class":166,"line":191},[164,26227,26228],{"class":26202}," container-type",[164,26230,388],{"class":255},[164,26232,26233],{"class":259}," inline-size",[164,26235,26211],{"class":255},[164,26237,26238],{"class":166,"line":346},[164,26239,1281],{"class":255},[164,26241,26242],{"class":166,"line":381},[164,26243,343],{"emptyLinePlaceholder":342},[164,26245,26246,26249,26252],{"class":166,"line":424},[164,26247,26248],{"class":251},"@container",[164,26250,26251],{"class":259}," (min-width: 600px) ",[164,26253,906],{"class":255},[164,26255,26256,26258,26260],{"class":166,"line":461},[164,26257,12572],{"class":255},[164,26259,16415],{"class":597},[164,26261,378],{"class":255},[164,26263,26264,26267,26269,26272,26274],{"class":166,"line":490},[164,26265,26266],{"class":26202}," grid-column",[164,26268,388],{"class":255},[164,26270,26271],{"class":259}," span ",[164,26273,8473],{"class":921},[164,26275,26211],{"class":255},[164,26277,26278],{"class":166,"line":526},[164,26279,1260],{"class":255},[164,26281,26282],{"class":166,"line":535},[164,26283,1281],{"class":255},[149,26285,26287],{"id":26286},"phase-2-frontend-specialization-months-4-6","Phase 2: Frontend Specialization (Months 4-6)",[4935,26289,26291],{"id":26290},"component-architecture","Component Architecture",[154,26293,26295],{"className":2991,"code":26294,"language":2993,"meta":159,"style":159},"\n\n\n",[161,26296,26297,26317,26322,26331,26340,26368,26372,26376,26395,26409,26427,26433,26441,26445,26453,26461,26478,26486,26531,26536,26545,26554,26562],{"__ignoreMap":159},[164,26298,26299,26301,26303,26305,26307,26309,26311,26313,26315],{"class":166,"line":167},[164,26300,1122],{"class":255},[164,26302,1812],{"class":384},[164,26304,3009],{"class":352},[164,26306,3012],{"class":352},[164,26308,359],{"class":255},[164,26310,368],{"class":255},[164,26312,1535],{"class":288},[164,26314,368],{"class":255},[164,26316,1540],{"class":255},[164,26318,26319],{"class":166,"line":174},[164,26320,26321],{"class":170},"// Nuxt 4 component\n",[164,26323,26324,26326,26329],{"class":166,"line":16},[164,26325,3376],{"class":352},[164,26327,26328],{"class":597}," Props",[164,26330,378],{"class":255},[164,26332,26333,26336,26338],{"class":166,"line":185},[164,26334,26335],{"class":384}," title",[164,26337,388],{"class":255},[164,26339,3389],{"class":597},[164,26341,26342,26345,26347,26350,26352,26354,26356,26358,26360,26362,26364,26366],{"class":166,"line":191},[164,26343,26344],{"class":384}," items",[164,26346,388],{"class":255},[164,26348,26349],{"class":597}," Array",[164,26351,1672],{"class":255},[164,26353,2713],{"class":384},[164,26355,388],{"class":255},[164,26357,1136],{"class":597},[164,26359,4623],{"class":255},[164,26361,4626],{"class":384},[164,26363,388],{"class":255},[164,26365,1136],{"class":597},[164,26367,10692],{"class":255},[164,26369,26370],{"class":166,"line":346},[164,26371,1281],{"class":255},[164,26373,26374],{"class":166,"line":381},[164,26375,343],{"emptyLinePlaceholder":342},[164,26377,26378,26380,26382,26384,26386,26388,26391,26393],{"class":166,"line":424},[164,26379,721],{"class":352},[164,26381,3054],{"class":259},[164,26383,359],{"class":255},[164,26385,3059],{"class":362},[164,26387,1122],{"class":255},[164,26389,26390],{"class":597},"Props",[164,26392,1160],{"class":255},[164,26394,734],{"class":259},[164,26396,26397,26399,26402,26404,26407],{"class":166,"line":461},[164,26398,721],{"class":352},[164,26400,26401],{"class":259}," emit ",[164,26403,359],{"class":255},[164,26405,26406],{"class":362}," defineEmits",[164,26408,3062],{"class":255},[164,26410,26411,26414,26416,26418,26421,26423,26425],{"class":166,"line":490},[164,26412,26413],{"class":384}," select",[164,26415,388],{"class":255},[164,26417,6257],{"class":259},[164,26419,26420],{"class":597},"itemId",[164,26422,388],{"class":255},[164,26424,1136],{"class":597},[164,26426,6542],{"class":259},[164,26428,26429,26431],{"class":166,"line":526},[164,26430,3077],{"class":255},[164,26432,734],{"class":259},[164,26434,26435,26437,26439],{"class":166,"line":535},[164,26436,1809],{"class":255},[164,26438,1812],{"class":384},[164,26440,1540],{"class":255},[164,26442,26443],{"class":166,"line":29},[164,26444,343],{"emptyLinePlaceholder":342},[164,26446,26447,26449,26451],{"class":166,"line":545},[164,26448,1122],{"class":255},[164,26450,3211],{"class":384},[164,26452,1540],{"class":255},[164,26454,26455,26457,26459],{"class":166,"line":562},[164,26456,3218],{"class":255},[164,26458,1782],{"class":384},[164,26460,1540],{"class":255},[164,26462,26463,26465,26467,26469,26472,26474,26476],{"class":166,"line":578},[164,26464,3239],{"class":255},[164,26466,98],{"class":384},[164,26468,1160],{"class":255},[164,26470,26471],{"class":259},"{{ title }}",[164,26473,1809],{"class":255},[164,26475,98],{"class":384},[164,26477,1540],{"class":255},[164,26479,26480,26482,26484],{"class":166,"line":583},[164,26481,3239],{"class":255},[164,26483,113],{"class":384},[164,26485,1540],{"class":255},[164,26487,26488,26491,26493,26496,26498,26500,26503,26505,26508,26510,26512,26515,26517,26520,26522,26524,26527,26529],{"class":166,"line":589},[164,26489,26490],{"class":255}," <",[164,26492,116],{"class":384},[164,26494,26495],{"class":352}," v-for",[164,26497,359],{"class":255},[164,26499,368],{"class":255},[164,26501,26502],{"class":288},"item in items",[164,26504,368],{"class":255},[164,26506,26507],{"class":352}," :key",[164,26509,359],{"class":255},[164,26511,368],{"class":255},[164,26513,26514],{"class":288},"item.id",[164,26516,368],{"class":255},[164,26518,26519],{"class":352}," @click",[164,26521,359],{"class":255},[164,26523,368],{"class":255},[164,26525,26526],{"class":288},"emit('select', item.id)",[164,26528,368],{"class":255},[164,26530,1540],{"class":255},[164,26532,26533],{"class":166,"line":615},[164,26534,26535],{"class":259}," {{ item.name }}\n",[164,26537,26538,26541,26543],{"class":166,"line":978},[164,26539,26540],{"class":255}," void\n removeItem: (id: string) => void\n}\n\nexport const useStore = create((set) => ({\n items: [],\n addItem: (item) =>\n set((state) => ({\n items: [...state.items, item],\n })),\n removeItem: (id) =>\n set((state) => ({\n items: state.items.filter((i) => i.id !== id),\n })),\n}))\n",[161,26578,26579,26584,26603,26607,26616,26627,26648,26669,26673,26677,26711,26722,26736,26756,26782,26790,26804,26822,26865,26873],{"__ignoreMap":159},[164,26580,26581],{"class":166,"line":167},[164,26582,26583],{"class":170},"// Zustand example\n",[164,26585,26586,26588,26590,26592,26594,26596,26598,26601],{"class":166,"line":174},[164,26587,252],{"class":251},[164,26589,256],{"class":255},[164,26591,7899],{"class":259},[164,26593,279],{"class":255},[164,26595,282],{"class":251},[164,26597,285],{"class":255},[164,26599,26600],{"class":288},"zustand",[164,26602,292],{"class":255},[164,26604,26605],{"class":166,"line":16},[164,26606,343],{"emptyLinePlaceholder":342},[164,26608,26609,26611,26614],{"class":166,"line":185},[164,26610,3376],{"class":352},[164,26612,26613],{"class":597}," Store",[164,26615,378],{"class":255},[164,26617,26618,26620,26622,26625],{"class":166,"line":191},[164,26619,26344],{"class":384},[164,26621,388],{"class":255},[164,26623,26624],{"class":597}," Item",[164,26626,12509],{"class":259},[164,26628,26629,26632,26634,26636,26638,26640,26642,26644,26646],{"class":166,"line":346},[164,26630,26631],{"class":384}," addItem",[164,26633,388],{"class":255},[164,26635,788],{"class":255},[164,26637,16415],{"class":791},[164,26639,388],{"class":255},[164,26641,26624],{"class":597},[164,26643,402],{"class":255},[164,26645,797],{"class":352},[164,26647,10536],{"class":597},[164,26649,26650,26653,26655,26657,26659,26661,26663,26665,26667],{"class":166,"line":381},[164,26651,26652],{"class":384}," removeItem",[164,26654,388],{"class":255},[164,26656,788],{"class":255},[164,26658,397],{"class":791},[164,26660,388],{"class":255},[164,26662,1136],{"class":597},[164,26664,402],{"class":255},[164,26666,797],{"class":352},[164,26668,10536],{"class":597},[164,26670,26671],{"class":166,"line":424},[164,26672,1281],{"class":255},[164,26674,26675],{"class":166,"line":461},[164,26676,343],{"emptyLinePlaceholder":342},[164,26678,26679,26681,26683,26686,26688,26690,26692,26695,26697,26699,26701,26703,26705,26707,26709],{"class":166,"line":490},[164,26680,349],{"class":251},[164,26682,353],{"class":352},[164,26684,26685],{"class":259}," useStore ",[164,26687,359],{"class":255},[164,26689,7899],{"class":362},[164,26691,1122],{"class":255},[164,26693,26694],{"class":597},"Store",[164,26696,1160],{"class":255},[164,26698,365],{"class":259},[164,26700,365],{"class":255},[164,26702,11934],{"class":791},[164,26704,402],{"class":255},[164,26706,797],{"class":352},[164,26708,788],{"class":259},[164,26710,906],{"class":255},[164,26712,26713,26715,26717,26720],{"class":166,"line":526},[164,26714,26344],{"class":384},[164,26716,388],{"class":255},[164,26718,26719],{"class":259}," []",[164,26721,421],{"class":255},[164,26723,26724,26726,26728,26730,26732,26734],{"class":166,"line":535},[164,26725,26631],{"class":362},[164,26727,388],{"class":255},[164,26729,788],{"class":255},[164,26731,16415],{"class":791},[164,26733,402],{"class":255},[164,26735,1404],{"class":352},[164,26737,26738,26741,26743,26745,26748,26750,26752,26754],{"class":166,"line":29},[164,26739,26740],{"class":362}," set",[164,26742,365],{"class":259},[164,26744,365],{"class":255},[164,26746,26747],{"class":791},"state",[164,26749,402],{"class":255},[164,26751,797],{"class":352},[164,26753,788],{"class":259},[164,26755,906],{"class":255},[164,26757,26758,26761,26763,26765,26768,26770,26772,26775,26777,26780],{"class":166,"line":545},[164,26759,26760],{"class":384}," items",[164,26762,388],{"class":255},[164,26764,6257],{"class":259},[164,26766,26767],{"class":255},"...",[164,26769,26747],{"class":259},[164,26771,405],{"class":255},[164,26773,26774],{"class":259},"items",[164,26776,263],{"class":255},[164,26778,26779],{"class":259}," item]",[164,26781,421],{"class":255},[164,26783,26784,26786,26788],{"class":166,"line":562},[164,26785,1498],{"class":255},[164,26787,2735],{"class":259},[164,26789,421],{"class":255},[164,26791,26792,26794,26796,26798,26800,26802],{"class":166,"line":578},[164,26793,26652],{"class":362},[164,26795,388],{"class":255},[164,26797,788],{"class":255},[164,26799,397],{"class":791},[164,26801,402],{"class":255},[164,26803,1404],{"class":352},[164,26805,26806,26808,26810,26812,26814,26816,26818,26820],{"class":166,"line":583},[164,26807,26740],{"class":362},[164,26809,365],{"class":259},[164,26811,365],{"class":255},[164,26813,26747],{"class":791},[164,26815,402],{"class":255},[164,26817,797],{"class":352},[164,26819,788],{"class":259},[164,26821,906],{"class":255},[164,26823,26824,26826,26828,26831,26833,26835,26837,26840,26842,26844,26847,26849,26851,26854,26856,26858,26860,26863],{"class":166,"line":589},[164,26825,26760],{"class":384},[164,26827,388],{"class":255},[164,26829,26830],{"class":259}," state",[164,26832,405],{"class":255},[164,26834,26774],{"class":259},[164,26836,405],{"class":255},[164,26838,26839],{"class":362},"filter",[164,26841,365],{"class":259},[164,26843,365],{"class":255},[164,26845,26846],{"class":791},"i",[164,26848,402],{"class":255},[164,26850,797],{"class":352},[164,26852,26853],{"class":259}," i",[164,26855,405],{"class":255},[164,26857,3321],{"class":259},[164,26859,7713],{"class":255},[164,26861,26862],{"class":259}," id)",[164,26864,421],{"class":255},[164,26866,26867,26869,26871],{"class":166,"line":615},[164,26868,1498],{"class":255},[164,26870,2735],{"class":259},[164,26872,421],{"class":255},[164,26874,26875,26877],{"class":166,"line":978},[164,26876,529],{"class":255},[164,26878,15180],{"class":259},[149,26880,26882],{"id":26881},"phase-3-backend-development-months-7-9","Phase 3: Backend Development (Months 7-9)",[4935,26884,4065],{"id":26885},"api-design",[154,26887,26889],{"className":156,"code":26888,"language":158,"meta":159,"style":159},"// Hono API example\nimport { Hono } from \"hono\"\nimport { z } from \"zod\"\n\nconst app = new Hono()\n\nconst userSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n})\n\napp.get(\"/api/users\", async (c) => {\n const users = await db.user.findMany()\n return c.json({ data: users })\n})\n\napp.post(\"/api/users\", async (c) => {\n const body = await c.req.json()\n const data = userSchema.parse(body)\n const user = await db.user.create({ data })\n return c.json({ data: user }, 201)\n})\n",[161,26890,26891,26896,26914,26932,26936,26950,26954,26972,26998,27020,27026,27030,27060,27083,27107,27113,27117,27147,27169,27189,27219,27246],{"__ignoreMap":159},[164,26892,26893],{"class":166,"line":167},[164,26894,26895],{"class":170},"// Hono API example\n",[164,26897,26898,26900,26902,26904,26906,26908,26910,26912],{"class":166,"line":174},[164,26899,252],{"class":251},[164,26901,256],{"class":255},[164,26903,656],{"class":259},[164,26905,279],{"class":255},[164,26907,282],{"class":251},[164,26909,285],{"class":255},[164,26911,665],{"class":288},[164,26913,292],{"class":255},[164,26915,26916,26918,26920,26922,26924,26926,26928,26930],{"class":166,"line":16},[164,26917,252],{"class":251},[164,26919,256],{"class":255},[164,26921,326],{"class":259},[164,26923,279],{"class":255},[164,26925,282],{"class":251},[164,26927,285],{"class":255},[164,26929,335],{"class":288},[164,26931,292],{"class":255},[164,26933,26934],{"class":166,"line":185},[164,26935,343],{"emptyLinePlaceholder":342},[164,26937,26938,26940,26942,26944,26946,26948],{"class":166,"line":191},[164,26939,721],{"class":352},[164,26941,724],{"class":259},[164,26943,359],{"class":255},[164,26945,729],{"class":255},[164,26947,656],{"class":362},[164,26949,734],{"class":259},[164,26951,26952],{"class":166,"line":346},[164,26953,343],{"emptyLinePlaceholder":342},[164,26955,26956,26958,26960,26962,26964,26966,26968,26970],{"class":166,"line":381},[164,26957,721],{"class":352},[164,26959,3464],{"class":259},[164,26961,359],{"class":255},[164,26963,326],{"class":259},[164,26965,405],{"class":255},[164,26967,1909],{"class":362},[164,26969,365],{"class":259},[164,26971,906],{"class":255},[164,26973,26974,26976,26978,26980,26982,26984,26986,26988,26990,26992,26994,26996],{"class":166,"line":424},[164,26975,464],{"class":384},[164,26977,388],{"class":255},[164,26979,326],{"class":259},[164,26981,405],{"class":255},[164,26983,1953],{"class":362},[164,26985,411],{"class":259},[164,26987,405],{"class":255},[164,26989,2163],{"class":362},[164,26991,365],{"class":259},[164,26993,2168],{"class":921},[164,26995,402],{"class":259},[164,26997,421],{"class":255},[164,26999,27000,27002,27004,27006,27008,27010,27012,27014,27016,27018],{"class":166,"line":461},[164,27001,427],{"class":384},[164,27003,388],{"class":255},[164,27005,326],{"class":259},[164,27007,405],{"class":255},[164,27009,1953],{"class":362},[164,27011,411],{"class":259},[164,27013,405],{"class":255},[164,27015,438],{"class":362},[164,27017,411],{"class":259},[164,27019,421],{"class":255},[164,27021,27022,27024],{"class":166,"line":490},[164,27023,529],{"class":255},[164,27025,532],{"class":259},[164,27027,27028],{"class":166,"line":526},[164,27029,343],{"emptyLinePlaceholder":342},[164,27031,27032,27034,27036,27038,27040,27042,27044,27046,27048,27050,27052,27054,27056,27058],{"class":166,"line":535},[164,27033,748],{"class":259},[164,27035,405],{"class":255},[164,27037,2668],{"class":362},[164,27039,365],{"class":259},[164,27041,368],{"class":255},[164,27043,1334],{"class":288},[164,27045,368],{"class":255},[164,27047,263],{"class":255},[164,27049,785],{"class":352},[164,27051,788],{"class":255},[164,27053,792],{"class":791},[164,27055,402],{"class":255},[164,27057,797],{"class":352},[164,27059,378],{"class":255},[164,27061,27062,27064,27066,27068,27070,27072,27074,27076,27078,27081],{"class":166,"line":29},[164,27063,804],{"class":352},[164,27065,607],{"class":259},[164,27067,601],{"class":255},[164,27069,853],{"class":251},[164,27071,856],{"class":259},[164,27073,405],{"class":255},[164,27075,7857],{"class":259},[164,27077,405],{"class":255},[164,27079,27080],{"class":362},"findMany",[164,27082,734],{"class":384},[164,27084,27085,27087,27089,27091,27093,27095,27097,27099,27101,27103,27105],{"class":166,"line":545},[164,27086,895],{"class":251},[164,27088,812],{"class":259},[164,27090,405],{"class":255},[164,27092,773],{"class":362},[164,27094,365],{"class":384},[164,27096,2710],{"class":255},[164,27098,807],{"class":384},[164,27100,388],{"class":255},[164,27102,607],{"class":259},[164,27104,279],{"class":255},[164,27106,532],{"class":384},[164,27108,27109,27111],{"class":166,"line":562},[164,27110,529],{"class":255},[164,27112,532],{"class":259},[164,27114,27115],{"class":166,"line":578},[164,27116,343],{"emptyLinePlaceholder":342},[164,27118,27119,27121,27123,27125,27127,27129,27131,27133,27135,27137,27139,27141,27143,27145],{"class":166,"line":583},[164,27120,748],{"class":259},[164,27122,405],{"class":255},[164,27124,753],{"class":362},[164,27126,365],{"class":259},[164,27128,368],{"class":255},[164,27130,1334],{"class":288},[164,27132,368],{"class":255},[164,27134,263],{"class":255},[164,27136,785],{"class":352},[164,27138,788],{"class":255},[164,27140,792],{"class":791},[164,27142,402],{"class":255},[164,27144,797],{"class":352},[164,27146,378],{"class":255},[164,27148,27149,27151,27153,27155,27157,27159,27161,27163,27165,27167],{"class":166,"line":589},[164,27150,804],{"class":352},[164,27152,18183],{"class":259},[164,27154,601],{"class":255},[164,27156,853],{"class":251},[164,27158,812],{"class":259},[164,27160,405],{"class":255},[164,27162,817],{"class":259},[164,27164,405],{"class":255},[164,27166,773],{"class":362},[164,27168,734],{"class":384},[164,27170,27171,27173,27175,27177,27179,27181,27183,27185,27187],{"class":166,"line":615},[164,27172,804],{"class":352},[164,27174,807],{"class":259},[164,27176,601],{"class":255},[164,27178,3559],{"class":259},[164,27180,405],{"class":255},[164,27182,2248],{"class":362},[164,27184,365],{"class":384},[164,27186,8617],{"class":259},[164,27188,532],{"class":384},[164,27190,27191,27193,27195,27197,27199,27201,27203,27205,27207,27209,27211,27213,27215,27217],{"class":166,"line":978},[164,27192,804],{"class":352},[164,27194,848],{"class":259},[164,27196,601],{"class":255},[164,27198,853],{"class":251},[164,27200,856],{"class":259},[164,27202,405],{"class":255},[164,27204,7857],{"class":259},[164,27206,405],{"class":255},[164,27208,3912],{"class":362},[164,27210,365],{"class":384},[164,27212,2710],{"class":255},[164,27214,807],{"class":259},[164,27216,279],{"class":255},[164,27218,532],{"class":384},[164,27220,27221,27223,27225,27227,27229,27231,27233,27235,27237,27239,27241,27244],{"class":166,"line":984},[164,27222,895],{"class":251},[164,27224,812],{"class":259},[164,27226,405],{"class":255},[164,27228,773],{"class":362},[164,27230,365],{"class":384},[164,27232,2710],{"class":255},[164,27234,807],{"class":384},[164,27236,388],{"class":255},[164,27238,848],{"class":259},[164,27240,2939],{"class":255},[164,27242,27243],{"class":921}," 201",[164,27245,532],{"class":384},[164,27247,27248,27250],{"class":166,"line":992},[164,27249,529],{"class":255},[164,27251,532],{"class":259},[4935,27253,27255],{"id":27254},"database-design","Database Design",[154,27257,27261],{"className":27258,"code":27259,"language":27260,"meta":159,"style":159},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- PostgreSQL schema\nCREATE TABLE users (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n email TEXT NOT NULL UNIQUE,\n name TEXT NOT NULL,\n created_at TIMESTAMPTZ DEFAULT NOW()\n);\n\nCREATE INDEX idx_users_email ON users(email);\n","sql",[161,27262,27263,27268,27273,27278,27283,27288,27293,27298,27302],{"__ignoreMap":159},[164,27264,27265],{"class":166,"line":167},[164,27266,27267],{},"-- PostgreSQL schema\n",[164,27269,27270],{"class":166,"line":174},[164,27271,27272],{},"CREATE TABLE users (\n",[164,27274,27275],{"class":166,"line":16},[164,27276,27277],{}," id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n",[164,27279,27280],{"class":166,"line":185},[164,27281,27282],{}," email TEXT NOT NULL UNIQUE,\n",[164,27284,27285],{"class":166,"line":191},[164,27286,27287],{}," name TEXT NOT NULL,\n",[164,27289,27290],{"class":166,"line":346},[164,27291,27292],{}," created_at TIMESTAMPTZ DEFAULT NOW()\n",[164,27294,27295],{"class":166,"line":381},[164,27296,27297],{},");\n",[164,27299,27300],{"class":166,"line":424},[164,27301,343],{"emptyLinePlaceholder":342},[164,27303,27304],{"class":166,"line":461},[164,27305,27306],{},"CREATE INDEX idx_users_email ON users(email);\n",[149,27308,27310],{"id":27309},"phase-4-devops-deployment-months-10-12","Phase 4: DevOps & Deployment (Months 10-12)",[4935,27312,6730],{"id":6729},[154,27314,27316],{"className":6733,"code":27315,"language":6735,"meta":159,"style":159},"# Dockerfile\nFROM node:20-alpine\n\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nCOPY . .\nRUN npm run build\n\nEXPOSE 3000\nCMD [\"node\", \".output/server/index.mjs\"]\n",[161,27317,27318,27323,27330,27334,27340,27346,27352,27356,27362,27368,27372,27378],{"__ignoreMap":159},[164,27319,27320],{"class":166,"line":167},[164,27321,27322],{"class":170},"# Dockerfile\n",[164,27324,27325,27327],{"class":166,"line":174},[164,27326,6747],{"class":921},[164,27328,27329],{"class":259}," node:20-alpine\n",[164,27331,27332],{"class":166,"line":16},[164,27333,343],{"emptyLinePlaceholder":342},[164,27335,27336,27338],{"class":166,"line":185},[164,27337,6765],{"class":921},[164,27339,6768],{"class":259},[164,27341,27342,27344],{"class":166,"line":191},[164,27343,6773],{"class":921},[164,27345,6776],{"class":259},[164,27347,27348,27350],{"class":166,"line":346},[164,27349,6781],{"class":921},[164,27351,6784],{"class":259},[164,27353,27354],{"class":166,"line":381},[164,27355,343],{"emptyLinePlaceholder":342},[164,27357,27358,27360],{"class":166,"line":424},[164,27359,6773],{"class":921},[164,27361,6795],{"class":259},[164,27363,27364,27366],{"class":166,"line":461},[164,27365,6781],{"class":921},[164,27367,6802],{"class":259},[164,27369,27370],{"class":166,"line":490},[164,27371,343],{"emptyLinePlaceholder":342},[164,27373,27374,27376],{"class":166,"line":526},[164,27375,6857],{"class":921},[164,27377,6860],{"class":259},[164,27379,27380,27382,27384,27387,27389,27392],{"class":166,"line":535},[164,27381,6865],{"class":921},[164,27383,6257],{"class":259},[164,27385,27386],{"class":288},"\"node\"",[164,27388,6873],{"class":259},[164,27390,27391],{"class":288},"\".output/server/index.mjs\"",[164,27393,6542],{"class":259},[4935,27395,27397],{"id":27396},"cicd-pipeline","CI/CD Pipeline",[154,27399,27403],{"className":27400,"code":27401,"language":27402,"meta":159,"style":159},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# .github/workflows/deploy.yml\nname: Deploy\n\non:\n push:\n branches: [main]\n\njobs:\n deploy:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v3\n\n - name: Setup Node\n uses: actions/setup-node@v3\n with:\n node-version: \"20\"\n\n - name: Install dependencies\n run: npm ci\n\n - name: Build\n run: npm run build\n\n - name: Deploy\n run: ./deploy.sh\n","yaml",[161,27404,27405,27410,27419,27423,27430,27437,27451,27455,27462,27469,27479,27483,27490,27503,27507,27518,27528,27535,27549,27553,27564,27574,27578,27589,27597,27601,27611],{"__ignoreMap":159},[164,27406,27407],{"class":166,"line":167},[164,27408,27409],{"class":170},"# .github/workflows/deploy.yml\n",[164,27411,27412,27414,27416],{"class":166,"line":174},[164,27413,475],{"class":384},[164,27415,388],{"class":255},[164,27417,27418],{"class":288}," Deploy\n",[164,27420,27421],{"class":166,"line":16},[164,27422,343],{"emptyLinePlaceholder":342},[164,27424,27425,27427],{"class":166,"line":185},[164,27426,5192],{"class":1737},[164,27428,27429],{"class":255},":\n",[164,27431,27432,27435],{"class":166,"line":191},[164,27433,27434],{"class":384}," push",[164,27436,27429],{"class":255},[164,27438,27439,27442,27444,27446,27449],{"class":166,"line":346},[164,27440,27441],{"class":384}," branches",[164,27443,388],{"class":255},[164,27445,6257],{"class":255},[164,27447,27448],{"class":288},"main",[164,27450,6542],{"class":255},[164,27452,27453],{"class":166,"line":381},[164,27454,343],{"emptyLinePlaceholder":342},[164,27456,27457,27460],{"class":166,"line":424},[164,27458,27459],{"class":384},"jobs",[164,27461,27429],{"class":255},[164,27463,27464,27467],{"class":166,"line":461},[164,27465,27466],{"class":384}," deploy",[164,27468,27429],{"class":255},[164,27470,27471,27474,27476],{"class":166,"line":490},[164,27472,27473],{"class":384}," runs-on",[164,27475,388],{"class":255},[164,27477,27478],{"class":288}," ubuntu-latest\n",[164,27480,27481],{"class":166,"line":526},[164,27482,343],{"emptyLinePlaceholder":342},[164,27484,27485,27488],{"class":166,"line":535},[164,27486,27487],{"class":384}," steps",[164,27489,27429],{"class":255},[164,27491,27492,27495,27498,27500],{"class":166,"line":29},[164,27493,27494],{"class":255}," -",[164,27496,27497],{"class":384}," uses",[164,27499,388],{"class":255},[164,27501,27502],{"class":288}," actions/checkout@v3\n",[164,27504,27505],{"class":166,"line":545},[164,27506,343],{"emptyLinePlaceholder":342},[164,27508,27509,27511,27513,27515],{"class":166,"line":562},[164,27510,27494],{"class":255},[164,27512,4626],{"class":384},[164,27514,388],{"class":255},[164,27516,27517],{"class":288}," Setup Node\n",[164,27519,27520,27523,27525],{"class":166,"line":578},[164,27521,27522],{"class":384}," uses",[164,27524,388],{"class":255},[164,27526,27527],{"class":288}," actions/setup-node@v3\n",[164,27529,27530,27533],{"class":166,"line":583},[164,27531,27532],{"class":384}," with",[164,27534,27429],{"class":255},[164,27536,27537,27540,27542,27544,27547],{"class":166,"line":589},[164,27538,27539],{"class":384}," node-version",[164,27541,388],{"class":255},[164,27543,285],{"class":255},[164,27545,27546],{"class":288},"20",[164,27548,292],{"class":255},[164,27550,27551],{"class":166,"line":615},[164,27552,343],{"emptyLinePlaceholder":342},[164,27554,27555,27557,27559,27561],{"class":166,"line":978},[164,27556,27494],{"class":255},[164,27558,4626],{"class":384},[164,27560,388],{"class":255},[164,27562,27563],{"class":288}," Install dependencies\n",[164,27565,27566,27569,27571],{"class":166,"line":984},[164,27567,27568],{"class":384}," run",[164,27570,388],{"class":255},[164,27572,27573],{"class":288}," npm ci\n",[164,27575,27576],{"class":166,"line":992},[164,27577,343],{"emptyLinePlaceholder":342},[164,27579,27580,27582,27584,27586],{"class":166,"line":999},[164,27581,27494],{"class":255},[164,27583,4626],{"class":384},[164,27585,388],{"class":255},[164,27587,27588],{"class":288}," Build\n",[164,27590,27591,27593,27595],{"class":166,"line":1004},[164,27592,27568],{"class":384},[164,27594,388],{"class":255},[164,27596,6802],{"class":288},[164,27598,27599],{"class":166,"line":1010},[164,27600,343],{"emptyLinePlaceholder":342},[164,27602,27603,27605,27607,27609],{"class":166,"line":1466},[164,27604,27494],{"class":255},[164,27606,4626],{"class":384},[164,27608,388],{"class":255},[164,27610,27418],{"class":288},[164,27612,27613,27615,27617],{"class":166,"line":1495},[164,27614,27568],{"class":384},[164,27616,388],{"class":255},[164,27618,27619],{"class":288}," ./deploy.sh\n",[98,27621,27623],{"id":27622},"essential-skills","Essential Skills",[149,27625,27627],{"id":27626},"_1-performance-optimization","1. Performance Optimization",[154,27629,27631],{"className":156,"code":27630,"language":158,"meta":159,"style":159},"// Frontend performance\nconst OptimizedComponent = () => {\n // Code splitting\n const HeavyComponent = dynamic(() => import('./Heavy'), {\n loading: () => \n })\n\n // Image optimization\n return (\n \n )\n}\n\n// Backend performance\napp.get('/api/data', async (c) => {\n // Caching\n const cached = await cache.get('data')\n if (cached) return c.json(cached)\n\n const data = await fetchData()\n await cache.set('data', data, 3600)\n\n return c.json(data)\n})\n",[161,27632,27633,27638,27653,27658,27694,27715,27720,27724,27729,27735,27742,27756,27769,27781,27786,27798,27803,27808,27812,27816,27821,27852,27857,27885,27911,27915,27930,27959,27963,27979],{"__ignoreMap":159},[164,27634,27635],{"class":166,"line":167},[164,27636,27637],{"class":170},"// Frontend performance\n",[164,27639,27640,27642,27645,27647,27649,27651],{"class":166,"line":174},[164,27641,721],{"class":352},[164,27643,27644],{"class":259}," OptimizedComponent ",[164,27646,359],{"class":255},[164,27648,1313],{"class":255},[164,27650,797],{"class":352},[164,27652,378],{"class":255},[164,27654,27655],{"class":166,"line":16},[164,27656,27657],{"class":170}," // Code splitting\n",[164,27659,27660,27662,27665,27667,27670,27672,27674,27676,27679,27681,27683,27686,27688,27690,27692],{"class":166,"line":185},[164,27661,804],{"class":352},[164,27663,27664],{"class":259}," HeavyComponent",[164,27666,601],{"class":255},[164,27668,27669],{"class":362}," dynamic",[164,27671,365],{"class":384},[164,27673,411],{"class":255},[164,27675,797],{"class":352},[164,27677,27678],{"class":255}," import",[164,27680,365],{"class":384},[164,27682,1622],{"class":255},[164,27684,27685],{"class":288},"./Heavy",[164,27687,1622],{"class":255},[164,27689,402],{"class":384},[164,27691,263],{"class":255},[164,27693,378],{"class":255},[164,27695,27696,27699,27701,27703,27705,27707,27710,27713],{"class":166,"line":191},[164,27697,27698],{"class":362}," loading",[164,27700,388],{"class":255},[164,27702,1313],{"class":255},[164,27704,797],{"class":352},[164,27706,1873],{"class":255},[164,27708,27709],{"class":597},"Spinner",[164,27711,27712],{"class":384}," /",[164,27714,1540],{"class":255},[164,27716,27717],{"class":166,"line":346},[164,27718,27719],{"class":384}," })\n",[164,27721,27722],{"class":166,"line":381},[164,27723,343],{"emptyLinePlaceholder":342},[164,27725,27726],{"class":166,"line":424},[164,27727,27728],{"class":170}," // Image optimization\n",[164,27730,27731,27733],{"class":166,"line":461},[164,27732,895],{"class":362},[164,27734,7285],{"class":384},[164,27736,27737,27739],{"class":166,"line":490},[164,27738,3239],{"class":255},[164,27740,27741],{"class":259},"Image\n",[164,27743,27744,27747,27749,27751,27754],{"class":166,"line":526},[164,27745,27746],{"class":259}," src",[164,27748,359],{"class":255},[164,27750,368],{"class":255},[164,27752,27753],{"class":288},"/image.jpg",[164,27755,292],{"class":255},[164,27757,27758,27761,27764,27767],{"class":166,"line":535},[164,27759,27760],{"class":259}," width",[164,27762,27763],{"class":255},"={",[164,27765,27766],{"class":921},"800",[164,27768,1281],{"class":255},[164,27770,27771,27774,27776,27779],{"class":166,"line":29},[164,27772,27773],{"class":259}," height",[164,27775,27763],{"class":255},[164,27777,27778],{"class":921},"600",[164,27780,1281],{"class":255},[164,27782,27783],{"class":166,"line":545},[164,27784,27785],{"class":259}," priority\n",[164,27787,27788,27791,27793,27796],{"class":166,"line":562},[164,27789,27790],{"class":259}," quality",[164,27792,27763],{"class":255},[164,27794,27795],{"class":921},"80",[164,27797,1281],{"class":255},[164,27799,27800],{"class":166,"line":578},[164,27801,27802],{"class":255}," />\n",[164,27804,27805],{"class":166,"line":583},[164,27806,27807],{"class":384}," )\n",[164,27809,27810],{"class":166,"line":589},[164,27811,1281],{"class":255},[164,27813,27814],{"class":166,"line":615},[164,27815,343],{"emptyLinePlaceholder":342},[164,27817,27818],{"class":166,"line":978},[164,27819,27820],{"class":170},"// Backend performance\n",[164,27822,27823,27825,27827,27829,27831,27833,27836,27838,27840,27842,27844,27846,27848,27850],{"class":166,"line":984},[164,27824,748],{"class":259},[164,27826,405],{"class":255},[164,27828,2668],{"class":362},[164,27830,365],{"class":384},[164,27832,1622],{"class":255},[164,27834,27835],{"class":288},"/api/data",[164,27837,1622],{"class":255},[164,27839,263],{"class":255},[164,27841,785],{"class":352},[164,27843,788],{"class":255},[164,27845,792],{"class":791},[164,27847,402],{"class":255},[164,27849,797],{"class":352},[164,27851,378],{"class":255},[164,27853,27854],{"class":166,"line":992},[164,27855,27856],{"class":170}," // Caching\n",[164,27858,27859,27861,27864,27866,27868,27871,27873,27875,27877,27879,27881,27883],{"class":166,"line":999},[164,27860,804],{"class":352},[164,27862,27863],{"class":259}," cached",[164,27865,601],{"class":255},[164,27867,853],{"class":251},[164,27869,27870],{"class":259}," cache",[164,27872,405],{"class":255},[164,27874,2668],{"class":362},[164,27876,365],{"class":384},[164,27878,1622],{"class":255},[164,27880,877],{"class":288},[164,27882,1622],{"class":255},[164,27884,532],{"class":384},[164,27886,27887,27889,27891,27894,27896,27899,27901,27903,27905,27907,27909],{"class":166,"line":1004},[164,27888,1207],{"class":251},[164,27890,788],{"class":384},[164,27892,27893],{"class":259},"cached",[164,27895,1223],{"class":384},[164,27897,27898],{"class":251},"return",[164,27900,812],{"class":259},[164,27902,405],{"class":255},[164,27904,773],{"class":362},[164,27906,365],{"class":384},[164,27908,27893],{"class":259},[164,27910,532],{"class":384},[164,27912,27913],{"class":166,"line":1010},[164,27914,343],{"emptyLinePlaceholder":342},[164,27916,27917,27919,27921,27923,27925,27928],{"class":166,"line":1466},[164,27918,804],{"class":352},[164,27920,807],{"class":259},[164,27922,601],{"class":255},[164,27924,853],{"class":251},[164,27926,27927],{"class":362}," fetchData",[164,27929,734],{"class":384},[164,27931,27932,27934,27936,27938,27940,27942,27944,27946,27948,27950,27952,27954,27957],{"class":166,"line":1495},[164,27933,2337],{"class":251},[164,27935,27870],{"class":259},[164,27937,405],{"class":255},[164,27939,11934],{"class":362},[164,27941,365],{"class":384},[164,27943,1622],{"class":255},[164,27945,877],{"class":288},[164,27947,1622],{"class":255},[164,27949,263],{"class":255},[164,27951,807],{"class":259},[164,27953,263],{"class":255},[164,27955,27956],{"class":921}," 3600",[164,27958,532],{"class":384},[164,27960,27961],{"class":166,"line":1505},[164,27962,343],{"emptyLinePlaceholder":342},[164,27964,27965,27967,27969,27971,27973,27975,27977],{"class":166,"line":5434},[164,27966,895],{"class":251},[164,27968,812],{"class":259},[164,27970,405],{"class":255},[164,27972,773],{"class":362},[164,27974,365],{"class":384},[164,27976,877],{"class":259},[164,27978,532],{"class":384},[164,27980,27981,27983],{"class":166,"line":5454},[164,27982,529],{"class":255},[164,27984,532],{"class":384},[149,27986,27988],{"id":27987},"_2-security-best-practices","2. Security Best Practices",[154,27990,27992],{"className":156,"code":27991,"language":158,"meta":159,"style":159},"// Authentication\nimport { sign, verify } from \"jsonwebtoken\"\n\nconst createToken = (userId: string) => {\n return sign({ userId }, process.env.JWT_SECRET!, {\n expiresIn: \"7d\",\n })\n}\n\n// Rate limiting\nimport { Ratelimit } from \"@upstash/ratelimit\"\n\nconst ratelimit = new Ratelimit({\n limiter: Ratelimit.slidingWindow(10, \"10 s\"),\n redis: redisClient,\n})\n\n// Input validation\nconst schema = z.object({\n email: z.string().email(),\n password: z.string().min(8),\n})\n",[161,27993,27994,27999,28024,28028,28052,28082,28098,28104,28108,28112,28117,28137,28141,28158,28189,28201,28207,28211,28216,28235,28257,28283],{"__ignoreMap":159},[164,27995,27996],{"class":166,"line":167},[164,27997,27998],{"class":170},"// Authentication\n",[164,28000,28001,28003,28005,28008,28010,28013,28015,28017,28019,28022],{"class":166,"line":174},[164,28002,252],{"class":251},[164,28004,256],{"class":255},[164,28006,28007],{"class":259}," sign",[164,28009,263],{"class":255},[164,28011,28012],{"class":259}," verify",[164,28014,279],{"class":255},[164,28016,282],{"class":251},[164,28018,285],{"class":255},[164,28020,28021],{"class":288},"jsonwebtoken",[164,28023,292],{"class":255},[164,28025,28026],{"class":166,"line":16},[164,28027,343],{"emptyLinePlaceholder":342},[164,28029,28030,28032,28035,28037,28039,28042,28044,28046,28048,28050],{"class":166,"line":185},[164,28031,721],{"class":352},[164,28033,28034],{"class":259}," createToken ",[164,28036,359],{"class":255},[164,28038,788],{"class":255},[164,28040,28041],{"class":791},"userId",[164,28043,388],{"class":255},[164,28045,1136],{"class":597},[164,28047,402],{"class":255},[164,28049,797],{"class":352},[164,28051,378],{"class":255},[164,28053,28054,28056,28058,28060,28062,28064,28066,28068,28070,28072,28074,28077,28080],{"class":166,"line":191},[164,28055,895],{"class":251},[164,28057,28007],{"class":362},[164,28059,365],{"class":384},[164,28061,2710],{"class":255},[164,28063,15519],{"class":259},[164,28065,2939],{"class":255},[164,28067,9162],{"class":259},[164,28069,405],{"class":255},[164,28071,7430],{"class":259},[164,28073,405],{"class":255},[164,28075,28076],{"class":259},"JWT_SECRET",[164,28078,28079],{"class":255},"!,",[164,28081,378],{"class":255},[164,28083,28084,28087,28089,28091,28094,28096],{"class":166,"line":346},[164,28085,28086],{"class":384}," expiresIn",[164,28088,388],{"class":255},[164,28090,285],{"class":255},[164,28092,28093],{"class":288},"7d",[164,28095,368],{"class":255},[164,28097,421],{"class":255},[164,28099,28100,28102],{"class":166,"line":381},[164,28101,987],{"class":255},[164,28103,532],{"class":384},[164,28105,28106],{"class":166,"line":424},[164,28107,1281],{"class":255},[164,28109,28110],{"class":166,"line":461},[164,28111,343],{"emptyLinePlaceholder":342},[164,28113,28114],{"class":166,"line":490},[164,28115,28116],{"class":170},"// Rate limiting\n",[164,28118,28119,28121,28123,28126,28128,28130,28132,28135],{"class":166,"line":526},[164,28120,252],{"class":251},[164,28122,256],{"class":255},[164,28124,28125],{"class":259}," Ratelimit",[164,28127,279],{"class":255},[164,28129,282],{"class":251},[164,28131,285],{"class":255},[164,28133,28134],{"class":288},"@upstash/ratelimit",[164,28136,292],{"class":255},[164,28138,28139],{"class":166,"line":535},[164,28140,343],{"emptyLinePlaceholder":342},[164,28142,28143,28145,28148,28150,28152,28154,28156],{"class":166,"line":29},[164,28144,721],{"class":352},[164,28146,28147],{"class":259}," ratelimit ",[164,28149,359],{"class":255},[164,28151,729],{"class":255},[164,28153,28125],{"class":362},[164,28155,365],{"class":259},[164,28157,906],{"class":255},[164,28159,28160,28163,28165,28167,28169,28172,28174,28176,28178,28180,28183,28185,28187],{"class":166,"line":545},[164,28161,28162],{"class":384}," limiter",[164,28164,388],{"class":255},[164,28166,28125],{"class":259},[164,28168,405],{"class":255},[164,28170,28171],{"class":362},"slidingWindow",[164,28173,365],{"class":259},[164,28175,12698],{"class":921},[164,28177,263],{"class":255},[164,28179,285],{"class":255},[164,28181,28182],{"class":288},"10 s",[164,28184,368],{"class":255},[164,28186,402],{"class":259},[164,28188,421],{"class":255},[164,28190,28191,28194,28196,28199],{"class":166,"line":562},[164,28192,28193],{"class":384}," redis",[164,28195,388],{"class":255},[164,28197,28198],{"class":259}," redisClient",[164,28200,421],{"class":255},[164,28202,28203,28205],{"class":166,"line":578},[164,28204,529],{"class":255},[164,28206,532],{"class":259},[164,28208,28209],{"class":166,"line":583},[164,28210,343],{"emptyLinePlaceholder":342},[164,28212,28213],{"class":166,"line":589},[164,28214,28215],{"class":170},"// Input validation\n",[164,28217,28218,28220,28223,28225,28227,28229,28231,28233],{"class":166,"line":615},[164,28219,721],{"class":352},[164,28221,28222],{"class":259}," schema ",[164,28224,359],{"class":255},[164,28226,326],{"class":259},[164,28228,405],{"class":255},[164,28230,1909],{"class":362},[164,28232,365],{"class":259},[164,28234,906],{"class":255},[164,28236,28237,28239,28241,28243,28245,28247,28249,28251,28253,28255],{"class":166,"line":978},[164,28238,427],{"class":384},[164,28240,388],{"class":255},[164,28242,326],{"class":259},[164,28244,405],{"class":255},[164,28246,1953],{"class":362},[164,28248,411],{"class":259},[164,28250,405],{"class":255},[164,28252,438],{"class":362},[164,28254,411],{"class":259},[164,28256,421],{"class":255},[164,28258,28259,28261,28263,28265,28267,28269,28271,28273,28275,28277,28279,28281],{"class":166,"line":984},[164,28260,8179],{"class":384},[164,28262,388],{"class":255},[164,28264,326],{"class":259},[164,28266,405],{"class":255},[164,28268,1953],{"class":362},[164,28270,411],{"class":259},[164,28272,405],{"class":255},[164,28274,2163],{"class":362},[164,28276,365],{"class":259},[164,28278,8500],{"class":921},[164,28280,402],{"class":259},[164,28282,421],{"class":255},[164,28284,28285,28287],{"class":166,"line":992},[164,28286,529],{"class":255},[164,28288,532],{"class":259},[149,28290,28292],{"id":28291},"_3-testing","3. Testing",[154,28294,28296],{"className":156,"code":28295,"language":158,"meta":159,"style":159},"// Unit tests\nimport { describe, it, expect } from \"vitest\"\n\ndescribe(\"UserService\", () => {\n it(\"creates user\", async () => {\n const user = await createUser({\n email: \"test@example.com\",\n name: \"Test\",\n })\n\n expect(user.email).toBe(\"test@example.com\")\n })\n})\n\n// E2E tests\nimport { test, expect } from \"@playwright/test\"\n\ntest(\"user can login\", async ({ page }) => {\n await page.goto(\"/login\")\n await page.fill(\"[name=email]\", \"test@example.com\")\n await page.fill(\"[name=password]\", \"password\")\n await page.click(\"button[type=submit]\")\n await expect(page).toHaveURL(\"/dashboard\")\n})\n",[161,28297,28298,28303,28333,28337,28357,28380,28396,28410,28425,28431,28435,28463,28469,28475,28479,28484,28508,28512,28539,28561,28591,28620,28641,28670],{"__ignoreMap":159},[164,28299,28300],{"class":166,"line":167},[164,28301,28302],{"class":170},"// Unit tests\n",[164,28304,28305,28307,28309,28312,28314,28317,28319,28322,28324,28326,28328,28331],{"class":166,"line":174},[164,28306,252],{"class":251},[164,28308,256],{"class":255},[164,28310,28311],{"class":259}," describe",[164,28313,263],{"class":255},[164,28315,28316],{"class":259}," it",[164,28318,263],{"class":255},[164,28320,28321],{"class":259}," expect",[164,28323,279],{"class":255},[164,28325,282],{"class":251},[164,28327,285],{"class":255},[164,28329,28330],{"class":288},"vitest",[164,28332,292],{"class":255},[164,28334,28335],{"class":166,"line":16},[164,28336,343],{"emptyLinePlaceholder":342},[164,28338,28339,28341,28343,28345,28347,28349,28351,28353,28355],{"class":166,"line":185},[164,28340,9564],{"class":362},[164,28342,365],{"class":259},[164,28344,368],{"class":255},[164,28346,9571],{"class":288},[164,28348,368],{"class":255},[164,28350,263],{"class":255},[164,28352,1313],{"class":255},[164,28354,797],{"class":352},[164,28356,378],{"class":255},[164,28358,28359,28361,28363,28365,28368,28370,28372,28374,28376,28378],{"class":166,"line":191},[164,28360,9694],{"class":362},[164,28362,365],{"class":384},[164,28364,368],{"class":255},[164,28366,28367],{"class":288},"creates user",[164,28369,368],{"class":255},[164,28371,263],{"class":255},[164,28373,785],{"class":352},[164,28375,1313],{"class":255},[164,28377,797],{"class":352},[164,28379,378],{"class":255},[164,28381,28382,28384,28386,28388,28390,28392,28394],{"class":166,"line":346},[164,28383,2757],{"class":352},[164,28385,848],{"class":259},[164,28387,601],{"class":255},[164,28389,853],{"class":251},[164,28391,3413],{"class":362},[164,28393,365],{"class":384},[164,28395,906],{"class":255},[164,28397,28398,28400,28402,28404,28406,28408],{"class":166,"line":381},[164,28399,9729],{"class":384},[164,28401,388],{"class":255},[164,28403,285],{"class":255},[164,28405,9736],{"class":288},[164,28407,368],{"class":255},[164,28409,421],{"class":255},[164,28411,28412,28414,28416,28418,28421,28423],{"class":166,"line":424},[164,28413,9745],{"class":384},[164,28415,388],{"class":255},[164,28417,285],{"class":255},[164,28419,28420],{"class":288},"Test",[164,28422,368],{"class":255},[164,28424,421],{"class":255},[164,28426,28427,28429],{"class":166,"line":461},[164,28428,1498],{"class":255},[164,28430,532],{"class":384},[164,28432,28433],{"class":166,"line":490},[164,28434,343],{"emptyLinePlaceholder":342},[164,28436,28437,28439,28441,28443,28445,28447,28449,28451,28453,28455,28457,28459,28461],{"class":166,"line":526},[164,28438,9893],{"class":362},[164,28440,365],{"class":384},[164,28442,7857],{"class":259},[164,28444,405],{"class":255},[164,28446,438],{"class":259},[164,28448,402],{"class":384},[164,28450,405],{"class":255},[164,28452,9926],{"class":362},[164,28454,365],{"class":384},[164,28456,368],{"class":255},[164,28458,9736],{"class":288},[164,28460,368],{"class":255},[164,28462,532],{"class":384},[164,28464,28465,28467],{"class":166,"line":535},[164,28466,987],{"class":255},[164,28468,532],{"class":384},[164,28470,28471,28473],{"class":166,"line":29},[164,28472,529],{"class":255},[164,28474,532],{"class":259},[164,28476,28477],{"class":166,"line":545},[164,28478,343],{"emptyLinePlaceholder":342},[164,28480,28481],{"class":166,"line":562},[164,28482,28483],{"class":170},"// E2E tests\n",[164,28485,28486,28488,28490,28493,28495,28497,28499,28501,28503,28506],{"class":166,"line":578},[164,28487,252],{"class":251},[164,28489,256],{"class":255},[164,28491,28492],{"class":259}," test",[164,28494,263],{"class":255},[164,28496,28321],{"class":259},[164,28498,279],{"class":255},[164,28500,282],{"class":251},[164,28502,285],{"class":255},[164,28504,28505],{"class":288},"@playwright/test",[164,28507,292],{"class":255},[164,28509,28510],{"class":166,"line":583},[164,28511,343],{"emptyLinePlaceholder":342},[164,28513,28514,28516,28518,28520,28523,28525,28527,28529,28531,28533,28535,28537],{"class":166,"line":589},[164,28515,2212],{"class":362},[164,28517,365],{"class":259},[164,28519,368],{"class":255},[164,28521,28522],{"class":288},"user can login",[164,28524,368],{"class":255},[164,28526,263],{"class":255},[164,28528,785],{"class":352},[164,28530,16113],{"class":255},[164,28532,17575],{"class":791},[164,28534,1761],{"class":255},[164,28536,797],{"class":352},[164,28538,378],{"class":255},[164,28540,28541,28543,28545,28547,28550,28552,28554,28557,28559],{"class":166,"line":615},[164,28542,2337],{"class":251},[164,28544,17575],{"class":259},[164,28546,405],{"class":255},[164,28548,28549],{"class":362},"goto",[164,28551,365],{"class":384},[164,28553,368],{"class":255},[164,28555,28556],{"class":288},"/login",[164,28558,368],{"class":255},[164,28560,532],{"class":384},[164,28562,28563,28565,28567,28569,28572,28574,28576,28579,28581,28583,28585,28587,28589],{"class":166,"line":978},[164,28564,2337],{"class":251},[164,28566,17575],{"class":259},[164,28568,405],{"class":255},[164,28570,28571],{"class":362},"fill",[164,28573,365],{"class":384},[164,28575,368],{"class":255},[164,28577,28578],{"class":288},"[name=email]",[164,28580,368],{"class":255},[164,28582,263],{"class":255},[164,28584,285],{"class":255},[164,28586,9736],{"class":288},[164,28588,368],{"class":255},[164,28590,532],{"class":384},[164,28592,28593,28595,28597,28599,28601,28603,28605,28608,28610,28612,28614,28616,28618],{"class":166,"line":984},[164,28594,2337],{"class":251},[164,28596,17575],{"class":259},[164,28598,405],{"class":255},[164,28600,28571],{"class":362},[164,28602,365],{"class":384},[164,28604,368],{"class":255},[164,28606,28607],{"class":288},"[name=password]",[164,28609,368],{"class":255},[164,28611,263],{"class":255},[164,28613,285],{"class":255},[164,28615,11360],{"class":288},[164,28617,368],{"class":255},[164,28619,532],{"class":384},[164,28621,28622,28624,28626,28628,28630,28632,28634,28637,28639],{"class":166,"line":992},[164,28623,2337],{"class":251},[164,28625,17575],{"class":259},[164,28627,405],{"class":255},[164,28629,11068],{"class":362},[164,28631,365],{"class":384},[164,28633,368],{"class":255},[164,28635,28636],{"class":288},"button[type=submit]",[164,28638,368],{"class":255},[164,28640,532],{"class":384},[164,28642,28643,28645,28647,28649,28652,28654,28656,28659,28661,28663,28666,28668],{"class":166,"line":999},[164,28644,2337],{"class":251},[164,28646,28321],{"class":362},[164,28648,365],{"class":384},[164,28650,28651],{"class":259},"page",[164,28653,402],{"class":384},[164,28655,405],{"class":255},[164,28657,28658],{"class":362},"toHaveURL",[164,28660,365],{"class":384},[164,28662,368],{"class":255},[164,28664,28665],{"class":288},"/dashboard",[164,28667,368],{"class":255},[164,28669,532],{"class":384},[164,28671,28672,28674],{"class":166,"line":1004},[164,28673,529],{"class":255},[164,28675,532],{"class":259},[98,28677,28679],{"id":28678},"specialization-paths","Specialization Paths",[149,28681,28683],{"id":28682},"_1-frontend-focused","1. Frontend-Focused",[154,28685,28688],{"className":28686,"code":28687,"language":24084},[24082],"Deep expertise:\n- Advanced React/Vue patterns\n- Performance optimization\n- Accessibility (WCAG)\n- Design systems\n- Web animations\n",[161,28689,28687],{"__ignoreMap":159},[149,28691,28693],{"id":28692},"_2-backend-focused","2. Backend-Focused",[154,28695,28698],{"className":28696,"code":28697,"language":24084},[24082],"Deep expertise:\n- Database optimization\n- API design\n- Microservices\n- Message queues\n- Caching strategies\n",[161,28699,28697],{"__ignoreMap":159},[149,28701,28703],{"id":28702},"_3-devops-focused","3. DevOps-Focused",[154,28705,28708],{"className":28706,"code":28707,"language":24084},[24082],"Deep expertise:\n- Cloud infrastructure\n- Container orchestration\n- CI/CD pipelines\n- Monitoring and logging\n- Security compliance\n",[161,28709,28707],{"__ignoreMap":159},[98,28711,28713],{"id":28712},"tools-of-the-trade","Tools of the Trade",[149,28715,28716],{"id":2194},"Development",[154,28718,28720],{"className":3596,"code":28719,"language":3598,"meta":159,"style":159},"# Essential CLI tools\nnpm install -g vercel # Deployment\nnpm install -g prisma # Database ORM\nnpm install -g wrangler # Cloudflare Workers\nnpm install -g @anthropic/ai # AI assistance\n",[161,28721,28722,28727,28742,28755,28769],{"__ignoreMap":159},[164,28723,28724],{"class":166,"line":167},[164,28725,28726],{"class":170},"# Essential CLI tools\n",[164,28728,28729,28731,28733,28736,28739],{"class":166,"line":174},[164,28730,23495],{"class":597},[164,28732,23498],{"class":288},[164,28734,28735],{"class":288}," -g",[164,28737,28738],{"class":288}," vercel",[164,28740,28741],{"class":170}," # Deployment\n",[164,28743,28744,28746,28748,28750,28752],{"class":166,"line":16},[164,28745,23495],{"class":597},[164,28747,23498],{"class":288},[164,28749,28735],{"class":288},[164,28751,7788],{"class":288},[164,28753,28754],{"class":170}," # Database ORM\n",[164,28756,28757,28759,28761,28763,28766],{"class":166,"line":185},[164,28758,23495],{"class":597},[164,28760,23498],{"class":288},[164,28762,28735],{"class":288},[164,28764,28765],{"class":288}," wrangler",[164,28767,28768],{"class":170}," # Cloudflare Workers\n",[164,28770,28771,28773,28775,28777,28780],{"class":166,"line":191},[164,28772,23495],{"class":597},[164,28774,23498],{"class":288},[164,28776,28735],{"class":288},[164,28778,28779],{"class":288}," @anthropic/ai",[164,28781,28782],{"class":170}," # AI assistance\n",[149,28784,28786],{"id":28785},"vs-code-extensions","VS Code Extensions",[154,28788,28790],{"className":4974,"code":28789,"language":773,"meta":159,"style":159},"{\n \"recommendations\": [\n \"dbaeumer.vscode-eslint\",\n \"esbenp.prettier-vscode\",\n \"bradlc.vscode-tailwindcss\",\n \"vue.volar\",\n \"formulahendry.auto-rename-tag\"\n ]\n}\n",[161,28791,28792,28796,28809,28820,28831,28842,28853,28862,28867],{"__ignoreMap":159},[164,28793,28794],{"class":166,"line":167},[164,28795,906],{"class":255},[164,28797,28798,28800,28803,28805,28807],{"class":166,"line":174},[164,28799,2676],{"class":255},[164,28801,28802],{"class":352},"recommendations",[164,28804,368],{"class":255},[164,28806,388],{"class":255},[164,28808,9281],{"class":255},[164,28810,28811,28813,28816,28818],{"class":166,"line":16},[164,28812,5227],{"class":255},[164,28814,28815],{"class":288},"dbaeumer.vscode-eslint",[164,28817,368],{"class":255},[164,28819,421],{"class":255},[164,28821,28822,28824,28827,28829],{"class":166,"line":185},[164,28823,5227],{"class":255},[164,28825,28826],{"class":288},"esbenp.prettier-vscode",[164,28828,368],{"class":255},[164,28830,421],{"class":255},[164,28832,28833,28835,28838,28840],{"class":166,"line":191},[164,28834,5227],{"class":255},[164,28836,28837],{"class":288},"bradlc.vscode-tailwindcss",[164,28839,368],{"class":255},[164,28841,421],{"class":255},[164,28843,28844,28846,28849,28851],{"class":166,"line":346},[164,28845,5227],{"class":255},[164,28847,28848],{"class":288},"vue.volar",[164,28850,368],{"class":255},[164,28852,421],{"class":255},[164,28854,28855,28857,28860],{"class":166,"line":381},[164,28856,5227],{"class":255},[164,28858,28859],{"class":288},"formulahendry.auto-rename-tag",[164,28861,292],{"class":255},[164,28863,28864],{"class":166,"line":424},[164,28865,28866],{"class":255}," ]\n",[164,28868,28869],{"class":166,"line":461},[164,28870,1281],{"class":255},[98,28872,28874],{"id":28873},"career-advice","Career Advice",[149,28876,28878],{"id":28877},"_1-build-projects","1. Build Projects",[154,28880,28882],{"className":156,"code":28881,"language":158,"meta":159,"style":159},"// Portfolio projects\nconst projects = [\n \"Full-stack e-commerce site\",\n \"Real-time chat application\",\n \"Data visualization dashboard\",\n \"Mobile-first PWA\",\n \"Open-source contribution\",\n]\n",[161,28883,28884,28889,28900,28911,28922,28933,28944,28955],{"__ignoreMap":159},[164,28885,28886],{"class":166,"line":167},[164,28887,28888],{"class":170},"// Portfolio projects\n",[164,28890,28891,28893,28896,28898],{"class":166,"line":174},[164,28892,721],{"class":352},[164,28894,28895],{"class":259}," projects ",[164,28897,359],{"class":255},[164,28899,9281],{"class":259},[164,28901,28902,28904,28907,28909],{"class":166,"line":16},[164,28903,2676],{"class":255},[164,28905,28906],{"class":288},"Full-stack e-commerce site",[164,28908,368],{"class":255},[164,28910,421],{"class":255},[164,28912,28913,28915,28918,28920],{"class":166,"line":185},[164,28914,2676],{"class":255},[164,28916,28917],{"class":288},"Real-time chat application",[164,28919,368],{"class":255},[164,28921,421],{"class":255},[164,28923,28924,28926,28929,28931],{"class":166,"line":191},[164,28925,2676],{"class":255},[164,28927,28928],{"class":288},"Data visualization dashboard",[164,28930,368],{"class":255},[164,28932,421],{"class":255},[164,28934,28935,28937,28940,28942],{"class":166,"line":346},[164,28936,2676],{"class":255},[164,28938,28939],{"class":288},"Mobile-first PWA",[164,28941,368],{"class":255},[164,28943,421],{"class":255},[164,28945,28946,28948,28951,28953],{"class":166,"line":381},[164,28947,2676],{"class":255},[164,28949,28950],{"class":288},"Open-source contribution",[164,28952,368],{"class":255},[164,28954,421],{"class":255},[164,28956,28957],{"class":166,"line":424},[164,28958,6542],{"class":259},[149,28960,28962],{"id":28961},"_2-stay-current","2. Stay Current",[154,28964,28968],{"className":28965,"code":28966,"language":28967,"meta":159,"style":159},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- Follow industry blogs\n- Attend conferences (virtual/in-person)\n- Contribute to open source\n- Write technical articles\n- Build side projects\n","markdown",[161,28969,28970,28975,28980,28985,28990],{"__ignoreMap":159},[164,28971,28972],{"class":166,"line":167},[164,28973,28974],{},"- Follow industry blogs\n",[164,28976,28977],{"class":166,"line":174},[164,28978,28979],{},"- Attend conferences (virtual/in-person)\n",[164,28981,28982],{"class":166,"line":16},[164,28983,28984],{},"- Contribute to open source\n",[164,28986,28987],{"class":166,"line":185},[164,28988,28989],{},"- Write technical articles\n",[164,28991,28992],{"class":166,"line":191},[164,28993,28994],{},"- Build side projects\n",[149,28996,28998],{"id":28997},"_3-network","3. Network",[113,29000,29001,29004,29007,29010,29013],{},[116,29002,29003],{},"Join Discord communities",[116,29005,29006],{},"Attend local meetups",[116,29008,29009],{},"Connect on LinkedIn",[116,29011,29012],{},"Participate in Twitter tech community",[116,29014,29015],{},"Mentor others",[98,29017,29019],{"id":29018},"salary-expectations-2026","Salary Expectations (2026)",[25671,29021,29022,29035],{},[25674,29023,29024],{},[25677,29025,29026,29029,29032],{},[25680,29027,29028],{},"Level",[25680,29030,29031],{},"Experience",[25680,29033,29034],{},"Salary Range (US)",[25693,29036,29037,29048,29059,29070],{},[25677,29038,29039,29042,29045],{},[25698,29040,29041],{},"Junior",[25698,29043,29044],{},"0-2 years",[25698,29046,29047],{},"$70k - $95k",[25677,29049,29050,29053,29056],{},[25698,29051,29052],{},"Mid",[25698,29054,29055],{},"2-5 years",[25698,29057,29058],{},"$95k - $140k",[25677,29060,29061,29064,29067],{},[25698,29062,29063],{},"Senior",[25698,29065,29066],{},"5-8 years",[25698,29068,29069],{},"$140k - $180k",[25677,29071,29072,29075,29078],{},[25698,29073,29074],{},"Staff",[25698,29076,29077],{},"8+ years",[25698,29079,29080],{},"$180k - $250k+",[98,29082,29084],{"id":29083},"common-mistakes-to-avoid","Common Mistakes to Avoid",[149,29086,29088],{"id":29087},"_1-tutorial-hell","1. Tutorial Hell",[154,29090,29092],{"className":156,"code":29091,"language":158,"meta":159,"style":159},"// ❌ Bad: Only following tutorials\n// ✅ Good: Build original projects\n\nconst learningPath = {\n tutorials: 20%,\n originalProjects: 80%\n}\n",[161,29093,29094,29099,29104,29108,29119,29132,29145],{"__ignoreMap":159},[164,29095,29096],{"class":166,"line":167},[164,29097,29098],{"class":170},"// ❌ Bad: Only following tutorials\n",[164,29100,29101],{"class":166,"line":174},[164,29102,29103],{"class":170},"// ✅ Good: Build original projects\n",[164,29105,29106],{"class":166,"line":16},[164,29107,343],{"emptyLinePlaceholder":342},[164,29109,29110,29112,29115,29117],{"class":166,"line":185},[164,29111,721],{"class":352},[164,29113,29114],{"class":259}," learningPath ",[164,29116,359],{"class":255},[164,29118,378],{"class":255},[164,29120,29121,29124,29126,29129],{"class":166,"line":191},[164,29122,29123],{"class":384}," tutorials",[164,29125,388],{"class":255},[164,29127,29128],{"class":921}," 20",[164,29130,29131],{"class":255},"%,\n",[164,29133,29134,29137,29139,29142],{"class":166,"line":346},[164,29135,29136],{"class":384}," originalProjects",[164,29138,388],{"class":255},[164,29140,29141],{"class":921}," 80",[164,29143,29144],{"class":255},"%\n",[164,29146,29147],{"class":166,"line":381},[164,29148,1281],{"class":255},[149,29150,29152],{"id":29151},"_2-ignoring-fundamentals","2. Ignoring Fundamentals",[154,29154,29156],{"className":156,"code":29155,"language":158,"meta":159,"style":159},"// Don't skip:\n// - JavaScript/TypeScript basics\n// - HTTP/Network protocols\n// - Database fundamentals\n// - Security principles\n",[161,29157,29158,29163,29168,29173,29178],{"__ignoreMap":159},[164,29159,29160],{"class":166,"line":167},[164,29161,29162],{"class":170},"// Don't skip:\n",[164,29164,29165],{"class":166,"line":174},[164,29166,29167],{"class":170},"// - JavaScript/TypeScript basics\n",[164,29169,29170],{"class":166,"line":16},[164,29171,29172],{"class":170},"// - HTTP/Network protocols\n",[164,29174,29175],{"class":166,"line":185},[164,29176,29177],{"class":170},"// - Database fundamentals\n",[164,29179,29180],{"class":166,"line":191},[164,29181,29182],{"class":170},"// - Security principles\n",[149,29184,29186],{"id":29185},"_3-not-specializing","3. Not Specializing",[154,29188,29190],{"className":156,"code":29189,"language":158,"meta":159,"style":159},"// Generalist → Specialist path\nconst careerPath = [\n \"Learn basics (6 months)\",\n \"Build projects (6 months)\",\n \"Choose specialization (3 months)\",\n \"Deep dive specialization (ongoing)\",\n]\n",[161,29191,29192,29197,29208,29219,29230,29241,29252],{"__ignoreMap":159},[164,29193,29194],{"class":166,"line":167},[164,29195,29196],{"class":170},"// Generalist → Specialist path\n",[164,29198,29199,29201,29204,29206],{"class":166,"line":174},[164,29200,721],{"class":352},[164,29202,29203],{"class":259}," careerPath ",[164,29205,359],{"class":255},[164,29207,9281],{"class":259},[164,29209,29210,29212,29215,29217],{"class":166,"line":16},[164,29211,2676],{"class":255},[164,29213,29214],{"class":288},"Learn basics (6 months)",[164,29216,368],{"class":255},[164,29218,421],{"class":255},[164,29220,29221,29223,29226,29228],{"class":166,"line":185},[164,29222,2676],{"class":255},[164,29224,29225],{"class":288},"Build projects (6 months)",[164,29227,368],{"class":255},[164,29229,421],{"class":255},[164,29231,29232,29234,29237,29239],{"class":166,"line":191},[164,29233,2676],{"class":255},[164,29235,29236],{"class":288},"Choose specialization (3 months)",[164,29238,368],{"class":255},[164,29240,421],{"class":255},[164,29242,29243,29245,29248,29250],{"class":166,"line":346},[164,29244,2676],{"class":255},[164,29246,29247],{"class":288},"Deep dive specialization (ongoing)",[164,29249,368],{"class":255},[164,29251,421],{"class":255},[164,29253,29254],{"class":166,"line":381},[164,29255,6542],{"class":259},[98,29257,29259],{"id":29258},"resources","Resources",[149,29261,29263],{"id":29262},"learning-platforms","Learning Platforms",[113,29265,29266,29273,29280,29287],{},[116,29267,29268],{},[4843,29269,29272],{"href":29270,"rel":29271},"https://frontendmasters.com/",[4847],"Frontend Masters",[116,29274,29275],{},[4843,29276,29279],{"href":29277,"rel":29278},"https://epicreact.dev/",[4847],"Epic React",[116,29281,29282],{},[4843,29283,29286],{"href":29284,"rel":29285},"https://fullstackopen.com/",[4847],"Full Stack Open",[116,29288,29289],{},[4843,29290,29293],{"href":29291,"rel":29292},"https://roadmap.sh/",[4847],"Roadmap.sh",[149,29295,29297],{"id":29296},"documentation","Documentation",[113,29299,29300,29307,29314],{},[116,29301,29302],{},[4843,29303,29306],{"href":29304,"rel":29305},"https://developer.mozilla.org/",[4847],"MDN Web Docs",[116,29308,29309],{},[4843,29310,29313],{"href":29311,"rel":29312},"https://www.typescriptlang.org/docs/",[4847],"TypeScript Handbook",[116,29315,29316],{},[4843,29317,29320],{"href":29318,"rel":29319},"https://web.dev/",[4847],"Web.dev",[98,29322,3988],{"id":3987},[102,29324,29325],{},"Becoming a full-stack developer in 2026 requires dedication, continuous learning, and practical experience. Focus on fundamentals, build real projects, and specialize over time. The journey is challenging but rewarding.",[102,29327,29328],{},"Start with the basics, progress through the phases, and remember: consistency beats intensity. Code every day, even if it's just for 30 minutes.",[3996,29330],{},[102,29332,29333,29336],{},[119,29334,29335],{},"Ready to start?"," Pick one item from Phase 1 and spend 30 minutes on it today. Small, consistent steps lead to big results.",[4005,29338,29339],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":159,"searchDepth":174,"depth":174,"links":29341},[29342,29343,29346,29352,29357,29362,29366,29371,29372,29377,29381],{"id":26051,"depth":174,"text":26046},{"id":26060,"depth":174,"text":26061,"children":29344},[29345],{"id":151,"depth":16,"text":152},{"id":26072,"depth":174,"text":26073,"children":29347},[29348,29349,29350,29351],{"id":26076,"depth":16,"text":26077},{"id":26286,"depth":16,"text":26287},{"id":26881,"depth":16,"text":26882},{"id":27309,"depth":16,"text":27310},{"id":27622,"depth":174,"text":27623,"children":29353},[29354,29355,29356],{"id":27626,"depth":16,"text":27627},{"id":27987,"depth":16,"text":27988},{"id":28291,"depth":16,"text":28292},{"id":28678,"depth":174,"text":28679,"children":29358},[29359,29360,29361],{"id":28682,"depth":16,"text":28683},{"id":28692,"depth":16,"text":28693},{"id":28702,"depth":16,"text":28703},{"id":28712,"depth":174,"text":28713,"children":29363},[29364,29365],{"id":2194,"depth":16,"text":28716},{"id":28785,"depth":16,"text":28786},{"id":28873,"depth":174,"text":28874,"children":29367},[29368,29369,29370],{"id":28877,"depth":16,"text":28878},{"id":28961,"depth":16,"text":28962},{"id":28997,"depth":16,"text":28998},{"id":29018,"depth":174,"text":29019},{"id":29083,"depth":174,"text":29084,"children":29373},[29374,29375,29376],{"id":29087,"depth":16,"text":29088},{"id":29151,"depth":16,"text":29152},{"id":29185,"depth":16,"text":29186},{"id":29258,"depth":174,"text":29259,"children":29378},[29379,29380],{"id":29262,"depth":16,"text":29263},{"id":29296,"depth":16,"text":29297},{"id":3987,"depth":174,"text":3988},"2026-02-16","Master full-stack development in 2026 with this comprehensive roadmap covering modern frameworks, tools, and best practices.",{"readingTime":5921},"/blog/33-full-stack-development-2026-roadmap",{"title":26046,"description":29383},"Developer Career","Career guidance and skill development for developers",{"src":29390,"mime":4056,"alt":29391,"width":4058,"height":4059},"/img/blog/33-full-stack-development-2026-roadmap/banner.svg","Full Stack Development 2026 - Complete tech stack visualization with frontend, backend, and database","blog/33-full-stack-development-2026-roadmap",[4064,29394,26042,26073,4787],"Career","JGTcCDSpXr-qofYy_voa3MWxowCLJTHrJlAs40bN7os",["Reactive",29397],{"$scolor-mode":29398,"$snuxt-seo-utils:routeRules":29400,"$stoasts":29401,"$ssite-config":29402},{"preference":29399,"value":29399,"unknown":342,"forced":19285},"system",{"head":-1,"seoMeta":-1},[],{"_priority":29403,"defaultLocale":29406,"description":29407,"env":2203,"indexable":342,"name":29408,"url":29409},{"env":29404,"indexable":29405,"url":29405,"name":29405,"description":29405,"defaultLocale":29405},-15,-3,"en","Senior Software Engineer specializing in modern web technologies. Crafting scalable web applications and browser extensions for startups and founders.","Muhammad Ubaid Raza - Full Stack Engineer","https://mubaidr.js.org",["Set"],["ShallowReactive",29412],{"blog-post-/blog/27-end-to-end-type-safety-guide-2026":-1,"profile-data":-1,"series-TypeScript Mastery":-1,"related-posts-/blog/27-end-to-end-type-safety-guide-2026":-1}]