Skip to main content

Advanced TypeScript Patterns for Enterprise Applications

Muhammad Ubaid Raza
Saturday, February 22, 2025
TypeScriptAdvanced PatternsEnterprise
Advanced TypeScript patterns code examples

Advanced TypeScript Patterns for Enterprise Applications

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.

Conditional Types and Type-Level Programming

Conditional types allow you to create types that change based on conditions, enabling powerful type-level logic.

Basic Conditional Types

// Basic conditional type syntax
type IsString<T> = T extends string ? true : false

type Test1 = IsString<string> // true
type Test2 = IsString<number> // false

// More practical example: Extract function return types
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never

type FunctionReturn = ReturnType<() => string> // string
type MethodReturn = ReturnType<(x: number) => boolean> // boolean

Advanced Conditional Type Patterns

// Recursive conditional types for deep object manipulation
type DeepReadonly<T> = {
  readonly [P in keyof T]: T[P] extends object
    ? T[P] extends Function
      ? T[P]
      : DeepReadonly<T[P]>
    : T[P]
}

interface User {
  id: number
  profile: {
    name: string
    settings: {
      theme: string
      notifications: boolean
    }
  }
  updateProfile: (data: any) => void
}

type ReadonlyUser = DeepReadonly<User>
// Result: All properties are readonly except functions

// Conditional type for API response handling
type ApiResponse<T> = T extends { error: any }
  ? { success: false; error: T["error"] }
  : { success: true; data: T }

type UserResponse = ApiResponse<{ id: number; name: string }>
// { success: true; data: { id: number; name: string } }

type ErrorResponse = ApiResponse<{ error: string }>
// { success: false; error: string }

Template Literal Types

Template literal types provide powerful string manipulation at the type level.

Dynamic API Endpoint Types

// Generate API endpoint types dynamically
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE"
type ApiVersion = "v1" | "v2"
type Resource = "users" | "posts" | "comments"

type ApiEndpoint<V extends ApiVersion, R extends Resource> = `/api/${V}/${R}`

type UserEndpoints = ApiEndpoint<"v1", "users"> // "/api/v1/users"
type PostEndpoints = ApiEndpoint<"v2", "posts"> // "/api/v2/posts"

// Advanced template literal patterns
type EventName<T extends string> = `on${Capitalize<T>}`
type EventHandler<T extends string> = `handle${Capitalize<T>}`

type ClickEvent = EventName<"click"> // "onClick"
type ClickHandler = EventHandler<"click"> // "handleClick"

// CSS-in-JS type safety
type CSSProperty = "margin" | "padding" | "border"
type CSSDirection = "top" | "right" | "bottom" | "left"
type CSSPropertyWithDirection<
  P extends CSSProperty,
  D extends CSSDirection,
> = `${P}-${D}`

type MarginProperties = CSSPropertyWithDirection<"margin", CSSDirection>
// "margin-top" | "margin-right" | "margin-bottom" | "margin-left"

Form Validation with Template Literals

// Type-safe form field validation
type ValidationRule = "required" | "email" | "minLength" | "maxLength"
type FieldName = "username" | "email" | "password"

type ValidationKey<F extends FieldName, R extends ValidationRule> = `${F}_${R}`

type ValidationErrors = {
  [K in ValidationKey<FieldName, ValidationRule>]?: string
}

// Usage
const errors: ValidationErrors = {
  username_required: "Username is required",
  email_email: "Invalid email format",
  password_minLength: "Password must be at least 8 characters",
}

// Type-safe validation function
function validateField<F extends FieldName, R extends ValidationRule>(
  field: F,
  rule: R,
  value: string,
): ValidationKey<F, R> | null {
  // Validation logic here
  return null // or return the validation key if validation fails
}

Mapped Types and Key Remapping

Mapped types allow you to transform existing types by iterating over their properties.

Advanced Mapped Type Patterns

// Optional properties with specific keys
type OptionalKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>

interface User {
  id: number
  name: string
  email: string
  avatar?: string
}

type UserUpdate = OptionalKeys<User, "name" | "email">
// { id: number; avatar?: string; name?: string; email?: string; }

// Transform object properties
type Getters<T> = {
  [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]
}

type Setters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void
}

type UserGetters = Getters<User>
// { getId: () => number; getName: () => string; getEmail: () => string; getAvatar: () => string | undefined; }

type UserSetters = Setters<User>
// { setId: (value: number) => void; setName: (value: string) => void; ... }

// Combine getters and setters
type Model<T> = T & Getters<T> & Setters<T>

type UserModel = Model<User>

Database Query Builder Types

// Type-safe query builder
type QueryOperator = "eq" | "ne" | "gt" | "lt" | "in" | "like"

type WhereClause<T> = {
  [K in keyof T]?: {
    [O in QueryOperator]?: T[K] extends (infer U)[] ? U : T[K]
  }
}

type OrderByClause<T> = {
  [K in keyof T]?: "asc" | "desc"
}

interface QueryBuilder<T> {
  where(clause: WhereClause<T>): QueryBuilder<T>
  orderBy(clause: OrderByClause<T>): QueryBuilder<T>
  limit(count: number): QueryBuilder<T>
  execute(): Promise<T[]>
}

// Usage
interface Product {
  id: number
  name: string
  price: number
  category: string
  tags: string[]
}

declare function createQuery<T>(): QueryBuilder<T>

const products = await createQuery<Product>()
  .where({
    price: { gt: 100, lt: 500 },
    category: { eq: "electronics" },
    tags: { in: "smartphone" },
  })
  .orderBy({ price: "asc" })
  .limit(10)
  .execute()

Utility Types and Type Manipulation

Custom Utility Types

// Deep partial for nested objects
type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]
}

// Non-nullable type
type NonNullable<T> = T extends null | undefined ? never : T

// Extract keys by value type
type KeysOfType<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never
}[keyof T]

interface Example {
  id: number
  name: string
  isActive: boolean
  metadata: object
  count: number
}

type StringKeys = KeysOfType<Example, string> // "name"
type NumberKeys = KeysOfType<Example, number> // "id" | "count"

// Require at least one property
type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<
  T,
  Exclude<keyof T, Keys>
> &
  {
    [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>
  }[Keys]

type UpdateUser = RequireAtLeastOne<
  { name?: string; email?: string; avatar?: string },
  "name" | "email"
>

// Valid: { name: "John" }, { email: "john@example.com" }, { name: "John", email: "john@example.com" }
// Invalid: { avatar: "avatar.jpg" } - must have at least name or email

Function Type Utilities

// Extract function parameters
type Parameters<T extends (...args: any) => any> = T extends (
  ...args: infer P
) => any
  ? P
  : never

// Create overloaded function types
type OverloadedFunction<T extends Record<string, (...args: any[]) => any>> = {
  [K in keyof T]: T[K]
}[keyof T]

interface ApiMethods {
  getUser: (id: number) => Promise<User>
  getUsers: (filters?: UserFilters) => Promise<User[]>
  createUser: (data: CreateUserData) => Promise<User>
}

type ApiFunction = OverloadedFunction<ApiMethods>
// (id: number) => Promise<User> | (filters?: UserFilters) => Promise<User[]> | (data: CreateUserData) => Promise<User>

// Async function return type
type AsyncReturnType<T extends (...args: any) => Promise<any>> = T extends (
  ...args: any
) => Promise<infer R>
  ? R
  : never

type UserData = AsyncReturnType<ApiMethods["getUser"]> // User

Design Patterns with TypeScript

Builder Pattern with Type Safety

// Type-safe builder pattern
interface DatabaseConfig {
  host: string
  port: number
  database: string
  username: string
  password: string
  ssl?: boolean
  timeout?: number
}

type RequiredKeys = "host" | "port" | "database" | "username" | "password"
type OptionalKeys = "ssl" | "timeout"

class DatabaseConfigBuilder {
  private config: Partial<DatabaseConfig> = {}

  host(
    host: string,
  ): Omit<DatabaseConfigBuilder, "host"> & { host: () => never } {
    this.config.host = host
    return this as any
  }

  port(
    port: number,
  ): Omit<DatabaseConfigBuilder, "port"> & { port: () => never } {
    this.config.port = port
    return this as any
  }

  database(
    database: string,
  ): Omit<DatabaseConfigBuilder, "database"> & { database: () => never } {
    this.config.database = database
    return this as any
  }

  username(
    username: string,
  ): Omit<DatabaseConfigBuilder, "username"> & { username: () => never } {
    this.config.username = username
    return this as any
  }

  password(
    password: string,
  ): Omit<DatabaseConfigBuilder, "password"> & { password: () => never } {
    this.config.password = password
    return this as any
  }

  ssl(ssl: boolean): this {
    this.config.ssl = ssl
    return this
  }

  timeout(timeout: number): this {
    this.config.timeout = timeout
    return this
  }

  build(): DatabaseConfig {
    const requiredKeys: RequiredKeys[] = [
      "host",
      "port",
      "database",
      "username",
      "password",
    ]

    for (const key of requiredKeys) {
      if (!(key in this.config)) {
        throw new Error(`Missing required configuration: ${key}`)
      }
    }

    return this.config as DatabaseConfig
  }
}

// Usage - TypeScript enforces all required methods are called
const config = new DatabaseConfigBuilder()
  .host("localhost")
  .port(5432)
  .database("myapp")
  .username("user")
  .password("password")
  .ssl(true)
  .build()

Factory Pattern with Generic Constraints

// Generic factory with constraints
interface Entity {
  id: string
  createdAt: Date
  updatedAt: Date
}

interface User extends Entity {
  name: string
  email: string
}

interface Product extends Entity {
  name: string
  price: number
  category: string
}

type EntityConstructor<T extends Entity> = new (
  data: Omit<T, keyof Entity>,
) => T

class EntityFactory<T extends Entity> {
  constructor(private EntityClass: EntityConstructor<T>) {}

  create(data: Omit<T, keyof Entity>): T {
    return new this.EntityClass(data)
  }

  createMany(dataArray: Omit<T, keyof Entity>[]): T[] {
    return dataArray.map((data) => this.create(data))
  }
}

// Implementation
class UserEntity implements User {
  id: string
  createdAt: Date
  updatedAt: Date
  name: string
  email: string

  constructor(data: Omit<User, keyof Entity>) {
    this.id = generateId()
    this.createdAt = new Date()
    this.updatedAt = new Date()
    this.name = data.name
    this.email = data.email
  }
}

// Usage
const userFactory = new EntityFactory(UserEntity)
const user = userFactory.create({ name: "John", email: "john@example.com" })

Observer Pattern with Type Safety

// Type-safe observer pattern
type EventMap = {
  userCreated: { user: User }
  userUpdated: { user: User; changes: Partial<User> }
  userDeleted: { userId: string }
}

type EventListener<T> = (data: T) => void | Promise<void>

class TypedEventEmitter<T extends Record<string, any>> {
  private listeners: {
    [K in keyof T]?: EventListener<T[K]>[]
  } = {}

  on<K extends keyof T>(event: K, listener: EventListener<T[K]>): void {
    if (!this.listeners[event]) {
      this.listeners[event] = []
    }
    this.listeners[event]!.push(listener)
  }

  off<K extends keyof T>(event: K, listener: EventListener<T[K]>): void {
    const eventListeners = this.listeners[event]
    if (eventListeners) {
      const index = eventListeners.indexOf(listener)
      if (index > -1) {
        eventListeners.splice(index, 1)
      }
    }
  }

  emit<K extends keyof T>(event: K, data: T[K]): void {
    const eventListeners = this.listeners[event]
    if (eventListeners) {
      eventListeners.forEach((listener) => listener(data))
    }
  }
}

// Usage
const eventEmitter = new TypedEventEmitter<EventMap>()

eventEmitter.on("userCreated", ({ user }) => {
  console.log(`User created: ${user.name}`)
})

eventEmitter.on("userUpdated", ({ user, changes }) => {
  console.log(`User ${user.name} updated:`, changes)
})

// Type-safe emission
eventEmitter.emit("userCreated", { user: newUser })
eventEmitter.emit("userUpdated", {
  user: updatedUser,
  changes: { name: "New Name" },
})

Advanced Generic Patterns

Variance and Generic Constraints

// Covariance and contravariance
interface Producer<out T> {
  produce(): T
}

interface Consumer<in T> {
  consume(item: T): void
}

interface Processor<T> {
  process(input: T): T
}

// Generic constraints with multiple bounds
interface Identifiable {
  id: string
}

interface Timestamped {
  createdAt: Date
  updatedAt: Date
}

function processEntity<T extends Identifiable & Timestamped>(
  entity: T,
  processor: (item: T) => T,
): T {
  const processed = processor(entity)
  return {
    ...processed,
    updatedAt: new Date(),
  }
}

// Conditional generic constraints
type ApiEndpoint<T> = T extends { id: infer ID }
  ? {
      get: (id: ID) => Promise<T>
      update: (id: ID, data: Partial<T>) => Promise<T>
      delete: (id: ID) => Promise<void>
    }
  : {
      create: (data: T) => Promise<T & { id: string }>
      list: () => Promise<T[]>
    }

type UserEndpoint = ApiEndpoint<User> // Has get, update, delete methods
type CreateUserEndpoint = ApiEndpoint<Omit<User, "id">> // Has create, list methods

Higher-Order Type Functions

// Type-level functions
type Curry<T> = T extends (arg1: infer A, ...rest: infer R) => infer Return
  ? R extends []
    ? (arg1: A) => Return
    : (arg1: A) => Curry<(...rest: R) => Return>
  : never

type Add = (a: number, b: number, c: number) => number
type CurriedAdd = Curry<Add> // (a: number) => (b: number) => (c: number) => number

// Compose function types
type Compose<F, G> = F extends (arg: infer A) => infer B
  ? G extends (arg: B) => infer C
    ? (arg: A) => C
    : never
  : never

type StringToNumber = (s: string) => number
type NumberToBoolean = (n: number) => boolean
type StringToBoolean = Compose<StringToNumber, NumberToBoolean> // (s: string) => boolean

// Pipeline type
type Pipe<T, Fns extends readonly any[]> = Fns extends readonly [
  (arg: T) => infer U,
  ...infer Rest,
]
  ? Rest extends readonly any[]
    ? Pipe<U, Rest>
    : U
  : T

type PipelineResult = Pipe<
  string,
  [(s: string) => number, (n: number) => boolean, (b: boolean) => string]
> // string

Real-World Application: Type-Safe API Client

// Complete type-safe API client implementation
interface ApiSchema {
  "/users": {
    GET: {
      query?: { page?: number; limit?: number }
      response: { users: User[]; total: number }
    }
    POST: {
      body: Omit<User, "id" | "createdAt" | "updatedAt">
      response: User
    }
  }
  "/users/:id": {
    GET: {
      params: { id: string }
      response: User
    }
    PUT: {
      params: { id: string }
      body: Partial<Omit<User, "id" | "createdAt" | "updatedAt">>
      response: User
    }
    DELETE: {
      params: { id: string }
      response: void
    }
  }
}

type ExtractParams<T extends string> =
  T extends `${string}:${infer Param}/${infer Rest}`
    ? { [K in Param]: string } & ExtractParams<`/${Rest}`>
    : T extends `${string}:${infer Param}`
      ? { [K in Param]: string }
      : {}

type ApiMethod<
  Schema extends Record<string, any>,
  Path extends keyof Schema,
  Method extends keyof Schema[Path],
> = Schema[Path][Method] extends {
  params: infer P
  query?: infer Q
  body?: infer B
  response: infer R
}
  ? (params: P, options?: { query?: Q; body?: B }) => Promise<R>
  : Schema[Path][Method] extends {
        query?: infer Q
        body?: infer B
        response: infer R
      }
    ? (options?: { query?: Q; body?: B }) => Promise<R>
    : Schema[Path][Method] extends { response: infer R }
      ? () => Promise<R>
      : never

class TypedApiClient<Schema extends Record<string, any>> {
  constructor(private baseUrl: string) {}

  request<Path extends keyof Schema, Method extends keyof Schema[Path]>(
    method: Method,
    path: Path,
    ...args: Parameters<ApiMethod<Schema, Path, Method>>
  ): ReturnType<ApiMethod<Schema, Path, Method>> {
    // Implementation here
    return null as any
  }

  get<Path extends keyof Schema>(
    path: Path,
    ...args: Parameters<ApiMethod<Schema, Path, "GET">>
  ) {
    return this.request("GET", path, ...args)
  }

  post<Path extends keyof Schema>(
    path: Path,
    ...args: Parameters<ApiMethod<Schema, Path, "POST">>
  ) {
    return this.request("POST", path, ...args)
  }

  put<Path extends keyof Schema>(
    path: Path,
    ...args: Parameters<ApiMethod<Schema, Path, "PUT">>
  ) {
    return this.request("PUT", path, ...args)
  }

  delete<Path extends keyof Schema>(
    path: Path,
    ...args: Parameters<ApiMethod<Schema, Path, "DELETE">>
  ) {
    return this.request("DELETE", path, ...args)
  }
}

// Usage
const api = new TypedApiClient<ApiSchema>("https://api.example.com")

// Type-safe API calls
const users = await api.get("/users", { query: { page: 1, limit: 10 } })
const user = await api.get("/users/:id", { id: "123" })
const newUser = await api.post("/users", {
  body: { name: "John", email: "john@example.com" },
})

Conclusion

Advanced TypeScript patterns provide powerful tools for building robust, maintainable enterprise applications. These patterns offer:

  1. Enhanced Type Safety - Catch errors at compile time rather than runtime
  2. Better Developer Experience - Intelligent autocomplete and refactoring support
  3. Self-Documenting Code - Types serve as living documentation
  4. Reduced Bugs - Impossible states become unrepresentable
  5. Improved Maintainability - Changes propagate through the type system

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.

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.

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.


Continue Your TypeScript Journey

This post is part 3 of the TypeScript Mastery series. Continue learning:

  1. My VSCode Setup - Development environment setup
  2. TypeScript + Node.js in Production - Building production-ready TypeScript applications
  3. Advanced TypeScript Patterns (You are here) - Enterprise-level TypeScript patterns and techniques

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

Muhammad Ubaid R.

\n",[126,25340,25341,25346,25364,25386,25406,25410,25415,25456,25468,25472,25476,25481,25508,25517,25526,25547,25556,25560,25564,25578,25608,25612,25618],{"__ignoreMap":124},[129,25342,25343],{"class":131,"line":132},[129,25344,25345],{"class":135},"// app/pages/users.vue\n",[129,25347,25348,25350,25353,25355,25357,25360,25362],{"class":131,"line":139},[129,25349,151],{"class":150},[129,25351,25352],{"class":278},"script setup lang",[129,25354,2710],{"class":150},[129,25356,728],{"class":150},[129,25358,25359],{"class":731},"ts",[129,25361,728],{"class":150},[129,25363,488],{"class":150},[129,25365,25366,25368,25370,25373,25375,25377,25380,25383],{"class":131,"line":16},[129,25367,12675],{"class":1771},[129,25369,688],{"class":150},[129,25371,25372],{"class":278}," usersApi",[129,25374,2852],{"class":150},[129,25376,12695],{"class":1771},[129,25378,25379],{"class":150}," '",[129,25381,25382],{"class":731},"@/lib/api/client",[129,25384,25385],{"class":150},"'\n",[129,25387,25388,25390,25392,25394,25396,25398,25400,25402,25404],{"class":131,"line":190},[129,25389,12675],{"class":1771},[129,25391,24492],{"class":1771},[129,25393,688],{"class":150},[129,25395,518],{"class":278},[129,25397,2852],{"class":150},[129,25399,12695],{"class":1771},[129,25401,25379],{"class":150},[129,25403,24603],{"class":731},[129,25405,25385],{"class":150},[129,25407,25408],{"class":131,"line":212},[129,25409,187],{"emptyLinePlaceholder":186},[129,25411,25412],{"class":131,"line":234},[129,25413,25414],{"class":135},"// Fully typed with inference\n",[129,25416,25417,25419,25421,25423,25425,25427,25429,25432,25434,25436,25438,25441,25443,25446,25448,25450,25452,25454],{"class":131,"line":239},[129,25418,1603],{"class":142},[129,25420,688],{"class":150},[129,25422,757],{"class":525},[129,25424,272],{"class":150},[129,25426,7825],{"class":278},[129,25428,990],{"class":150},[129,25430,25431],{"class":278}," error ",[129,25433,1014],{"class":150},[129,25435,160],{"class":150},[129,25437,2713],{"class":1771},[129,25439,25440],{"class":1683}," useAsyncData",[129,25442,2503],{"class":278},[129,25444,25445],{"class":150},"'",[129,25447,947],{"class":731},[129,25449,25445],{"class":150},[129,25451,990],{"class":150},[129,25453,2027],{"class":150},[129,25455,25235],{"class":142},[129,25457,25458,25461,25463,25466],{"class":131,"line":245},[129,25459,25460],{"class":278}," usersApi",[129,25462,4163],{"class":150},[129,25464,25465],{"class":1683},"getAll",[129,25467,2725],{"class":278},[129,25469,25470],{"class":131,"line":303},[129,25471,2825],{"class":278},[129,25473,25474],{"class":131,"line":308},[129,25475,187],{"emptyLinePlaceholder":186},[129,25477,25478],{"class":131,"line":332},[129,25479,25480],{"class":135},"// Type-safe component\n",[129,25482,25483,25485,25488,25490,25493,25495,25497,25499,25501,25504,25506],{"class":131,"line":534},[129,25484,1603],{"class":142},[129,25486,25487],{"class":278}," UserCard ",[129,25489,2710],{"class":150},[129,25491,25492],{"class":1683}," defineComponent",[129,25494,783],{"class":150},[129,25496,5678],{"class":525},[129,25498,272],{"class":150},[129,25500,518],{"class":146},[129,25502,25503],{"class":150}," }>",[129,25505,2503],{"class":278},[129,25507,2738],{"class":150},[129,25509,25510,25513,25515],{"class":131,"line":29},[129,25511,25512],{"class":525}," props",[129,25514,272],{"class":150},[129,25516,396],{"class":150},[129,25518,25519,25522,25524],{"class":131,"line":554},[129,25520,25521],{"class":525}," user",[129,25523,272],{"class":150},[129,25525,396],{"class":150},[129,25527,25528,25531,25533,25536,25538,25541,25543,25545],{"class":131,"line":564},[129,25529,25530],{"class":525}," type",[129,25532,272],{"class":150},[129,25534,25535],{"class":278}," Object ",[129,25537,13088],{"class":1771},[129,25539,25540],{"class":146}," PropType",[129,25542,151],{"class":150},[129,25544,646],{"class":146},[129,25546,5201],{"class":150},[129,25548,25549,25552,25554],{"class":131,"line":574},[129,25550,25551],{"class":525}," required",[129,25553,272],{"class":150},[129,25555,11933],{"class":5005},[129,25557,25558],{"class":131,"line":585},[129,25559,588],{"class":150},[129,25561,25562],{"class":131,"line":591},[129,25563,10727],{"class":150},[129,25565,25566,25569,25572,25574,25576],{"class":131,"line":597},[129,25567,25568],{"class":525}," setup",[129,25570,25571],{"class":150},"({",[129,25573,5678],{"class":268},[129,25575,6332],{"class":150},[129,25577,396],{"class":150},[129,25579,25580,25582,25584,25586,25589,25591,25593,25596,25598,25600,25602,25604,25606],{"class":131,"line":622},[129,25581,4175],{"class":1771},[129,25583,2027],{"class":150},[129,25585,285],{"class":142},[129,25587,25588],{"class":1683}," h",[129,25590,2503],{"class":525},[129,25592,25445],{"class":150},[129,25594,25595],{"class":731},"div",[129,25597,25445],{"class":150},[129,25599,990],{"class":150},[129,25601,5678],{"class":278},[129,25603,4163],{"class":150},[129,25605,1940],{"class":278},[129,25607,2825],{"class":525},[129,25609,25610],{"class":131,"line":627},[129,25611,594],{"class":150},[129,25613,25614,25616],{"class":131,"line":632},[129,25615,1014],{"class":150},[129,25617,2825],{"class":278},[129,25619,25620,25623,25626],{"class":131,"line":651},[129,25621,25622],{"class":150},"(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",[126,25640,25641,25646,25664,25668,25673,25711,25724,25735,25751,25774,25790,25814,25822,25828,25832],{"__ignoreMap":124},[129,25642,25643],{"class":131,"line":132},[129,25644,25645],{"class":135},"// shared/types/common.ts\n",[129,25647,25648,25650,25652,25654,25656,25658,25660,25662],{"class":131,"line":139},[129,25649,12675],{"class":1771},[129,25651,688],{"class":150},[129,25653,13811],{"class":278},[129,25655,2852],{"class":150},[129,25657,12695],{"class":1771},[129,25659,874],{"class":150},[129,25661,13820],{"class":731},[129,25663,908],{"class":150},[129,25665,25666],{"class":131,"line":16},[129,25667,187],{"emptyLinePlaceholder":186},[129,25669,25670],{"class":131,"line":190},[129,25671,25672],{"class":135},"// Common response structure\n",[129,25674,25675,25677,25679,25682,25684,25687,25689,25691,25693,25695,25698,25700,25703,25705,25707,25709],{"class":131,"line":212},[129,25676,12363],{"class":1771},[129,25678,12731],{"class":142},[129,25680,25681],{"class":278}," apiResponseSchema ",[129,25683,2710],{"class":150},[129,25685,25686],{"class":150}," <",[129,25688,154],{"class":146},[129,25690,166],{"class":142},[129,25692,13811],{"class":146},[129,25694,4163],{"class":150},[129,25696,25697],{"class":146},"ZodType",[129,25699,5887],{"class":150},[129,25701,25702],{"class":268},"dataSchema",[129,25704,272],{"class":150},[129,25706,163],{"class":146},[129,25708,282],{"class":150},[129,25710,25235],{"class":142},[129,25712,25713,25716,25718,25720,25722],{"class":131,"line":234},[129,25714,25715],{"class":278}," z",[129,25717,4163],{"class":150},[129,25719,13880],{"class":1683},[129,25721,2503],{"class":278},[129,25723,2738],{"class":150},[129,25725,25726,25728,25730,25733],{"class":131,"line":239},[129,25727,24785],{"class":525},[129,25729,272],{"class":150},[129,25731,25732],{"class":278}," dataSchema",[129,25734,1335],{"class":150},[129,25736,25737,25739,25741,25743,25745,25747,25749],{"class":131,"line":245},[129,25738,24802],{"class":525},[129,25740,272],{"class":150},[129,25742,13811],{"class":278},[129,25744,4163],{"class":150},[129,25746,13880],{"class":1683},[129,25748,2503],{"class":278},[129,25750,2738],{"class":150},[129,25752,25753,25755,25757,25759,25761,25763,25765,25767,25770,25772],{"class":131,"line":303},[129,25754,24811],{"class":525},[129,25756,272],{"class":150},[129,25758,13811],{"class":278},[129,25760,4163],{"class":150},[129,25762,204],{"class":1683},[129,25764,6864],{"class":278},[129,25766,4163],{"class":150},[129,25768,25769],{"class":1683},"datetime",[129,25771,6864],{"class":278},[129,25773,1335],{"class":150},[129,25775,25776,25778,25780,25782,25784,25786,25788],{"class":131,"line":308},[129,25777,24833],{"class":525},[129,25779,272],{"class":150},[129,25781,13811],{"class":278},[129,25783,4163],{"class":150},[129,25785,204],{"class":1683},[129,25787,6864],{"class":278},[129,25789,1335],{"class":150},[129,25791,25792,25795,25797,25799,25801,25803,25805,25807,25810,25812],{"class":131,"line":332},[129,25793,25794],{"class":525}," requestId",[129,25796,272],{"class":150},[129,25798,13811],{"class":278},[129,25800,4163],{"class":150},[129,25802,204],{"class":1683},[129,25804,6864],{"class":278},[129,25806,4163],{"class":150},[129,25808,25809],{"class":1683},"uuid",[129,25811,6864],{"class":278},[129,25813,1335],{"class":150},[129,25815,25816,25818,25820],{"class":131,"line":534},[129,25817,12926],{"class":150},[129,25819,282],{"class":278},[129,25821,1335],{"class":150},[129,25823,25824,25826],{"class":131,"line":29},[129,25825,2822],{"class":150},[129,25827,2825],{"class":278},[129,25829,25830],{"class":131,"line":554},[129,25831,187],{"emptyLinePlaceholder":186},[129,25833,25834,25836,25838,25840,25842,25844,25846,25848,25850,25852,25854,25856,25859,25862,25865,25867,25869],{"class":131,"line":564},[129,25835,12363],{"class":1771},[129,25837,24492],{"class":142},[129,25839,673],{"class":146},[129,25841,151],{"class":150},[129,25843,154],{"class":146},[129,25845,157],{"class":150},[129,25847,160],{"class":150},[129,25849,13811],{"class":146},[129,25851,4163],{"class":150},[129,25853,2390],{"class":146},[129,25855,151],{"class":150},[129,25857,25858],{"class":146},"ReturnType",[129,25860,25861],{"class":150},"\n",[126,25879,25880,25885,25903,25907,25926,25950,25977,26021,26027,26031,26056],{"__ignoreMap":124},[129,25881,25882],{"class":131,"line":132},[129,25883,25884],{"class":135},"// lib/env.ts\n",[129,25886,25887,25889,25891,25893,25895,25897,25899,25901],{"class":131,"line":139},[129,25888,12675],{"class":1771},[129,25890,688],{"class":150},[129,25892,13811],{"class":278},[129,25894,2852],{"class":150},[129,25896,12695],{"class":1771},[129,25898,874],{"class":150},[129,25900,13820],{"class":731},[129,25902,908],{"class":150},[129,25904,25905],{"class":131,"line":16},[129,25906,187],{"emptyLinePlaceholder":186},[129,25908,25909,25911,25914,25916,25918,25920,25922,25924],{"class":131,"line":190},[129,25910,1603],{"class":142},[129,25912,25913],{"class":278}," envSchema ",[129,25915,2710],{"class":150},[129,25917,13811],{"class":278},[129,25919,4163],{"class":150},[129,25921,13880],{"class":1683},[129,25923,2503],{"class":278},[129,25925,2738],{"class":150},[129,25927,25928,25931,25933,25935,25937,25939,25941,25943,25946,25948],{"class":131,"line":212},[129,25929,25930],{"class":525}," DATABASE_URL",[129,25932,272],{"class":150},[129,25934,13811],{"class":278},[129,25936,4163],{"class":150},[129,25938,204],{"class":1683},[129,25940,6864],{"class":278},[129,25942,4163],{"class":150},[129,25944,25945],{"class":1683},"url",[129,25947,6864],{"class":278},[129,25949,1335],{"class":150},[129,25951,25952,25955,25957,25959,25961,25963,25965,25967,25969,25971,25973,25975],{"class":131,"line":234},[129,25953,25954],{"class":525}," API_KEY",[129,25956,272],{"class":150},[129,25958,13811],{"class":278},[129,25960,4163],{"class":150},[129,25962,204],{"class":1683},[129,25964,6864],{"class":278},[129,25966,4163],{"class":150},[129,25968,13925],{"class":1683},[129,25970,2503],{"class":278},[129,25972,6116],{"class":2755},[129,25974,282],{"class":278},[129,25976,1335],{"class":150},[129,25978,25979,25982,25984,25986,25988,25991,25994,25996,25998,26000,26002,26004,26006,26008,26010,26012,26014,26016,26019],{"class":131,"line":239},[129,25980,25981],{"class":525}," NODE_ENV",[129,25983,272],{"class":150},[129,25985,13811],{"class":278},[129,25987,4163],{"class":150},[129,25989,25990],{"class":1683},"enum",[129,25992,25993],{"class":278},"([",[129,25995,728],{"class":150},[129,25997,12896],{"class":731},[129,25999,728],{"class":150},[129,26001,990],{"class":150},[129,26003,874],{"class":150},[129,26005,13174],{"class":731},[129,26007,728],{"class":150},[129,26009,990],{"class":150},[129,26011,874],{"class":150},[129,26013,12164],{"class":731},[129,26015,728],{"class":150},[129,26017,26018],{"class":278},"])",[129,26020,1335],{"class":150},[129,26022,26023,26025],{"class":131,"line":245},[129,26024,1014],{"class":150},[129,26026,2825],{"class":278},[129,26028,26029],{"class":131,"line":303},[129,26030,187],{"emptyLinePlaceholder":186},[129,26032,26033,26035,26037,26040,26042,26045,26047,26049,26051,26053],{"class":131,"line":308},[129,26034,12363],{"class":1771},[129,26036,12731],{"class":142},[129,26038,26039],{"class":278}," env ",[129,26041,2710],{"class":150},[129,26043,26044],{"class":278}," envSchema",[129,26046,4163],{"class":150},[129,26048,14066],{"class":1683},[129,26050,14826],{"class":278},[129,26052,4163],{"class":150},[129,26054,26055],{"class":278},"env)\n",[129,26057,26058,26060,26062,26065,26067,26069,26071,26073,26075,26077],{"class":131,"line":332},[129,26059,12363],{"class":1771},[129,26061,24492],{"class":142},[129,26063,26064],{"class":146}," Env",[129,26066,160],{"class":150},[129,26068,13811],{"class":146},[129,26070,4163],{"class":150},[129,26072,2390],{"class":146},[129,26074,25861],{"class":150},[129,26076,26044],{"class":278},[129,26078,488],{"class":150},[114,26080,26082],{"id":26081},"_3-database-migrations-with-type-safety","3. Database Migrations with Type Safety",[119,26084,26086],{"className":121,"code":26085,"language":123,"meta":124,"style":124},"// 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",[126,26087,26088,26093,26113,26117,26132,26142,26147,26152,26157,26162,26167,26172,26177,26181,26185,26200,26213],{"__ignoreMap":124},[129,26089,26090],{"class":131,"line":132},[129,26091,26092],{"class":135},"// db/migrations/001_create_users.ts\n",[129,26094,26095,26097,26099,26102,26104,26106,26108,26111],{"class":131,"line":139},[129,26096,12675],{"class":1771},[129,26098,688],{"class":150},[129,26100,26101],{"class":278}," sql",[129,26103,2852],{"class":150},[129,26105,12695],{"class":1771},[129,26107,874],{"class":150},[129,26109,26110],{"class":731},"drizzle-orm",[129,26112,908],{"class":150},[129,26114,26115],{"class":131,"line":16},[129,26116,187],{"emptyLinePlaceholder":186},[129,26118,26119,26121,26123,26125,26128,26130],{"class":131,"line":190},[129,26120,12363],{"class":1771},[129,26122,15158],{"class":142},[129,26124,2678],{"class":142},[129,26126,26127],{"class":1683}," up",[129,26129,6864],{"class":150},[129,26131,396],{"class":150},[129,26133,26134,26137,26139],{"class":131,"line":212},[129,26135,26136],{"class":1771}," await",[129,26138,26101],{"class":1683},[129,26140,26141],{"class":150},"`\n",[129,26143,26144],{"class":131,"line":234},[129,26145,26146],{"class":731}," CREATE TABLE users (\n",[129,26148,26149],{"class":131,"line":239},[129,26150,26151],{"class":731}," id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n",[129,26153,26154],{"class":131,"line":245},[129,26155,26156],{"class":731}," email TEXT NOT NULL UNIQUE,\n",[129,26158,26159],{"class":131,"line":303},[129,26160,26161],{"class":731}," name TEXT NOT NULL,\n",[129,26163,26164],{"class":131,"line":308},[129,26165,26166],{"class":731}," created_at TIMESTAMPTZ DEFAULT NOW()\n",[129,26168,26169],{"class":131,"line":332},[129,26170,26171],{"class":731}," )\n",[129,26173,26174],{"class":131,"line":534},[129,26175,26176],{"class":150}," `\n",[129,26178,26179],{"class":131,"line":29},[129,26180,506],{"class":150},[129,26182,26183],{"class":131,"line":554},[129,26184,187],{"emptyLinePlaceholder":186},[129,26186,26187,26189,26191,26193,26196,26198],{"class":131,"line":564},[129,26188,12363],{"class":1771},[129,26190,15158],{"class":142},[129,26192,2678],{"class":142},[129,26194,26195],{"class":1683}," down",[129,26197,6864],{"class":150},[129,26199,396],{"class":150},[129,26201,26202,26204,26206,26208,26211],{"class":131,"line":574},[129,26203,26136],{"class":1771},[129,26205,26101],{"class":1683},[129,26207,4830],{"class":150},[129,26209,26210],{"class":731},"DROP TABLE users",[129,26212,26141],{"class":150},[129,26214,26215],{"class":131,"line":585},[129,26216,506],{"class":150},[99,26218,26220],{"id":26219},"real-world-example-e-commerce-product-api","Real-World Example: E-Commerce Product API",[114,26222,26224],{"id":26223},"database-schema","Database Schema",[119,26226,26228],{"className":121,"code":26227,"language":123,"meta":124,"style":124},"// 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",[126,26229,26230,26235,26260,26286,26312,26334,26362,26396,26437],{"__ignoreMap":124},[129,26231,26232],{"class":131,"line":132},[129,26233,26234],{"class":135},"// db/schema/products.ts\n",[129,26236,26237,26239,26241,26243,26245,26247,26249,26251,26254,26256,26258],{"class":131,"line":139},[129,26238,12363],{"class":1771},[129,26240,12731],{"class":142},[129,26242,2707],{"class":278},[129,26244,2710],{"class":150},[129,26246,24205],{"class":1683},[129,26248,2503],{"class":278},[129,26250,728],{"class":150},[129,26252,26253],{"class":731},"products",[129,26255,728],{"class":150},[129,26257,990],{"class":150},[129,26259,396],{"class":150},[129,26261,26262,26264,26266,26268,26270,26272,26274,26276,26278,26280,26282,26284],{"class":131,"line":16},[129,26263,526],{"class":525},[129,26265,272],{"class":150},[129,26267,24220],{"class":1683},[129,26269,2503],{"class":278},[129,26271,728],{"class":150},[129,26273,3649],{"class":731},[129,26275,728],{"class":150},[129,26277,282],{"class":278},[129,26279,4163],{"class":150},[129,26281,24325],{"class":1683},[129,26283,6864],{"class":278},[129,26285,1335],{"class":150},[129,26287,26288,26290,26292,26294,26296,26298,26300,26302,26304,26306,26308,26310],{"class":131,"line":190},[129,26289,1888],{"class":525},[129,26291,272],{"class":150},[129,26293,24210],{"class":1683},[129,26295,2503],{"class":278},[129,26297,728],{"class":150},[129,26299,1940],{"class":731},[129,26301,728],{"class":150},[129,26303,282],{"class":278},[129,26305,4163],{"class":150},[129,26307,24359],{"class":1683},[129,26309,6864],{"class":278},[129,26311,1335],{"class":150},[129,26313,26314,26317,26319,26321,26323,26325,26328,26330,26332],{"class":131,"line":212},[129,26315,26316],{"class":525}," description",[129,26318,272],{"class":150},[129,26320,24210],{"class":1683},[129,26322,2503],{"class":278},[129,26324,728],{"class":150},[129,26326,26327],{"class":731},"description",[129,26329,728],{"class":150},[129,26331,282],{"class":278},[129,26333,1335],{"class":150},[129,26335,26336,26338,26340,26343,26345,26347,26350,26352,26354,26356,26358,26360],{"class":131,"line":234},[129,26337,2637],{"class":525},[129,26339,272],{"class":150},[129,26341,26342],{"class":1683}," numeric",[129,26344,2503],{"class":278},[129,26346,728],{"class":150},[129,26348,26349],{"class":731},"price",[129,26351,728],{"class":150},[129,26353,282],{"class":278},[129,26355,4163],{"class":150},[129,26357,24359],{"class":1683},[129,26359,6864],{"class":278},[129,26361,1335],{"class":150},[129,26363,26364,26367,26369,26372,26374,26376,26379,26381,26383,26385,26388,26390,26392,26394],{"class":131,"line":239},[129,26365,26366],{"class":525}," inventory",[129,26368,272],{"class":150},[129,26370,26371],{"class":1683}," integer",[129,26373,2503],{"class":278},[129,26375,728],{"class":150},[129,26377,26378],{"class":731},"inventory",[129,26380,728],{"class":150},[129,26382,282],{"class":278},[129,26384,4163],{"class":150},[129,26386,26387],{"class":1683},"default",[129,26389,2503],{"class":278},[129,26391,14225],{"class":2755},[129,26393,282],{"class":278},[129,26395,1335],{"class":150},[129,26397,26398,26401,26403,26405,26407,26409,26412,26414,26416,26418,26421,26423,26425,26427,26430,26432,26435],{"class":131,"line":245},[129,26399,26400],{"class":525}," categoryId",[129,26402,272],{"class":150},[129,26404,24220],{"class":1683},[129,26406,2503],{"class":278},[129,26408,728],{"class":150},[129,26410,26411],{"class":731},"category_id",[129,26413,728],{"class":150},[129,26415,282],{"class":278},[129,26417,4163],{"class":150},[129,26419,26420],{"class":1683},"references",[129,26422,2503],{"class":278},[129,26424,6864],{"class":150},[129,26426,285],{"class":142},[129,26428,26429],{"class":278}," categories",[129,26431,4163],{"class":150},[129,26433,26434],{"class":278},"id)",[129,26436,1335],{"class":150},[129,26438,26439,26441],{"class":131,"line":303},[129,26440,1014],{"class":150},[129,26442,2825],{"class":278},[114,26444,26446],{"id":26445},"api-route","API Route",[119,26448,26450],{"className":121,"code":26449,"language":123,"meta":124,"style":124},"// 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",[126,26451,26452,26457,26467,26478,26529,26543,26575,26579,26610,26634,26643,26654,26665,26670,26676,26680,26695,26728,26732,26736,26760,26764],{"__ignoreMap":124},[129,26453,26454],{"class":131,"line":132},[129,26455,26456],{"class":135},"// server/routes/api/products.ts\n",[129,26458,26459,26461,26463,26465],{"class":131,"line":139},[129,26460,24638],{"class":278},[129,26462,4163],{"class":150},[129,26464,2003],{"class":1683},[129,26466,4100],{"class":278},[129,26468,26469,26471,26474,26476],{"class":131,"line":16},[129,26470,3416],{"class":150},[129,26472,26473],{"class":731},"/products/:id",[129,26475,728],{"class":150},[129,26477,1335],{"class":150},[129,26479,26480,26483,26485,26487,26490,26492,26494,26496,26498,26500,26502,26504,26506,26508,26510,26512,26514,26516,26518,26520,26522,26524,26527],{"class":131,"line":190},[129,26481,26482],{"class":1683}," zValidator",[129,26484,2503],{"class":278},[129,26486,728],{"class":150},[129,26488,26489],{"class":731},"param",[129,26491,728],{"class":150},[129,26493,990],{"class":150},[129,26495,13811],{"class":278},[129,26497,4163],{"class":150},[129,26499,13880],{"class":1683},[129,26501,2503],{"class":278},[129,26503,2838],{"class":150},[129,26505,786],{"class":525},[129,26507,272],{"class":150},[129,26509,13811],{"class":278},[129,26511,4163],{"class":150},[129,26513,204],{"class":1683},[129,26515,6864],{"class":278},[129,26517,4163],{"class":150},[129,26519,25809],{"class":1683},[129,26521,15097],{"class":278},[129,26523,1014],{"class":150},[129,26525,26526],{"class":278},"))",[129,26528,1335],{"class":150},[129,26530,26531,26533,26535,26537,26539,26541],{"class":131,"line":212},[129,26532,13276],{"class":142},[129,26534,605],{"class":150},[129,26536,24676],{"class":268},[129,26538,282],{"class":150},[129,26540,285],{"class":142},[129,26542,396],{"class":150},[129,26544,26545,26547,26549,26551,26553,26555,26557,26559,26561,26563,26565,26567,26569,26571,26573],{"class":131,"line":234},[129,26546,4681],{"class":142},[129,26548,688],{"class":150},[129,26550,786],{"class":278},[129,26552,2852],{"class":150},[129,26554,160],{"class":150},[129,26556,7316],{"class":278},[129,26558,4163],{"class":150},[129,26560,14017],{"class":278},[129,26562,4163],{"class":150},[129,26564,24701],{"class":1683},[129,26566,2503],{"class":525},[129,26568,728],{"class":150},[129,26570,26489],{"class":731},[129,26572,728],{"class":150},[129,26574,2825],{"class":525},[129,26576,26577],{"class":131,"line":239},[129,26578,187],{"emptyLinePlaceholder":186},[129,26580,26581,26583,26586,26588,26590,26592,26594,26597,26599,26601,26603,26606,26608],{"class":131,"line":245},[129,26582,4681],{"class":142},[129,26584,26585],{"class":278}," product",[129,26587,160],{"class":150},[129,26589,2713],{"class":1771},[129,26591,24733],{"class":278},[129,26593,4163],{"class":150},[129,26595,26596],{"class":278},"query",[129,26598,4163],{"class":150},[129,26600,26253],{"class":278},[129,26602,4163],{"class":150},[129,26604,26605],{"class":1683},"findFirst",[129,26607,2503],{"class":525},[129,26609,2738],{"class":150},[129,26611,26612,26614,26616,26618,26620,26622,26624,26626,26628,26630,26632],{"class":131,"line":303},[129,26613,13327],{"class":525},[129,26615,272],{"class":150},[129,26617,2782],{"class":1683},[129,26619,2503],{"class":525},[129,26621,26253],{"class":278},[129,26623,4163],{"class":150},[129,26625,3649],{"class":278},[129,26627,990],{"class":150},[129,26629,786],{"class":278},[129,26631,282],{"class":525},[129,26633,1335],{"class":150},[129,26635,26636,26639,26641],{"class":131,"line":308},[129,26637,26638],{"class":525}," with",[129,26640,272],{"class":150},[129,26642,396],{"class":150},[129,26644,26645,26648,26650,26652],{"class":131,"line":332},[129,26646,26647],{"class":525}," category",[129,26649,272],{"class":150},[129,26651,175],{"class":5005},[129,26653,1335],{"class":150},[129,26655,26656,26659,26661,26663],{"class":131,"line":534},[129,26657,26658],{"class":525}," images",[129,26660,272],{"class":150},[129,26662,175],{"class":5005},[129,26664,1335],{"class":150},[129,26666,26667],{"class":131,"line":29},[129,26668,26669],{"class":150}," },\n",[129,26671,26672,26674],{"class":131,"line":554},[129,26673,12926],{"class":150},[129,26675,2825],{"class":525},[129,26677,26678],{"class":131,"line":564},[129,26679,187],{"emptyLinePlaceholder":186},[129,26681,26682,26684,26686,26688,26691,26693],{"class":131,"line":574},[129,26683,5924],{"class":1771},[129,26685,605],{"class":525},[129,26687,4796],{"class":150},[129,26689,26690],{"class":278},"product",[129,26692,3517],{"class":525},[129,26694,2738],{"class":150},[129,26696,26697,26700,26702,26704,26706,26708,26710,26712,26714,26716,26719,26721,26724,26726],{"class":131,"line":585},[129,26698,26699],{"class":1771}," return",[129,26701,7316],{"class":278},[129,26703,4163],{"class":150},[129,26705,10154],{"class":1683},[129,26707,2503],{"class":525},[129,26709,2838],{"class":150},[129,26711,691],{"class":525},[129,26713,272],{"class":150},[129,26715,874],{"class":150},[129,26717,26718],{"class":731},"Product not found",[129,26720,728],{"class":150},[129,26722,26723],{"class":150}," },",[129,26725,12646],{"class":2755},[129,26727,2825],{"class":525},[129,26729,26730],{"class":131,"line":591},[129,26731,588],{"class":150},[129,26733,26734],{"class":131,"line":597},[129,26735,187],{"emptyLinePlaceholder":186},[129,26737,26738,26740,26742,26744,26746,26748,26750,26752,26754,26756,26758],{"class":131,"line":622},[129,26739,4175],{"class":1771},[129,26741,7316],{"class":278},[129,26743,4163],{"class":150},[129,26745,10154],{"class":1683},[129,26747,2503],{"class":525},[129,26749,2838],{"class":150},[129,26751,757],{"class":525},[129,26753,272],{"class":150},[129,26755,26585],{"class":278},[129,26757,2852],{"class":150},[129,26759,2825],{"class":525},[129,26761,26762],{"class":131,"line":627},[129,26763,10727],{"class":150},[129,26765,26766],{"class":131,"line":632},[129,26767,2825],{"class":278},[114,26769,26771],{"id":26770},"frontend-component","Frontend Component",[119,26773,26777],{"className":26774,"code":26775,"language":26776,"meta":124,"style":124},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\n\n\n\n","vue",[126,26778,26779,26784,26806,26826,26830,26845,26855,26862,26866,26884,26910,26926,26941,26970,26974,26982,26986,26995,27015,27033,27050,27059],{"__ignoreMap":124},[129,26780,26781],{"class":131,"line":132},[129,26782,26783],{"class":135},"\n",[129,26785,26786,26788,26790,26793,26796,26798,26800,26802,26804],{"class":131,"line":139},[129,26787,151],{"class":150},[129,26789,25625],{"class":525},[129,26791,26792],{"class":142}," setup",[129,26794,26795],{"class":142}," lang",[129,26797,2710],{"class":150},[129,26799,728],{"class":150},[129,26801,25359],{"class":731},[129,26803,728],{"class":150},[129,26805,488],{"class":150},[129,26807,26808,26810,26812,26814,26816,26818,26820,26822,26824],{"class":131,"line":16},[129,26809,12675],{"class":1771},[129,26811,24492],{"class":1771},[129,26813,688],{"class":150},[129,26815,2614],{"class":278},[129,26817,2852],{"class":150},[129,26819,12695],{"class":1771},[129,26821,874],{"class":150},[129,26823,24603],{"class":731},[129,26825,908],{"class":150},[129,26827,26828],{"class":131,"line":190},[129,26829,187],{"emptyLinePlaceholder":186},[129,26831,26832,26834,26837,26839,26842],{"class":131,"line":212},[129,26833,1603],{"class":142},[129,26835,26836],{"class":278}," props ",[129,26838,2710],{"class":150},[129,26840,26841],{"class":1683}," defineProps",[129,26843,26844],{"class":150},"<{\n",[129,26846,26847,26850,26852],{"class":131,"line":234},[129,26848,26849],{"class":525}," product",[129,26851,272],{"class":150},[129,26853,26854],{"class":146}," Product\n",[129,26856,26857,26860],{"class":131,"line":239},[129,26858,26859],{"class":150},"}>",[129,26861,2725],{"class":278},[129,26863,26864],{"class":131,"line":245},[129,26865,187],{"emptyLinePlaceholder":186},[129,26867,26868,26870,26873,26875,26878,26880,26882],{"class":131,"line":303},[129,26869,1603],{"class":142},[129,26871,26872],{"class":278}," formattedPrice ",[129,26874,2710],{"class":150},[129,26876,26877],{"class":1683}," computed",[129,26879,2503],{"class":278},[129,26881,6864],{"class":150},[129,26883,25235],{"class":142},[129,26885,26886,26889,26892,26894,26897,26899,26901,26904,26906,26908],{"class":131,"line":308},[129,26887,26888],{"class":150}," new",[129,26890,26891],{"class":278}," Intl",[129,26893,4163],{"class":150},[129,26895,26896],{"class":1683},"NumberFormat",[129,26898,2503],{"class":278},[129,26900,728],{"class":150},[129,26902,26903],{"class":731},"en-US",[129,26905,728],{"class":150},[129,26907,990],{"class":150},[129,26909,396],{"class":150},[129,26911,26912,26915,26917,26919,26922,26924],{"class":131,"line":332},[129,26913,26914],{"class":525}," style",[129,26916,272],{"class":150},[129,26918,874],{"class":150},[129,26920,26921],{"class":731},"currency",[129,26923,728],{"class":150},[129,26925,1335],{"class":150},[129,26927,26928,26931,26933,26935,26937,26939],{"class":131,"line":534},[129,26929,26930],{"class":525}," currency",[129,26932,272],{"class":150},[129,26934,874],{"class":150},[129,26936,41],{"class":731},[129,26938,728],{"class":150},[129,26940,1335],{"class":150},[129,26942,26943,26945,26947,26949,26951,26953,26956,26959,26961,26963,26965,26968],{"class":131,"line":29},[129,26944,2822],{"class":150},[129,26946,282],{"class":278},[129,26948,4163],{"class":150},[129,26950,14648],{"class":1683},[129,26952,2503],{"class":278},[129,26954,26955],{"class":1683},"Number",[129,26957,26958],{"class":278},"(props",[129,26960,4163],{"class":150},[129,26962,26690],{"class":278},[129,26964,4163],{"class":150},[129,26966,26967],{"class":278},"price))",[129,26969,1335],{"class":150},[129,26971,26972],{"class":131,"line":554},[129,26973,2825],{"class":278},[129,26975,26976,26978,26980],{"class":131,"line":564},[129,26977,25622],{"class":150},[129,26979,25625],{"class":525},[129,26981,488],{"class":150},[129,26983,26984],{"class":131,"line":574},[129,26985,187],{"emptyLinePlaceholder":186},[129,26987,26988,26990,26993],{"class":131,"line":585},[129,26989,151],{"class":150},[129,26991,26992],{"class":525},"template",[129,26994,488],{"class":150},[129,26996,26997,27000,27002,27004,27006,27008,27011,27013],{"class":131,"line":591},[129,26998,26999],{"class":150}," <",[129,27001,25595],{"class":525},[129,27003,12366],{"class":142},[129,27005,2710],{"class":150},[129,27007,728],{"class":150},[129,27009,27010],{"class":731},"product-card",[129,27012,728],{"class":150},[129,27014,488],{"class":150},[129,27016,27017,27020,27022,27024,27027,27029,27031],{"class":131,"line":597},[129,27018,27019],{"class":150}," <",[129,27021,114],{"class":525},[129,27023,157],{"class":150},[129,27025,27026],{"class":278},"{{ product.name }}",[129,27028,25622],{"class":150},[129,27030,114],{"class":525},[129,27032,488],{"class":150},[129,27034,27035,27037,27039,27041,27044,27046,27048],{"class":131,"line":622},[129,27036,27019],{"class":150},[129,27038,103],{"class":525},[129,27040,157],{"class":150},[129,27042,27043],{"class":278},"{{ formattedPrice }}",[129,27045,25622],{"class":150},[129,27047,103],{"class":525},[129,27049,488],{"class":150},[129,27051,27052,27055,27057],{"class":131,"line":627},[129,27053,27054],{"class":150}," {\n expectTypeOf(usersApi.getAll()).resolves.toEqualTypeOf()\n})\n\ntest(\"usersApi.create accepts NewUser\", () => {\n expectTypeOf(usersApi.create).parameter(0).toEqualTypeOf()\n})\n",[126,27534,27535,27540,27560,27578,27582,27603,27640,27646,27650,27671,27709],{"__ignoreMap":124},[129,27536,27537],{"class":131,"line":132},[129,27538,27539],{"class":135},"// tests/types.test.ts\n",[129,27541,27542,27544,27546,27549,27551,27553,27555,27558],{"class":131,"line":139},[129,27543,12675],{"class":1771},[129,27545,688],{"class":150},[129,27547,27548],{"class":278}," expectTypeOf",[129,27550,2852],{"class":150},[129,27552,12695],{"class":1771},[129,27554,874],{"class":150},[129,27556,27557],{"class":731},"expect-type",[129,27559,908],{"class":150},[129,27561,27562,27564,27566,27568,27570,27572,27574,27576],{"class":131,"line":16},[129,27563,12675],{"class":1771},[129,27565,688],{"class":150},[129,27567,25372],{"class":278},[129,27569,2852],{"class":150},[129,27571,12695],{"class":1771},[129,27573,874],{"class":150},[129,27575,25382],{"class":731},[129,27577,908],{"class":150},[129,27579,27580],{"class":131,"line":190},[129,27581,187],{"emptyLinePlaceholder":186},[129,27583,27584,27586,27588,27590,27593,27595,27597,27599,27601],{"class":131,"line":212},[129,27585,12164],{"class":1683},[129,27587,2503],{"class":278},[129,27589,728],{"class":150},[129,27591,27592],{"class":731},"usersApi.getAll returns User[]",[129,27594,728],{"class":150},[129,27596,990],{"class":150},[129,27598,2027],{"class":150},[129,27600,285],{"class":142},[129,27602,396],{"class":150},[129,27604,27605,27608,27610,27613,27615,27617,27620,27622,27625,27627,27630,27632,27634,27636,27638],{"class":131,"line":234},[129,27606,27607],{"class":1683}," expectTypeOf",[129,27609,2503],{"class":525},[129,27611,27612],{"class":278},"usersApi",[129,27614,4163],{"class":150},[129,27616,25465],{"class":1683},[129,27618,27619],{"class":525},"())",[129,27621,4163],{"class":150},[129,27623,27624],{"class":278},"resolves",[129,27626,4163],{"class":150},[129,27628,27629],{"class":1683},"toEqualTypeOf",[129,27631,151],{"class":150},[129,27633,646],{"class":146},[129,27635,279],{"class":525},[129,27637,157],{"class":150},[129,27639,2725],{"class":525},[129,27641,27642,27644],{"class":131,"line":239},[129,27643,1014],{"class":150},[129,27645,2825],{"class":278},[129,27647,27648],{"class":131,"line":245},[129,27649,187],{"emptyLinePlaceholder":186},[129,27651,27652,27654,27656,27658,27661,27663,27665,27667,27669],{"class":131,"line":303},[129,27653,12164],{"class":1683},[129,27655,2503],{"class":278},[129,27657,728],{"class":150},[129,27659,27660],{"class":731},"usersApi.create accepts NewUser",[129,27662,728],{"class":150},[129,27664,990],{"class":150},[129,27666,2027],{"class":150},[129,27668,285],{"class":142},[129,27670,396],{"class":150},[129,27672,27673,27675,27677,27679,27681,27683,27685,27687,27690,27692,27694,27696,27698,27700,27702,27705,27707],{"class":131,"line":308},[129,27674,27607],{"class":1683},[129,27676,2503],{"class":525},[129,27678,27612],{"class":278},[129,27680,4163],{"class":150},[129,27682,5379],{"class":278},[129,27684,282],{"class":525},[129,27686,4163],{"class":150},[129,27688,27689],{"class":1683},"parameter",[129,27691,2503],{"class":525},[129,27693,14225],{"class":2755},[129,27695,282],{"class":525},[129,27697,4163],{"class":150},[129,27699,27629],{"class":1683},[129,27701,151],{"class":150},[129,27703,27704],{"class":146},"NewUser",[129,27706,157],{"class":150},[129,27708,2725],{"class":525},[129,27710,27711,27713],{"class":131,"line":332},[129,27712,1014],{"class":150},[129,27714,2825],{"class":278},[99,27716,27718],{"id":27717},"performance-considerations","Performance Considerations",[103,27720,27721],{},"Type safety doesn't have to impact performance:",[9412,27723,27724,27730,27740,27749],{},[9415,27725,27726,27729],{},[9418,27727,27728],{},"Tree-shaking",": Unused types are removed in production",[9415,27731,27732,27735,27736,27739],{},[9418,27733,27734],{},"Type-only imports",": Use ",[126,27737,27738],{},"import type"," to avoid runtime overhead",[9415,27741,27742,27735,27745,27748],{},[9418,27743,27744],{},"Zod optimization",[126,27746,27747],{},"z.safeParse()"," for better performance",[9415,27750,27751,27754],{},[9418,27752,27753],{},"Code splitting",": Split types by feature/route",[99,27756,9407],{"id":9406},[103,27758,27759],{},"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.",[103,27761,27762],{},"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.",[9456,27764],{},[103,27766,27767,27770],{},[9418,27768,27769],{},"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.",[9504,27772,27773],{},"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":124,"searchDepth":139,"depth":139,"links":27775},[27776,27777,27778,27782,27788,27793,27798,27803,27808,27809,27810],{"id":24069,"depth":139,"text":24064},{"id":24075,"depth":139,"text":24076},{"id":24110,"depth":139,"text":24111,"children":27779},[27780,27781],{"id":24114,"depth":16,"text":24115},{"id":24148,"depth":16,"text":24149},{"id":24178,"depth":139,"text":24179,"children":27783},[27784,27785,27786,27787],{"id":24182,"depth":16,"text":24183},{"id":24529,"depth":16,"text":24530},{"id":24888,"depth":16,"text":24889},{"id":25334,"depth":16,"text":25335},{"id":25630,"depth":139,"text":25631,"children":27789},[27790,27791,27792],{"id":25634,"depth":16,"text":25635},{"id":25873,"depth":16,"text":25874},{"id":26081,"depth":16,"text":26082},{"id":26219,"depth":139,"text":26220,"children":27794},[27795,27796,27797],{"id":26223,"depth":16,"text":26224},{"id":26445,"depth":16,"text":26446},{"id":26770,"depth":16,"text":26771},{"id":27069,"depth":139,"text":27070,"children":27799},[27800,27801,27802],{"id":27073,"depth":16,"text":27074},{"id":27137,"depth":16,"text":27138},{"id":27357,"depth":16,"text":27358},{"id":27446,"depth":139,"text":27447,"children":27804},[27805,27806,27807],{"id":27450,"depth":16,"text":27451},{"id":27480,"depth":16,"text":27481},{"id":27504,"depth":16,"text":27505},{"id":27528,"depth":139,"text":27529},{"id":27717,"depth":139,"text":27718},{"id":9406,"depth":139,"text":9407},"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.",{"readingTime":27814},"11 min read","/blog/27-end-to-end-type-safety-guide-2026",{"title":24064,"description":27812},"Advanced TypeScript patterns for full-stack development",{"src":27819,"mime":9550,"alt":27820,"width":9552,"height":9553},"/img/blog/27-end-to-end-type-safety-guide-2026/banner.svg","End-to-End Type Safety - Connected type chain from database to frontend on blue gradient","blog/27-end-to-end-type-safety-guide-2026",[9556,10271,27823,27488,27824],"Full-Stack","API Design","N8RnEQivPlHqHoUy1OdwWQLnfChWlNh-gR5oMZhHnsA",[27827,28416,31200],{"id":9562,"title":9563,"abstract":9540,"author":9564,"authorUrl":9540,"body":27828,"date":10258,"dateUpdated":10258,"description":10259,"excerpt":9540,"extension":9541,"featured":186,"headline":9540,"image":9540,"meta":28412,"navigation":186,"ogImage":9540,"path":10262,"seo":28413,"series":9467,"seriesDescription":10264,"seriesOrder":132,"socialImage":28414,"stem":10268,"tags":28415,"__hash__":10274},{"type":96,"value":27829,"toc":28382},[27830,27832,27834,27836,27838,27840,27842,27844,27998,28000,28002,28004,28006,28008,28010,28014,28016,28018,28020,28022,28024,28026,28132,28134,28136,28138,28140,28142,28144,28146,28148,28150,28152,28154,28156,28158,28160,28162,28164,28166,28338,28340,28342,28344,28346,28348,28350,28372,28374,28376,28378,28380],[99,27831,9563],{"id":9569},[103,27833,9572],{},[103,27835,9575],{},[99,27837,9579],{"id":9578},[103,27839,9582],{},[114,27841,9586],{"id":9585},[103,27843,9589],{},[119,27845,27846],{"className":121,"code":9592,"language":123,"meta":124,"style":124},[126,27847,27848,27852,27884,27894,27898,27920,27924,27928,27962,27972,27976],{"__ignoreMap":124},[129,27849,27850],{"class":131,"line":132},[129,27851,9599],{"class":135},[129,27853,27854,27856,27858,27860,27862,27864,27866,27868,27870,27872,27874,27876,27878,27880,27882],{"class":131,"line":139},[129,27855,1680],{"class":142},[129,27857,9606],{"class":1683},[129,27859,151],{"class":150},[129,27861,154],{"class":146},[129,27863,5887],{"class":150},[129,27865,2106],{"class":268},[129,27867,272],{"class":150},[129,27869,163],{"class":146},[129,27871,1742],{"class":150},[129,27873,688],{"class":150},[129,27875,9625],{"class":525},[129,27877,272],{"class":150},[129,27879,163],{"class":146},[129,27881,2852],{"class":150},[129,27883,396],{"class":150},[129,27885,27886,27888,27890,27892],{"class":131,"line":16},[129,27887,1772],{"class":1771},[129,27889,688],{"class":150},[129,27891,9625],{"class":278},[129,27893,698],{"class":150},[129,27895,27896],{"class":131,"line":190},[129,27897,506],{"class":150},[129,27899,27900,27902,27904,27906,27908,27910,27912,27914,27916,27918],{"class":131,"line":212},[129,27901,1603],{"class":142},[129,27903,9654],{"class":278},[129,27905,2710],{"class":150},[129,27907,9606],{"class":1683},[129,27909,2503],{"class":278},[129,27911,728],{"class":150},[129,27913,9665],{"class":731},[129,27915,728],{"class":150},[129,27917,3517],{"class":278},[129,27919,9672],{"class":135},[129,27921,27922],{"class":131,"line":234},[129,27923,187],{"emptyLinePlaceholder":186},[129,27925,27926],{"class":131,"line":239},[129,27927,9681],{"class":135},[129,27929,27930,27932,27934,27936,27938,27940,27942,27944,27946,27948,27950,27952,27954,27956,27958,27960],{"class":131,"line":245},[129,27931,1680],{"class":142},[129,27933,9606],{"class":1683},[129,27935,151],{"class":150},[129,27937,1603],{"class":142},[129,27939,163],{"class":146},[129,27941,5887],{"class":150},[129,27943,2106],{"class":268},[129,27945,272],{"class":150},[129,27947,163],{"class":146},[129,27949,1742],{"class":150},[129,27951,688],{"class":150},[129,27953,9625],{"class":525},[129,27955,272],{"class":150},[129,27957,163],{"class":146},[129,27959,2852],{"class":150},[129,27961,396],{"class":150},[129,27963,27964,27966,27968,27970],{"class":131,"line":303},[129,27965,1772],{"class":1771},[129,27967,688],{"class":150},[129,27969,9625],{"class":278},[129,27971,698],{"class":150},[129,27973,27974],{"class":131,"line":308},[129,27975,506],{"class":150},[129,27977,27978,27980,27982,27984,27986,27988,27990,27992,27994,27996],{"class":131,"line":332},[129,27979,1603],{"class":142},[129,27981,9654],{"class":278},[129,27983,2710],{"class":150},[129,27985,9606],{"class":1683},[129,27987,2503],{"class":278},[129,27989,728],{"class":150},[129,27991,9665],{"class":731},[129,27993,728],{"class":150},[129,27995,3517],{"class":278},[129,27997,9752],{"class":135},[103,27999,9755],{},[114,28001,9759],{"id":9758},[103,28003,9762],{},[99,28005,9766],{"id":9765},[103,28007,9769],{},[114,28009,9773],{"id":9772},[103,28011,9776,28012,9780],{},[126,28013,9779],{},[114,28015,9784],{"id":9783},[103,28017,9787],{},[99,28019,9791],{"id":9790},[103,28021,9794],{},[114,28023,9798],{"id":9797},[103,28025,9801],{},[119,28027,28028],{"className":121,"code":9804,"language":123,"meta":124,"style":124},[126,28029,28030,28056,28098,28104,28110],{"__ignoreMap":124},[129,28031,28032,28034,28036,28038,28040,28042,28044,28046,28048,28050,28052,28054],{"class":131,"line":132},[129,28033,143],{"class":142},[129,28035,9813],{"class":146},[129,28037,160],{"class":150},[129,28039,1003],{"class":150},[129,28041,1006],{"class":731},[129,28043,1009],{"class":150},[129,28045,204],{"class":146},[129,28047,1014],{"class":150},[129,28049,9828],{"class":731},[129,28051,1009],{"class":150},[129,28053,226],{"class":146},[129,28055,1024],{"class":150},[129,28057,28058,28060,28062,28064,28066,28068,28070,28072,28074,28076,28078,28080,28082,28084,28086,28088,28090,28092,28094,28096],{"class":131,"line":139},[129,28059,143],{"class":142},[129,28061,9841],{"class":146},[129,28063,151],{"class":150},[129,28065,154],{"class":146},[129,28067,157],{"class":150},[129,28069,160],{"class":150},[129,28071,163],{"class":146},[129,28073,166],{"class":142},[129,28075,1003],{"class":150},[129,28077,1006],{"class":731},[129,28079,1009],{"class":150},[129,28081,204],{"class":146},[129,28083,1014],{"class":150},[129,28085,9828],{"class":731},[129,28087,1009],{"class":150},[129,28089,2390],{"class":150},[129,28091,9872],{"class":146},[129,28093,166],{"class":150},[129,28095,352],{"class":146},[129,28097,1024],{"class":150},[129,28099,28100,28102],{"class":131,"line":16},[129,28101,704],{"class":150},[129,28103,9885],{"class":146},[129,28105,28106,28108],{"class":131,"line":190},[129,28107,744],{"class":150},[129,28109,300],{"class":146},[129,28111,28112,28114,28116,28118,28120,28122,28124,28126,28128,28130],{"class":131,"line":212},[129,28113,143],{"class":142},[129,28115,9898],{"class":146},[129,28117,160],{"class":150},[129,28119,9841],{"class":146},[129,28121,151],{"class":150},[129,28123,4830],{"class":150},[129,28125,9909],{"class":731},[129,28127,4830],{"class":150},[129,28129,157],{"class":150},[129,28131,9916],{"class":135},[114,28133,9920],{"id":9919},[103,28135,9923],{},[99,28137,9927],{"id":9926},[103,28139,9930],{},[114,28141,9934],{"id":9933},[103,28143,9937],{},[114,28145,9941],{"id":9940},[103,28147,9944],{},[99,28149,9948],{"id":9947},[103,28151,9951],{},[114,28153,9955],{"id":9954},[103,28155,9958],{},[114,28157,9962],{"id":9961},[103,28159,9965],{},[99,28161,9969],{"id":9968},[114,28163,9973],{"id":9972},[103,28165,9976],{},[119,28167,28168],{"className":121,"code":9979,"language":123,"meta":124,"style":124},[126,28169,28170,28174,28190,28198,28206,28214,28234,28238,28242,28246,28256,28266,28296,28322,28334],{"__ignoreMap":124},[129,28171,28172],{"class":131,"line":132},[129,28173,9986],{"class":135},[129,28175,28176,28178,28180,28182,28184,28186,28188],{"class":131,"line":139},[129,28177,143],{"class":142},[129,28179,673],{"class":146},[129,28181,151],{"class":150},[129,28183,154],{"class":146},[129,28185,157],{"class":150},[129,28187,160],{"class":150},[129,28189,396],{"class":150},[129,28191,28192,28194,28196],{"class":131,"line":16},[129,28193,5184],{"class":525},[129,28195,272],{"class":150},[129,28197,3018],{"class":146},[129,28199,28200,28202,28204],{"class":131,"line":190},[129,28201,10015],{"class":525},[129,28203,272],{"class":150},[129,28205,396],{"class":150},[129,28207,28208,28210,28212],{"class":131,"line":212},[129,28209,10024],{"class":525},[129,28211,272],{"class":150},[129,28213,551],{"class":146},[129,28215,28216,28218,28220,28222,28224,28226,28228,28230,28232],{"class":131,"line":234},[129,28217,10033],{"class":525},[129,28219,272],{"class":150},[129,28221,874],{"class":150},[129,28223,922],{"class":731},[129,28225,728],{"class":150},[129,28227,882],{"class":150},[129,28229,874],{"class":150},[129,28231,931],{"class":731},[129,28233,908],{"class":150},[129,28235,28236],{"class":131,"line":239},[129,28237,594],{"class":150},[129,28239,28240],{"class":131,"line":245},[129,28241,506],{"class":150},[129,28243,28244],{"class":131,"line":303},[129,28245,187],{"emptyLinePlaceholder":186},[129,28247,28248,28250,28252,28254],{"class":131,"line":308},[129,28249,10066],{"class":142},[129,28251,2678],{"class":142},[129,28253,10071],{"class":1683},[129,28255,4100],{"class":150},[129,28257,28258,28260,28262,28264],{"class":131,"line":332},[129,28259,526],{"class":268},[129,28261,272],{"class":150},[129,28263,352],{"class":146},[129,28265,1335],{"class":150},[129,28267,28268,28270,28272,28274,28276,28278,28280,28282,28284,28286,28288,28290,28292,28294],{"class":131,"line":534},[129,28269,1742],{"class":150},[129,28271,2587],{"class":146},[129,28273,151],{"class":150},[129,28275,10094],{"class":146},[129,28277,783],{"class":150},[129,28279,786],{"class":525},[129,28281,272],{"class":150},[129,28283,352],{"class":146},[129,28285,717],{"class":150},[129,28287,795],{"class":525},[129,28289,272],{"class":150},[129,28291,169],{"class":146},[129,28293,10113],{"class":150},[129,28295,396],{"class":150},[129,28297,28298,28300,28302,28304,28306,28308,28310,28312,28314,28316,28318,28320],{"class":131,"line":29},[129,28299,6819],{"class":142},[129,28301,8545],{"class":278},[129,28303,160],{"class":150},[129,28305,2713],{"class":1771},[129,28307,10128],{"class":1683},[129,28309,2503],{"class":525},[129,28311,4830],{"class":150},[129,28313,10135],{"class":731},[129,28315,1009],{"class":150},[129,28317,3649],{"class":278},[129,28319,2020],{"class":150},[129,28321,2825],{"class":525},[129,28323,28324,28326,28328,28330,28332],{"class":131,"line":554},[129,28325,1772],{"class":1771},[129,28327,8545],{"class":278},[129,28329,4163],{"class":150},[129,28331,10154],{"class":1683},[129,28333,2725],{"class":525},[129,28335,28336],{"class":131,"line":564},[129,28337,506],{"class":150},[114,28339,10164],{"id":10163},[103,28341,10167],{},[114,28343,10171],{"id":10170},[103,28345,10174],{},[99,28347,10178],{"id":10177},[103,28349,10181],{},[9412,28351,28352,28356,28360,28364,28368],{},[9415,28353,28354,10189],{},[9418,28355,10188],{},[9415,28357,28358,10195],{},[9418,28359,10194],{},[9415,28361,28362,10201],{},[9418,28363,10200],{},[9415,28365,28366,10207],{},[9418,28367,10206],{},[9415,28369,28370,10213],{},[9418,28371,10212],{},[99,28373,9407],{"id":9406},[103,28375,10218],{},[103,28377,10221],{},[103,28379,10224],{},[9504,28381,10227],{},{"title":124,"searchDepth":139,"depth":139,"links":28383},[28384,28385,28389,28393,28397,28401,28405,28410,28411],{"id":9569,"depth":139,"text":9563},{"id":9578,"depth":139,"text":9579,"children":28386},[28387,28388],{"id":9585,"depth":16,"text":9586},{"id":9758,"depth":16,"text":9759},{"id":9765,"depth":139,"text":9766,"children":28390},[28391,28392],{"id":9772,"depth":16,"text":9773},{"id":9783,"depth":16,"text":9784},{"id":9790,"depth":139,"text":9791,"children":28394},[28395,28396],{"id":9797,"depth":16,"text":9798},{"id":9919,"depth":16,"text":9920},{"id":9926,"depth":139,"text":9927,"children":28398},[28399,28400],{"id":9933,"depth":16,"text":9934},{"id":9940,"depth":16,"text":9941},{"id":9947,"depth":139,"text":9948,"children":28402},[28403,28404],{"id":9954,"depth":16,"text":9955},{"id":9961,"depth":16,"text":9962},{"id":9968,"depth":139,"text":9969,"children":28406},[28407,28408,28409],{"id":9972,"depth":16,"text":9973},{"id":10163,"depth":16,"text":10164},{"id":10170,"depth":16,"text":10171},{"id":10177,"depth":139,"text":10178},{"id":9406,"depth":139,"text":9407},{"readingTime":10261},{"title":9563,"description":10259},{"src":10266,"mime":9550,"alt":10267,"width":9552,"height":9553},[9556,10270,10271,10272,10273],{"id":28417,"title":28418,"abstract":9540,"author":9564,"authorUrl":9540,"body":28419,"date":31171,"dateUpdated":31171,"description":31172,"excerpt":9540,"extension":9541,"featured":186,"headline":9540,"image":9540,"meta":31173,"navigation":186,"ogImage":9540,"path":31186,"seo":31187,"series":31188,"seriesDescription":31189,"seriesOrder":139,"socialImage":31190,"stem":31193,"tags":31194,"__hash__":31199},"blog/blog/22-nuxt-3-to-4-migration-guide-2026.md","Nuxt 3 to Nuxt 4 Migration Guide: Complete Checklist for 2026",{"type":96,"value":28420,"toc":31114},[28421,28424,28433,28447,28460,28462,28466,28469,28495,28501,28503,28507,28511,28516,28527,28532,28553,28558,28569,28574,28585,28590,28601,28603,28607,28610,28614,28617,28695,28699,28702,28719,28724,28747,28752,28763,28767,28770,28785,28789,28792,28806,28810,28813,28832,28834,28838,28842,28845,28906,28911,28929,28933,28936,28983,28986,28998,29002,29007,29094,29100,29219,29223,29230,29235,29243,29248,29254,29257,29319,29322,29326,29333,29337,29404,29409,29482,29487,29645,29649,29652,29656,29720,29725,29809,29813,29816,29821,29863,29868,29933,29937,29940,29945,29962,29967,30009,30014,30127,30129,30133,30137,30140,30146,30155,30216,30220,30223,30228,30233,30239,30243,30246,30251,30331,30335,30340,30357,30362,30376,30378,30382,30386,30390,30439,30443,30447,30506,30510,30514,30552,30556,30560,30638,30642,30646,30663,30665,30669,30672,30676,30698,30702,30714,30718,30741,30745,30765,30769,30780,30782,30786,30791,30811,30817,30819,30823,30826,30932,30934,30938,30942,30948,30952,30959,30963,30969,30973,30976,30987,30991,30997,31001,31007,31011,31014,31016,31020,31023,31054,31056,31060,31068,31073,31103,31105,31111],[99,28422,28418],{"id":28423},"nuxt-3-to-nuxt-4-migration-guide-complete-checklist-for-2026",[103,28425,28426,28429,28430],{},[9418,28427,28428],{},"Last updated:"," February 2026\n",[9418,28431,28432],{},"What changed in this update:",[10306,28434,28435,28438,28441,28444],{},[9415,28436,28437],{},"Added migration timeline reminder (Nuxt 3 EOL: January 31, 2026)",[9415,28439,28440],{},"Updated codemod tool instructions",[9415,28442,28443],{},"Added new module compatibility matrix",[9415,28445,28446],{},"Expanded troubleshooting section",[28448,28449,28450],"blockquote",{},[103,28451,28452,28455,28456,28459],{},[9418,28453,28454],{},"⚠️ Critical Timeline",": Nuxt 3 official support ends ",[9418,28457,28458],{},"January 31, 2026",". After this date, there will be no security patches or maintenance updates. Migrating to Nuxt 4 is essential for production applications.",[9456,28461],{},[99,28463,28465],{"id":28464},"why-migrate-to-nuxt-4-now","Why Migrate to Nuxt 4 Now?",[103,28467,28468],{},"If you're still on Nuxt 3 in early 2026, you're facing:",[9412,28470,28471,28477,28483,28489],{},[9415,28472,28473,28476],{},[9418,28474,28475],{},"Security risks",": No security patches after January 2026",[9415,28478,28479,28482],{},[9418,28480,28481],{},"Module incompatibility",": New module versions target Nuxt 4+",[9415,28484,28485,28488],{},[9418,28486,28487],{},"Missing features",": Performance improvements and DX enhancements",[9415,28490,28491,28494],{},[9418,28492,28493],{},"No LTS support",": Critical for enterprise applications",[103,28496,28497,28500],{},[9418,28498,28499],{},"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.",[9456,28502],{},[99,28504,28506],{"id":28505},"whats-new-in-nuxt-4","What's New in Nuxt 4?",[114,28508,28510],{"id":28509},"key-improvements","Key Improvements",[103,28512,28513],{},[9418,28514,28515],{},"1. Improved App Directory Structure",[10306,28517,28518,28521,28524],{},[9415,28519,28520],{},"Cleaner separation of concerns",[9415,28522,28523],{},"Better TypeScript integration",[9415,28525,28526],{},"Enhanced auto-imports",[103,28528,28529],{},[9418,28530,28531],{},"2. Smarter Data Fetching",[10306,28533,28534,28544,28547,28550],{},[9415,28535,28536,28539,28540,28543],{},[126,28537,28538],{},"useAsyncData"," and ",[126,28541,28542],{},"useFetch"," automatically share data with same keys",[9415,28545,28546],{},"Automatic cleanup on component unmount",[9415,28548,28549],{},"Reactive keys for automatic refetching",[9415,28551,28552],{},"Better caching strategies",[103,28554,28555],{},[9418,28556,28557],{},"3. Enhanced TypeScript Ergonomics",[10306,28559,28560,28563,28566],{},[9415,28561,28562],{},"Zero-config TypeScript setup",[9415,28564,28565],{},"Better type inference for composables",[9415,28567,28568],{},"Improved module type generation",[103,28570,28571],{},[9418,28572,28573],{},"4. Faster Development Tooling",[10306,28575,28576,28579,28582],{},[9415,28577,28578],{},"Optimized HMR (Hot Module Replacement)",[9415,28580,28581],{},"Faster cold starts",[9415,28583,28584],{},"Improved build performance",[103,28586,28587],{},[9418,28588,28589],{},"5. Nitro v2 Integration",[10306,28591,28592,28595,28598],{},[9415,28593,28594],{},"Better server-side rendering",[9415,28596,28597],{},"Enhanced API routes",[9415,28599,28600],{},"Improved edge deployment support",[9456,28602],{},[99,28604,28606],{"id":28605},"pre-migration-checklist","Pre-Migration Checklist",[103,28608,28609],{},"Before starting the migration, complete these steps:",[114,28611,28613],{"id":28612},"_1-update-dependencies","✅ 1. Update Dependencies",[103,28615,28616],{},"Update to the latest Nuxt 3.x version first:",[119,28618,28620],{"className":27367,"code":28619,"language":27369,"meta":124,"style":124},"# 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",[126,28621,28622,28627,28638,28642,28647,28658,28662,28667,28677,28686],{"__ignoreMap":124},[129,28623,28624],{"class":131,"line":132},[129,28625,28626],{"class":135},"# Check current version\n",[129,28628,28629,28632,28635],{"class":131,"line":139},[129,28630,28631],{"class":146},"npx",[129,28633,28634],{"class":731}," nuxi",[129,28636,28637],{"class":731}," info\n",[129,28639,28640],{"class":131,"line":16},[129,28641,187],{"emptyLinePlaceholder":186},[129,28643,28644],{"class":131,"line":190},[129,28645,28646],{"class":135},"# Update to latest Nuxt 3\n",[129,28648,28649,28652,28655],{"class":131,"line":212},[129,28650,28651],{"class":146},"npm",[129,28653,28654],{"class":731}," install",[129,28656,28657],{"class":731}," nuxt@latest\n",[129,28659,28660],{"class":131,"line":234},[129,28661,187],{"emptyLinePlaceholder":186},[129,28663,28664],{"class":131,"line":239},[129,28665,28666],{"class":135},"# Or with yarn/pnpm/bun\n",[129,28668,28669,28672,28675],{"class":131,"line":245},[129,28670,28671],{"class":146},"yarn",[129,28673,28674],{"class":731}," add",[129,28676,28657],{"class":731},[129,28678,28679,28682,28684],{"class":131,"line":303},[129,28680,28681],{"class":146},"pnpm",[129,28683,28674],{"class":731},[129,28685,28657],{"class":731},[129,28687,28688,28691,28693],{"class":131,"line":308},[129,28689,28690],{"class":146},"bun",[129,28692,28674],{"class":731},[129,28694,28657],{"class":731},[114,28696,28698],{"id":28697},"_2-review-module-compatibility","✅ 2. Review Module Compatibility",[103,28700,28701],{},"Check if your modules support Nuxt 4:",[119,28703,28705],{"className":27367,"code":28704,"language":27369,"meta":124,"style":124},"npx nuxi upgrade --force\n",[126,28706,28707],{"__ignoreMap":124},[129,28708,28709,28711,28713,28716],{"class":131,"line":132},[129,28710,28631],{"class":146},[129,28712,28634],{"class":731},[129,28714,28715],{"class":731}," upgrade",[129,28717,28718],{"class":731}," --force\n",[103,28720,28721],{},[9418,28722,28723],{},"Compatible Modules (Nuxt 4 Ready):",[10306,28725,28726,28729,28732,28735,28738,28741,28744],{},[9415,28727,28728],{},"✅ @nuxt/content (v3+)",[9415,28730,28731],{},"✅ @nuxt/ui (v3+)",[9415,28733,28734],{},"✅ @nuxt/icon",[9415,28736,28737],{},"✅ @nuxtjs/seo",[9415,28739,28740],{},"✅ @nuxtjs/tailwindcss (v6+)",[9415,28742,28743],{},"✅ @pinia/nuxt",[9415,28745,28746],{},"✅ @vueuse/nuxt",[103,28748,28749],{},[9418,28750,28751],{},"Modules Requiring Updates:",[10306,28753,28754,28757,28760],{},[9415,28755,28756],{},"⚠️ @nuxtjs/auth → Use @sidebase/nuxt-auth or nuxt-auth-utils",[9415,28758,28759],{},"⚠️ @nuxtjs/i18n → Update to v8+",[9415,28761,28762],{},"⚠️ Custom server middleware → Migrate to Nitro server routes",[114,28764,28766],{"id":28765},"_3-run-type-check","✅ 3. Run Type Check",[103,28768,28769],{},"Fix all TypeScript errors before migrating:",[119,28771,28773],{"className":27367,"code":28772,"language":27369,"meta":124,"style":124},"npm run type-check\n",[126,28774,28775],{"__ignoreMap":124},[129,28776,28777,28779,28782],{"class":131,"line":132},[129,28778,28651],{"class":146},[129,28780,28781],{"class":731}," run",[129,28783,28784],{"class":731}," type-check\n",[114,28786,28788],{"id":28787},"_4-update-test-suite","✅ 4. Update Test Suite",[103,28790,28791],{},"Ensure all tests pass on Nuxt 3 before migration:",[119,28793,28795],{"className":27367,"code":28794,"language":27369,"meta":124,"style":124},"npm run test\n",[126,28796,28797],{"__ignoreMap":124},[129,28798,28799,28801,28803],{"class":131,"line":132},[129,28800,28651],{"class":146},[129,28802,28781],{"class":731},[129,28804,28805],{"class":731}," test\n",[114,28807,28809],{"id":28808},"_5-backup-your-code","✅ 5. Backup Your Code",[103,28811,28812],{},"Create a git branch for migration:",[119,28814,28816],{"className":27367,"code":28815,"language":27369,"meta":124,"style":124},"git checkout -b migration/nuxt-4\n",[126,28817,28818],{"__ignoreMap":124},[129,28819,28820,28823,28826,28829],{"class":131,"line":132},[129,28821,28822],{"class":146},"git",[129,28824,28825],{"class":731}," checkout",[129,28827,28828],{"class":731}," -b",[129,28830,28831],{"class":731}," migration/nuxt-4\n",[9456,28833],{},[99,28835,28837],{"id":28836},"step-by-step-migration-process","Step-by-Step Migration Process",[114,28839,28841],{"id":28840},"step-1-use-the-codemod-tool-recommended","Step 1: Use the Codemod Tool (Recommended)",[103,28843,28844],{},"Nuxt partnered with Codemod to create an automated migration tool:",[119,28846,28848],{"className":27367,"code":28847,"language":27369,"meta":124,"style":124},"# 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",[126,28849,28850,28855,28865,28869,28874,28885,28895],{"__ignoreMap":124},[129,28851,28852],{"class":131,"line":132},[129,28853,28854],{"class":135},"# Run the migration codemod\n",[129,28856,28857,28859,28862],{"class":131,"line":139},[129,28858,28631],{"class":146},[129,28860,28861],{"class":731}," codemod@latest",[129,28863,28864],{"class":731}," nuxt/4/migration-recipe\n",[129,28866,28867],{"class":131,"line":16},[129,28868,187],{"emptyLinePlaceholder":186},[129,28870,28871],{"class":131,"line":190},[129,28872,28873],{"class":135},"# Or with your package manager\n",[129,28875,28876,28878,28881,28883],{"class":131,"line":212},[129,28877,28671],{"class":146},[129,28879,28880],{"class":731}," dlx",[129,28882,28861],{"class":731},[129,28884,28864],{"class":731},[129,28886,28887,28889,28891,28893],{"class":131,"line":234},[129,28888,28681],{"class":146},[129,28890,28880],{"class":731},[129,28892,28861],{"class":731},[129,28894,28864],{"class":731},[129,28896,28897,28899,28902,28904],{"class":131,"line":239},[129,28898,28690],{"class":146},[129,28900,28901],{"class":731}," x",[129,28903,28861],{"class":731},[129,28905,28864],{"class":731},[103,28907,28908],{},[9418,28909,28910],{},"What the codemod does:",[10306,28912,28913,28920,28923,28926],{},[9415,28914,28915,28916,28919],{},"Updates ",[126,28917,28918],{},"nuxt.config.ts"," configuration",[9415,28921,28922],{},"Migrates directory structure (if needed)",[9415,28924,28925],{},"Updates deprecated imports",[9415,28927,28928],{},"Fixes common API changes",[114,28930,28932],{"id":28931},"step-2-update-packagejson","Step 2: Update package.json",[103,28934,28935],{},"Change Nuxt version to 4:",[119,28937,28939],{"className":10456,"code":28938,"language":10154,"meta":124,"style":124},"{\n \"devDependencies\": {\n \"nuxt\": \"^4.0.0\"\n }\n}\n",[126,28940,28941,28945,28957,28975,28979],{"__ignoreMap":124},[129,28942,28943],{"class":131,"line":132},[129,28944,2738],{"class":150},[129,28946,28947,28949,28951,28953,28955],{"class":131,"line":139},[129,28948,3416],{"class":150},[129,28950,11425],{"class":142},[129,28952,728],{"class":150},[129,28954,272],{"class":150},[129,28956,396],{"class":150},[129,28958,28959,28961,28964,28966,28968,28970,28973],{"class":131,"line":16},[129,28960,10708],{"class":150},[129,28962,28963],{"class":146},"nuxt",[129,28965,728],{"class":150},[129,28967,272],{"class":150},[129,28969,874],{"class":150},[129,28971,28972],{"class":731},"^4.0.0",[129,28974,908],{"class":150},[129,28976,28977],{"class":131,"line":190},[129,28978,594],{"class":150},[129,28980,28981],{"class":131,"line":212},[129,28982,506],{"class":150},[103,28984,28985],{},"Then install:",[119,28987,28989],{"className":27367,"code":28988,"language":27369,"meta":124,"style":124},"npm install\n",[126,28990,28991],{"__ignoreMap":124},[129,28992,28993,28995],{"class":131,"line":132},[129,28994,28651],{"class":146},[129,28996,28997],{"class":731}," install\n",[114,28999,29001],{"id":29000},"step-3-update-nuxtconfigts","Step 3: Update nuxt.config.ts",[103,29003,29004],{},[9418,29005,29006],{},"Nuxt 3:",[119,29008,29010],{"className":121,"code":29009,"language":123,"meta":124,"style":124},"export default defineNuxtConfig({\n modules: [\"@nuxt/content\"],\n app: {\n head: {\n title: \"My App\",\n },\n },\n})\n",[126,29011,29012,29026,29046,29055,29064,29080,29084,29088],{"__ignoreMap":124},[129,29013,29014,29016,29019,29022,29024],{"class":131,"line":132},[129,29015,12363],{"class":1771},[129,29017,29018],{"class":1771}," default",[129,29020,29021],{"class":1683}," defineNuxtConfig",[129,29023,2503],{"class":278},[129,29025,2738],{"class":150},[129,29027,29028,29031,29033,29035,29037,29040,29042,29044],{"class":131,"line":139},[129,29029,29030],{"class":525}," modules",[129,29032,272],{"class":150},[129,29034,404],{"class":278},[129,29036,728],{"class":150},[129,29038,29039],{"class":731},"@nuxt/content",[129,29041,728],{"class":150},[129,29043,418],{"class":278},[129,29045,1335],{"class":150},[129,29047,29048,29051,29053],{"class":131,"line":16},[129,29049,29050],{"class":525}," app",[129,29052,272],{"class":150},[129,29054,396],{"class":150},[129,29056,29057,29060,29062],{"class":131,"line":190},[129,29058,29059],{"class":525}," head",[129,29061,272],{"class":150},[129,29063,396],{"class":150},[129,29065,29066,29069,29071,29073,29076,29078],{"class":131,"line":212},[129,29067,29068],{"class":525}," title",[129,29070,272],{"class":150},[129,29072,874],{"class":150},[129,29074,29075],{"class":731},"My App",[129,29077,728],{"class":150},[129,29079,1335],{"class":150},[129,29081,29082],{"class":131,"line":234},[129,29083,24848],{"class":150},[129,29085,29086],{"class":131,"line":239},[129,29087,10727],{"class":150},[129,29089,29090,29092],{"class":131,"line":245},[129,29091,1014],{"class":150},[129,29093,2825],{"class":278},[103,29095,29096,29099],{},[9418,29097,29098],{},"Nuxt 4:"," (mostly the same, but check for deprecated options)",[119,29101,29103],{"className":121,"code":29102,"language":123,"meta":124,"style":124},"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",[126,29104,29105,29117,29135,29143,29151,29165,29169,29173,29178,29187,29198,29209,29213],{"__ignoreMap":124},[129,29106,29107,29109,29111,29113,29115],{"class":131,"line":132},[129,29108,12363],{"class":1771},[129,29110,29018],{"class":1771},[129,29112,29021],{"class":1683},[129,29114,2503],{"class":278},[129,29116,2738],{"class":150},[129,29118,29119,29121,29123,29125,29127,29129,29131,29133],{"class":131,"line":139},[129,29120,29030],{"class":525},[129,29122,272],{"class":150},[129,29124,404],{"class":278},[129,29126,728],{"class":150},[129,29128,29039],{"class":731},[129,29130,728],{"class":150},[129,29132,418],{"class":278},[129,29134,1335],{"class":150},[129,29136,29137,29139,29141],{"class":131,"line":16},[129,29138,29050],{"class":525},[129,29140,272],{"class":150},[129,29142,396],{"class":150},[129,29144,29145,29147,29149],{"class":131,"line":190},[129,29146,29059],{"class":525},[129,29148,272],{"class":150},[129,29150,396],{"class":150},[129,29152,29153,29155,29157,29159,29161,29163],{"class":131,"line":212},[129,29154,29068],{"class":525},[129,29156,272],{"class":150},[129,29158,874],{"class":150},[129,29160,29075],{"class":731},[129,29162,728],{"class":150},[129,29164,1335],{"class":150},[129,29166,29167],{"class":131,"line":234},[129,29168,24848],{"class":150},[129,29170,29171],{"class":131,"line":239},[129,29172,10727],{"class":150},[129,29174,29175],{"class":131,"line":245},[129,29176,29177],{"class":135}," // New in Nuxt 4: Better TypeScript defaults\n",[129,29179,29180,29183,29185],{"class":131,"line":303},[129,29181,29182],{"class":525}," typescript",[129,29184,272],{"class":150},[129,29186,396],{"class":150},[129,29188,29189,29192,29194,29196],{"class":131,"line":308},[129,29190,29191],{"class":525}," strict",[129,29193,272],{"class":150},[129,29195,175],{"class":5005},[129,29197,1335],{"class":150},[129,29199,29200,29203,29205,29207],{"class":131,"line":332},[129,29201,29202],{"class":525}," typeCheck",[129,29204,272],{"class":150},[129,29206,175],{"class":5005},[129,29208,1335],{"class":150},[129,29210,29211],{"class":131,"line":534},[129,29212,10727],{"class":150},[129,29214,29215,29217],{"class":131,"line":29},[129,29216,1014],{"class":150},[129,29218,2825],{"class":278},[114,29220,29222],{"id":29221},"step-4-migrate-directory-structure-optional","Step 4: Migrate Directory Structure (Optional)",[103,29224,29225,29226,29229],{},"Nuxt 4 introduces an optional ",[126,29227,29228],{},"app/"," directory structure for better organization:",[103,29231,29232],{},[9418,29233,29234],{},"Old Structure (still works):",[119,29236,29241],{"className":29237,"code":29239,"language":29240},[29238],"language-text","├── components/\n├── pages/\n├── composables/\n├── layouts/\n└── plugins/\n","text",[126,29242,29239],{"__ignoreMap":124},[103,29244,29245],{},[9418,29246,29247],{},"New Structure (recommended for new projects):",[119,29249,29252],{"className":29250,"code":29251,"language":29240},[29238],"├── app/\n│ ├── components/\n│ ├── pages/\n│ ├── composables/\n│ ├── layouts/\n│ └── plugins/\n├── content/\n└── public/\n",[126,29253,29251],{"__ignoreMap":124},[103,29255,29256],{},"To adopt the new structure:",[119,29258,29260],{"className":27367,"code":29259,"language":27369,"meta":124,"style":124},"mkdir -p app\nmv components app/\nmv pages app/\nmv composables app/\nmv layouts app/\nmv plugins app/\n",[126,29261,29262,29272,29283,29292,29301,29310],{"__ignoreMap":124},[129,29263,29264,29267,29270],{"class":131,"line":132},[129,29265,29266],{"class":146},"mkdir",[129,29268,29269],{"class":731}," -p",[129,29271,24885],{"class":731},[129,29273,29274,29277,29280],{"class":131,"line":139},[129,29275,29276],{"class":146},"mv",[129,29278,29279],{"class":731}," components",[129,29281,29282],{"class":731}," app/\n",[129,29284,29285,29287,29290],{"class":131,"line":16},[129,29286,29276],{"class":146},[129,29288,29289],{"class":731}," pages",[129,29291,29282],{"class":731},[129,29293,29294,29296,29299],{"class":131,"line":190},[129,29295,29276],{"class":146},[129,29297,29298],{"class":731}," composables",[129,29300,29282],{"class":731},[129,29302,29303,29305,29308],{"class":131,"line":212},[129,29304,29276],{"class":146},[129,29306,29307],{"class":731}," layouts",[129,29309,29282],{"class":731},[129,29311,29312,29314,29317],{"class":131,"line":234},[129,29313,29276],{"class":146},[129,29315,29316],{"class":731}," plugins",[129,29318,29282],{"class":731},[103,29320,29321],{},"Update imports if necessary (most auto-imports work the same).",[114,29323,29325],{"id":29324},"step-5-update-data-fetching","Step 5: Update Data Fetching",[103,29327,29328,29329,28539,29331,272],{},"Nuxt 4 improves ",[126,29330,28538],{},[126,29332,28542],{},[103,29334,29335],{},[9418,29336,29006],{},[119,29338,29340],{"className":121,"code":29339,"language":123,"meta":124,"style":124},"const { data } = await useFetch(\"/api/posts\", {\n key: \"posts\",\n lazy: true,\n})\n",[126,29341,29342,29372,29387,29398],{"__ignoreMap":124},[129,29343,29344,29346,29348,29350,29352,29354,29356,29359,29361,29363,29366,29368,29370],{"class":131,"line":132},[129,29345,1603],{"class":142},[129,29347,688],{"class":150},[129,29349,14426],{"class":278},[129,29351,1014],{"class":150},[129,29353,160],{"class":150},[129,29355,2713],{"class":1771},[129,29357,29358],{"class":1683}," useFetch",[129,29360,2503],{"class":278},[129,29362,728],{"class":150},[129,29364,29365],{"class":731},"/api/posts",[129,29367,728],{"class":150},[129,29369,990],{"class":150},[129,29371,396],{"class":150},[129,29373,29374,29377,29379,29381,29383,29385],{"class":131,"line":139},[129,29375,29376],{"class":525}," key",[129,29378,272],{"class":150},[129,29380,874],{"class":150},[129,29382,956],{"class":731},[129,29384,728],{"class":150},[129,29386,1335],{"class":150},[129,29388,29389,29392,29394,29396],{"class":131,"line":16},[129,29390,29391],{"class":525}," lazy",[129,29393,272],{"class":150},[129,29395,175],{"class":5005},[129,29397,1335],{"class":150},[129,29399,29400,29402],{"class":131,"line":190},[129,29401,1014],{"class":150},[129,29403,2825],{"class":278},[103,29405,29406,29408],{},[9418,29407,29098],{}," (same API, better behavior)",[119,29410,29412],{"className":121,"code":29411,"language":123,"meta":124,"style":124},"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",[126,29413,29414,29442,29456,29466,29471,29476],{"__ignoreMap":124},[129,29415,29416,29418,29420,29422,29424,29426,29428,29430,29432,29434,29436,29438,29440],{"class":131,"line":132},[129,29417,1603],{"class":142},[129,29419,688],{"class":150},[129,29421,14426],{"class":278},[129,29423,1014],{"class":150},[129,29425,160],{"class":150},[129,29427,2713],{"class":1771},[129,29429,29358],{"class":1683},[129,29431,2503],{"class":278},[129,29433,728],{"class":150},[129,29435,29365],{"class":731},[129,29437,728],{"class":150},[129,29439,990],{"class":150},[129,29441,396],{"class":150},[129,29443,29444,29446,29448,29450,29452,29454],{"class":131,"line":139},[129,29445,29376],{"class":525},[129,29447,272],{"class":150},[129,29449,874],{"class":150},[129,29451,956],{"class":731},[129,29453,728],{"class":150},[129,29455,1335],{"class":150},[129,29457,29458,29460,29462,29464],{"class":131,"line":16},[129,29459,29391],{"class":525},[129,29461,272],{"class":150},[129,29463,175],{"class":5005},[129,29465,1335],{"class":150},[129,29467,29468],{"class":131,"line":190},[129,29469,29470],{"class":135}," // Now automatically shares data across components with same key\n",[129,29472,29473],{"class":131,"line":212},[129,29474,29475],{"class":135}," // Automatic cleanup on unmount\n",[129,29477,29478,29480],{"class":131,"line":234},[129,29479,1014],{"class":150},[129,29481,2825],{"class":278},[103,29483,29484],{},[9418,29485,29486],{},"New Features:",[119,29488,29490],{"className":121,"code":29489,"language":123,"meta":124,"style":124},"// 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",[126,29491,29492,29497,29529,29533,29538,29543,29590,29594,29599],{"__ignoreMap":124},[129,29493,29494],{"class":131,"line":132},[129,29495,29496],{"class":135},"// Reactive keys automatically refetch\n",[129,29498,29499,29501,29503,29505,29507,29509,29511,29513,29515,29517,29520,29522,29525,29527],{"class":131,"line":139},[129,29500,1603],{"class":142},[129,29502,688],{"class":150},[129,29504,14426],{"class":278},[129,29506,1014],{"class":150},[129,29508,160],{"class":150},[129,29510,2713],{"class":1771},[129,29512,29358],{"class":1683},[129,29514,2503],{"class":278},[129,29516,4830],{"class":150},[129,29518,29519],{"class":731},"/api/posts/",[129,29521,1009],{"class":150},[129,29523,29524],{"class":278},"postId",[129,29526,2020],{"class":150},[129,29528,2825],{"class":278},[129,29530,29531],{"class":131,"line":16},[129,29532,187],{"emptyLinePlaceholder":186},[129,29534,29535],{"class":131,"line":190},[129,29536,29537],{"class":135},"// Multiple components with same key share data\n",[129,29539,29540],{"class":131,"line":212},[129,29541,29542],{"class":135},"// Component A\n",[129,29544,29545,29547,29549,29551,29553,29556,29558,29560,29562,29564,29566,29568,29570,29572,29574,29576,29578,29580,29582,29584,29586,29588],{"class":131,"line":234},[129,29546,1603],{"class":142},[129,29548,688],{"class":150},[129,29550,757],{"class":525},[129,29552,272],{"class":150},[129,29554,29555],{"class":278}," posts ",[129,29557,1014],{"class":150},[129,29559,160],{"class":150},[129,29561,2713],{"class":1771},[129,29563,29358],{"class":1683},[129,29565,2503],{"class":278},[129,29567,728],{"class":150},[129,29569,29365],{"class":731},[129,29571,728],{"class":150},[129,29573,990],{"class":150},[129,29575,688],{"class":150},[129,29577,4776],{"class":525},[129,29579,272],{"class":150},[129,29581,874],{"class":150},[129,29583,956],{"class":731},[129,29585,728],{"class":150},[129,29587,2852],{"class":150},[129,29589,2825],{"class":278},[129,29591,29592],{"class":131,"line":239},[129,29593,187],{"emptyLinePlaceholder":186},[129,29595,29596],{"class":131,"line":245},[129,29597,29598],{"class":135},"// Component B (gets same data, no duplicate request)\n",[129,29600,29601,29603,29605,29607,29609,29611,29613,29615,29617,29619,29621,29623,29625,29627,29629,29631,29633,29635,29637,29639,29641,29643],{"class":131,"line":303},[129,29602,1603],{"class":142},[129,29604,688],{"class":150},[129,29606,757],{"class":525},[129,29608,272],{"class":150},[129,29610,29555],{"class":278},[129,29612,1014],{"class":150},[129,29614,160],{"class":150},[129,29616,2713],{"class":1771},[129,29618,29358],{"class":1683},[129,29620,2503],{"class":278},[129,29622,728],{"class":150},[129,29624,29365],{"class":731},[129,29626,728],{"class":150},[129,29628,990],{"class":150},[129,29630,688],{"class":150},[129,29632,4776],{"class":525},[129,29634,272],{"class":150},[129,29636,874],{"class":150},[129,29638,956],{"class":731},[129,29640,728],{"class":150},[129,29642,2852],{"class":150},[129,29644,2825],{"class":278},[114,29646,29648],{"id":29647},"step-6-update-plugins","Step 6: Update Plugins",[103,29650,29651],{},"Nuxt 4 uses auto-imports for plugins by default:",[103,29653,29654],{},[9418,29655,29006],{},[119,29657,29659],{"className":121,"code":29658,"language":123,"meta":124,"style":124},"// plugins/my-plugin.ts\nexport default defineNuxtPlugin((nuxtApp) => {\n nuxtApp.provide(\"myPlugin\", myPlugin)\n})\n",[126,29660,29661,29666,29688,29714],{"__ignoreMap":124},[129,29662,29663],{"class":131,"line":132},[129,29664,29665],{"class":135},"// plugins/my-plugin.ts\n",[129,29667,29668,29670,29672,29675,29677,29679,29682,29684,29686],{"class":131,"line":139},[129,29669,12363],{"class":1771},[129,29671,29018],{"class":1771},[129,29673,29674],{"class":1683}," defineNuxtPlugin",[129,29676,2503],{"class":278},[129,29678,2503],{"class":150},[129,29680,29681],{"class":268},"nuxtApp",[129,29683,282],{"class":150},[129,29685,285],{"class":142},[129,29687,396],{"class":150},[129,29689,29690,29693,29695,29698,29700,29702,29705,29707,29709,29712],{"class":131,"line":16},[129,29691,29692],{"class":278}," nuxtApp",[129,29694,4163],{"class":150},[129,29696,29697],{"class":1683},"provide",[129,29699,2503],{"class":525},[129,29701,728],{"class":150},[129,29703,29704],{"class":731},"myPlugin",[129,29706,728],{"class":150},[129,29708,990],{"class":150},[129,29710,29711],{"class":278}," myPlugin",[129,29713,2825],{"class":525},[129,29715,29716,29718],{"class":131,"line":190},[129,29717,1014],{"class":150},[129,29719,2825],{"class":278},[103,29721,29722,29724],{},[9418,29723,29098],{}," (same, but better type inference)",[119,29726,29728],{"className":121,"code":29727,"language":123,"meta":124,"style":124},"// 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",[126,29729,29730,29734,29754,29776,29782,29786,29791],{"__ignoreMap":124},[129,29731,29732],{"class":131,"line":132},[129,29733,29665],{"class":135},[129,29735,29736,29738,29740,29742,29744,29746,29748,29750,29752],{"class":131,"line":139},[129,29737,12363],{"class":1771},[129,29739,29018],{"class":1771},[129,29741,29674],{"class":1683},[129,29743,2503],{"class":278},[129,29745,2503],{"class":150},[129,29747,29681],{"class":268},[129,29749,282],{"class":150},[129,29751,285],{"class":142},[129,29753,396],{"class":150},[129,29755,29756,29758,29760,29762,29764,29766,29768,29770,29772,29774],{"class":131,"line":16},[129,29757,29692],{"class":278},[129,29759,4163],{"class":150},[129,29761,29697],{"class":1683},[129,29763,2503],{"class":525},[129,29765,728],{"class":150},[129,29767,29704],{"class":731},[129,29769,728],{"class":150},[129,29771,990],{"class":150},[129,29773,29711],{"class":278},[129,29775,2825],{"class":525},[129,29777,29778,29780],{"class":131,"line":190},[129,29779,1014],{"class":150},[129,29781,2825],{"class":278},[129,29783,29784],{"class":131,"line":212},[129,29785,187],{"emptyLinePlaceholder":186},[129,29787,29788],{"class":131,"line":234},[129,29789,29790],{"class":135},"// Usage in components (auto-typed)\n",[129,29792,29793,29795,29797,29800,29802,29804,29807],{"class":131,"line":239},[129,29794,1603],{"class":142},[129,29796,688],{"class":150},[129,29798,29799],{"class":278}," $myPlugin ",[129,29801,1014],{"class":150},[129,29803,160],{"class":150},[129,29805,29806],{"class":1683}," useNuxtApp",[129,29808,2725],{"class":278},[114,29810,29812],{"id":29811},"step-7-update-server-routes","Step 7: Update Server Routes",[103,29814,29815],{},"Migrate server middleware to Nitro server routes:",[103,29817,29818],{},[9418,29819,29820],{},"Old (Nuxt 3 server middleware):",[119,29822,29824],{"className":121,"code":29823,"language":123,"meta":124,"style":124},"// server/middleware/auth.ts\nexport default defineEventHandler((event) => {\n // middleware logic\n})\n",[126,29825,29826,29831,29852,29857],{"__ignoreMap":124},[129,29827,29828],{"class":131,"line":132},[129,29829,29830],{"class":135},"// server/middleware/auth.ts\n",[129,29832,29833,29835,29837,29840,29842,29844,29846,29848,29850],{"class":131,"line":139},[129,29834,12363],{"class":1771},[129,29836,29018],{"class":1771},[129,29838,29839],{"class":1683}," defineEventHandler",[129,29841,2503],{"class":278},[129,29843,2503],{"class":150},[129,29845,5890],{"class":268},[129,29847,282],{"class":150},[129,29849,285],{"class":142},[129,29851,396],{"class":150},[129,29853,29854],{"class":131,"line":16},[129,29855,29856],{"class":135}," // middleware logic\n",[129,29858,29859,29861],{"class":131,"line":190},[129,29860,1014],{"class":150},[129,29862,2825],{"class":278},[103,29864,29865],{},[9418,29866,29867],{},"New (Nitro server routes - same syntax, better performance):",[119,29869,29871],{"className":121,"code":29870,"language":123,"meta":124,"style":124},"// server/api/auth.ts\nexport default defineEventHandler((event) => {\n // API route logic\n return { user: event.context.user }\n})\n",[126,29872,29873,29878,29898,29903,29927],{"__ignoreMap":124},[129,29874,29875],{"class":131,"line":132},[129,29876,29877],{"class":135},"// server/api/auth.ts\n",[129,29879,29880,29882,29884,29886,29888,29890,29892,29894,29896],{"class":131,"line":139},[129,29881,12363],{"class":1771},[129,29883,29018],{"class":1771},[129,29885,29839],{"class":1683},[129,29887,2503],{"class":278},[129,29889,2503],{"class":150},[129,29891,5890],{"class":268},[129,29893,282],{"class":150},[129,29895,285],{"class":142},[129,29897,396],{"class":150},[129,29899,29900],{"class":131,"line":16},[129,29901,29902],{"class":135}," // API route logic\n",[129,29904,29905,29907,29909,29911,29913,29916,29918,29921,29923,29925],{"class":131,"line":190},[129,29906,1772],{"class":1771},[129,29908,688],{"class":150},[129,29910,5678],{"class":525},[129,29912,272],{"class":150},[129,29914,29915],{"class":278}," event",[129,29917,4163],{"class":150},[129,29919,29920],{"class":278},"context",[129,29922,4163],{"class":150},[129,29924,4972],{"class":278},[129,29926,698],{"class":150},[129,29928,29929,29931],{"class":131,"line":212},[129,29930,1014],{"class":150},[129,29932,2825],{"class":278},[114,29934,29936],{"id":29935},"step-8-replace-vuex-with-pinia","Step 8: Replace Vuex with Pinia",[103,29938,29939],{},"If you're still using Vuex, migrate to Pinia:",[103,29941,29942],{},[9418,29943,29944],{},"Install Pinia:",[119,29946,29948],{"className":27367,"code":29947,"language":27369,"meta":124,"style":124},"npm install pinia @pinia/nuxt\n",[126,29949,29950],{"__ignoreMap":124},[129,29951,29952,29954,29956,29959],{"class":131,"line":132},[129,29953,28651],{"class":146},[129,29955,28654],{"class":731},[129,29957,29958],{"class":731}," pinia",[129,29960,29961],{"class":731}," @pinia/nuxt\n",[103,29963,29964],{},[9418,29965,29966],{},"Add to nuxt.config.ts:",[119,29968,29970],{"className":121,"code":29969,"language":123,"meta":124,"style":124},"export default defineNuxtConfig({\n modules: [\"@pinia/nuxt\"],\n})\n",[126,29971,29972,29984,30003],{"__ignoreMap":124},[129,29973,29974,29976,29978,29980,29982],{"class":131,"line":132},[129,29975,12363],{"class":1771},[129,29977,29018],{"class":1771},[129,29979,29021],{"class":1683},[129,29981,2503],{"class":278},[129,29983,2738],{"class":150},[129,29985,29986,29988,29990,29992,29994,29997,29999,30001],{"class":131,"line":139},[129,29987,29030],{"class":525},[129,29989,272],{"class":150},[129,29991,404],{"class":278},[129,29993,728],{"class":150},[129,29995,29996],{"class":731},"@pinia/nuxt",[129,29998,728],{"class":150},[129,30000,418],{"class":278},[129,30002,1335],{"class":150},[129,30004,30005,30007],{"class":131,"line":16},[129,30006,1014],{"class":150},[129,30008,2825],{"class":278},[103,30010,30011],{},[9418,30012,30013],{},"Migrate stores:",[119,30015,30017],{"className":121,"code":30016,"language":123,"meta":124,"style":124},"// 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",[126,30018,30019,30024,30051,30066,30078,30086,30095,30104,30113,30117,30121],{"__ignoreMap":124},[129,30020,30021],{"class":131,"line":132},[129,30022,30023],{"class":135},"// stores/counter.ts\n",[129,30025,30026,30028,30030,30033,30035,30038,30040,30042,30045,30047,30049],{"class":131,"line":139},[129,30027,12363],{"class":1771},[129,30029,12731],{"class":142},[129,30031,30032],{"class":278}," useCounterStore ",[129,30034,2710],{"class":150},[129,30036,30037],{"class":1683}," defineStore",[129,30039,2503],{"class":278},[129,30041,728],{"class":150},[129,30043,30044],{"class":731},"counter",[129,30046,728],{"class":150},[129,30048,990],{"class":150},[129,30050,396],{"class":150},[129,30052,30053,30056,30058,30060,30062,30064],{"class":131,"line":16},[129,30054,30055],{"class":1683}," state",[129,30057,272],{"class":150},[129,30059,2027],{"class":150},[129,30061,285],{"class":142},[129,30063,605],{"class":278},[129,30065,2738],{"class":150},[129,30067,30068,30071,30073,30076],{"class":131,"line":190},[129,30069,30070],{"class":525}," count",[129,30072,272],{"class":150},[129,30074,30075],{"class":2755}," 0",[129,30077,1335],{"class":150},[129,30079,30080,30082,30084],{"class":131,"line":212},[129,30081,2822],{"class":150},[129,30083,282],{"class":278},[129,30085,1335],{"class":150},[129,30087,30088,30091,30093],{"class":131,"line":234},[129,30089,30090],{"class":525}," actions",[129,30092,272],{"class":150},[129,30094,396],{"class":150},[129,30096,30097,30100,30102],{"class":131,"line":239},[129,30098,30099],{"class":525}," increment",[129,30101,6864],{"class":150},[129,30103,396],{"class":150},[129,30105,30106,30108,30110],{"class":131,"line":245},[129,30107,5946],{"class":150},[129,30109,2562],{"class":278},[129,30111,30112],{"class":150},"++\n",[129,30114,30115],{"class":131,"line":303},[129,30116,24848],{"class":150},[129,30118,30119],{"class":131,"line":308},[129,30120,10727],{"class":150},[129,30122,30123,30125],{"class":131,"line":332},[129,30124,1014],{"class":150},[129,30126,2825],{"class":278},[9456,30128],{},[99,30130,30132],{"id":30131},"breaking-changes-solutions","Breaking Changes & Solutions",[114,30134,30136],{"id":30135},"_1-stricter-typescript","1. Stricter TypeScript",[103,30138,30139],{},"Nuxt 4 enables stricter TypeScript by default.",[103,30141,30142,30145],{},[9418,30143,30144],{},"Issue:"," Type errors that were ignored before",[103,30147,30148,30151,30152,272],{},[9418,30149,30150],{},"Solution:"," Fix types or adjust ",[126,30153,30154],{},"tsconfig.json",[119,30156,30158],{"className":121,"code":30157,"language":123,"meta":124,"style":124},"// tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true\n }\n}\n",[126,30159,30160,30164,30168,30181,30195,30208,30212],{"__ignoreMap":124},[129,30161,30162],{"class":131,"line":132},[129,30163,11644],{"class":135},[129,30165,30166],{"class":131,"line":139},[129,30167,2738],{"class":150},[129,30169,30170,30172,30174,30176,30179],{"class":131,"line":16},[129,30171,3416],{"class":150},[129,30173,11655],{"class":731},[129,30175,728],{"class":150},[129,30177,30178],{"class":525},": ",[129,30180,2738],{"class":150},[129,30182,30183,30185,30187,30189,30191,30193],{"class":131,"line":190},[129,30184,10708],{"class":150},[129,30186,11770],{"class":525},[129,30188,728],{"class":150},[129,30190,272],{"class":150},[129,30192,175],{"class":5005},[129,30194,1335],{"class":150},[129,30196,30197,30199,30202,30204,30206],{"class":131,"line":212},[129,30198,10708],{"class":150},[129,30200,30201],{"class":525},"noImplicitAny",[129,30203,728],{"class":150},[129,30205,272],{"class":150},[129,30207,11933],{"class":5005},[129,30209,30210],{"class":131,"line":234},[129,30211,594],{"class":150},[129,30213,30214],{"class":131,"line":239},[129,30215,506],{"class":150},[114,30217,30219],{"id":30218},"_2-nested-routing-changes","2. Nested Routing Changes",[103,30221,30222],{},"Nuxt 4 has stricter nested routing behavior.",[103,30224,30225,30227],{},[9418,30226,30144],{}," Routes not working as expected",[103,30229,30230,30232],{},[9418,30231,30150],{}," Check file structure:",[119,30234,30237],{"className":30235,"code":30236,"language":29240},[29238],"pages/\n├── users/\n│ ├── index.vue → /users\n│ └── [id].vue → /users/:id\n",[126,30238,30236],{"__ignoreMap":124},[114,30240,30242],{"id":30241},"_3-module-api-changes","3. Module API Changes",[103,30244,30245],{},"Some modules changed their APIs.",[103,30247,30248],{},[9418,30249,30250],{},"Example - @nuxt/content v3:",[119,30252,30254],{"className":121,"code":30253,"language":123,"meta":124,"style":124},"// Old\nconst articles = await queryContent(\"articles\").find()\n\n// New (same API, better types)\nconst articles = await queryCollection(\"articles\").find()\n",[126,30255,30256,30261,30293,30297,30302],{"__ignoreMap":124},[129,30257,30258],{"class":131,"line":132},[129,30259,30260],{"class":135},"// Old\n",[129,30262,30263,30265,30268,30270,30272,30275,30277,30279,30282,30284,30286,30288,30291],{"class":131,"line":139},[129,30264,1603],{"class":142},[129,30266,30267],{"class":278}," articles ",[129,30269,2710],{"class":150},[129,30271,2713],{"class":1771},[129,30273,30274],{"class":1683}," queryContent",[129,30276,2503],{"class":278},[129,30278,728],{"class":150},[129,30280,30281],{"class":731},"articles",[129,30283,728],{"class":150},[129,30285,282],{"class":278},[129,30287,4163],{"class":150},[129,30289,30290],{"class":1683},"find",[129,30292,2725],{"class":278},[129,30294,30295],{"class":131,"line":16},[129,30296,187],{"emptyLinePlaceholder":186},[129,30298,30299],{"class":131,"line":190},[129,30300,30301],{"class":135},"// New (same API, better types)\n",[129,30303,30304,30306,30308,30310,30312,30315,30317,30319,30321,30323,30325,30327,30329],{"class":131,"line":212},[129,30305,1603],{"class":142},[129,30307,30267],{"class":278},[129,30309,2710],{"class":150},[129,30311,2713],{"class":1771},[129,30313,30314],{"class":1683}," queryCollection",[129,30316,2503],{"class":278},[129,30318,728],{"class":150},[129,30320,30281],{"class":731},[129,30322,728],{"class":150},[129,30324,282],{"class":278},[129,30326,4163],{"class":150},[129,30328,30290],{"class":1683},[129,30330,2725],{"class":278},[114,30332,30334],{"id":30333},"_4-deprecated-apis","4. Deprecated APIs",[103,30336,30337],{},[9418,30338,30339],{},"Removed:",[10306,30341,30342,30348,30354],{},[9415,30343,30344,30347],{},[126,30345,30346],{},"@nuxt/types"," (use built-in types)",[9415,30349,30350,30353],{},[126,30351,30352],{},"nuxt.config.js"," (use .ts only)",[9415,30355,30356],{},"Some legacy hooks",[103,30358,30359],{},[9418,30360,30361],{},"Check deprecated APIs:",[119,30363,30365],{"className":27367,"code":30364,"language":27369,"meta":124,"style":124},"npx nuxi analyze\n",[126,30366,30367],{"__ignoreMap":124},[129,30368,30369,30371,30373],{"class":131,"line":132},[129,30370,28631],{"class":146},[129,30372,28634],{"class":731},[129,30374,30375],{"class":731}," analyze\n",[9456,30377],{},[99,30379,30381],{"id":30380},"common-issues-troubleshooting","Common Issues & Troubleshooting",[114,30383,30385],{"id":30384},"issue-1-module-x-is-not-compatible-with-nuxt-4","Issue 1: \"Module X is not compatible with Nuxt 4\"",[103,30387,30388],{},[9418,30389,30150],{},[119,30391,30393],{"className":27367,"code":30392,"language":27369,"meta":124,"style":124},"# 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",[126,30394,30395,30400,30407,30411,30416,30425,30429,30434],{"__ignoreMap":124},[129,30396,30397],{"class":131,"line":132},[129,30398,30399],{"class":135},"# Check for updates\n",[129,30401,30402,30404],{"class":131,"line":139},[129,30403,28651],{"class":146},[129,30405,30406],{"class":731}," outdated\n",[129,30408,30409],{"class":131,"line":16},[129,30410,187],{"emptyLinePlaceholder":186},[129,30412,30413],{"class":131,"line":190},[129,30414,30415],{"class":135},"# Update specific module\n",[129,30417,30418,30420,30422],{"class":131,"line":212},[129,30419,28651],{"class":146},[129,30421,28654],{"class":731},[129,30423,30424],{"class":731}," @nuxt/content@latest\n",[129,30426,30427],{"class":131,"line":234},[129,30428,187],{"emptyLinePlaceholder":186},[129,30430,30431],{"class":131,"line":239},[129,30432,30433],{"class":135},"# Or find alternative\n",[129,30435,30436],{"class":131,"line":245},[129,30437,30438],{"class":135},"# Check Nuxt modules directory: https://nuxt.com/modules\n",[114,30440,30442],{"id":30441},"issue-2-typescript-errors-after-migration","Issue 2: TypeScript Errors After Migration",[103,30444,30445],{},[9418,30446,30150],{},[119,30448,30450],{"className":27367,"code":30449,"language":27369,"meta":124,"style":124},"# Regenerate types\nnpx nuxi prepare\n\n# Clear cache\nnpx nuxi cleanup\n\n# Check specific file\nnpx tsc --noEmit --pretty\n",[126,30451,30452,30457,30466,30470,30475,30484,30488,30493],{"__ignoreMap":124},[129,30453,30454],{"class":131,"line":132},[129,30455,30456],{"class":135},"# Regenerate types\n",[129,30458,30459,30461,30463],{"class":131,"line":139},[129,30460,28631],{"class":146},[129,30462,28634],{"class":731},[129,30464,30465],{"class":731}," prepare\n",[129,30467,30468],{"class":131,"line":16},[129,30469,187],{"emptyLinePlaceholder":186},[129,30471,30472],{"class":131,"line":190},[129,30473,30474],{"class":135},"# Clear cache\n",[129,30476,30477,30479,30481],{"class":131,"line":212},[129,30478,28631],{"class":146},[129,30480,28634],{"class":731},[129,30482,30483],{"class":731}," cleanup\n",[129,30485,30486],{"class":131,"line":234},[129,30487,187],{"emptyLinePlaceholder":186},[129,30489,30490],{"class":131,"line":239},[129,30491,30492],{"class":135},"# Check specific file\n",[129,30494,30495,30497,30500,30503],{"class":131,"line":245},[129,30496,28631],{"class":146},[129,30498,30499],{"class":731}," tsc",[129,30501,30502],{"class":731}," --noEmit",[129,30504,30505],{"class":731}," --pretty\n",[114,30507,30509],{"id":30508},"issue-3-build-fails-with-cannot-find-module","Issue 3: Build Fails with \"Cannot find module\"",[103,30511,30512],{},[9418,30513,30150],{},[119,30515,30517],{"className":27367,"code":30516,"language":27369,"meta":124,"style":124},"# Clear node_modules and reinstall\nrm -rf node_modules .nuxt\nnpm install\nnpx nuxi prepare\n",[126,30518,30519,30524,30538,30544],{"__ignoreMap":124},[129,30520,30521],{"class":131,"line":132},[129,30522,30523],{"class":135},"# Clear node_modules and reinstall\n",[129,30525,30526,30529,30532,30535],{"class":131,"line":139},[129,30527,30528],{"class":146},"rm",[129,30530,30531],{"class":731}," -rf",[129,30533,30534],{"class":731}," node_modules",[129,30536,30537],{"class":731}," .nuxt\n",[129,30539,30540,30542],{"class":131,"line":16},[129,30541,28651],{"class":146},[129,30543,28997],{"class":731},[129,30545,30546,30548,30550],{"class":131,"line":190},[129,30547,28631],{"class":146},[129,30549,28634],{"class":731},[129,30551,30465],{"class":731},[114,30553,30555],{"id":30554},"issue-4-hmr-not-working","Issue 4: HMR Not Working",[103,30557,30558],{},[9418,30559,30150],{},[119,30561,30563],{"className":121,"code":30562,"language":123,"meta":124,"style":124},"// nuxt.config.ts\nexport default defineNuxtConfig({\n vite: {\n server: {\n watch: {\n usePolling: true,\n },\n },\n },\n})\n",[126,30564,30565,30570,30582,30591,30600,30609,30620,30624,30628,30632],{"__ignoreMap":124},[129,30566,30567],{"class":131,"line":132},[129,30568,30569],{"class":135},"// nuxt.config.ts\n",[129,30571,30572,30574,30576,30578,30580],{"class":131,"line":139},[129,30573,12363],{"class":1771},[129,30575,29018],{"class":1771},[129,30577,29021],{"class":1683},[129,30579,2503],{"class":278},[129,30581,2738],{"class":150},[129,30583,30584,30587,30589],{"class":131,"line":16},[129,30585,30586],{"class":525}," vite",[129,30588,272],{"class":150},[129,30590,396],{"class":150},[129,30592,30593,30596,30598],{"class":131,"line":190},[129,30594,30595],{"class":525}," server",[129,30597,272],{"class":150},[129,30599,396],{"class":150},[129,30601,30602,30605,30607],{"class":131,"line":212},[129,30603,30604],{"class":525}," watch",[129,30606,272],{"class":150},[129,30608,396],{"class":150},[129,30610,30611,30614,30616,30618],{"class":131,"line":234},[129,30612,30613],{"class":525}," usePolling",[129,30615,272],{"class":150},[129,30617,175],{"class":5005},[129,30619,1335],{"class":150},[129,30621,30622],{"class":131,"line":239},[129,30623,26669],{"class":150},[129,30625,30626],{"class":131,"line":245},[129,30627,24848],{"class":150},[129,30629,30630],{"class":131,"line":303},[129,30631,10727],{"class":150},[129,30633,30634,30636],{"class":131,"line":308},[129,30635,1014],{"class":150},[129,30637,2825],{"class":278},[114,30639,30641],{"id":30640},"issue-5-server-routes-not-working","Issue 5: Server Routes Not Working",[103,30643,30644],{},[9418,30645,30150],{},[10306,30647,30648,30657,30660],{},[9415,30649,30650,30651,11103,30654],{},"Ensure files are in ",[126,30652,30653],{},"server/api/",[126,30655,30656],{},"server/routes/",[9415,30658,30659],{},"Check Nitro configuration",[9415,30661,30662],{},"Restart dev server",[9456,30664],{},[99,30666,30668],{"id":30667},"post-migration-checklist","Post-Migration Checklist",[103,30670,30671],{},"After completing the migration:",[114,30673,30675],{"id":30674},"_1-run-full-test-suite","✅ 1. Run Full Test Suite",[119,30677,30679],{"className":27367,"code":30678,"language":27369,"meta":124,"style":124},"npm run test\nnpm run test:e2e\n",[126,30680,30681,30689],{"__ignoreMap":124},[129,30682,30683,30685,30687],{"class":131,"line":132},[129,30684,28651],{"class":146},[129,30686,28781],{"class":731},[129,30688,28805],{"class":731},[129,30690,30691,30693,30695],{"class":131,"line":139},[129,30692,28651],{"class":146},[129,30694,28781],{"class":731},[129,30696,30697],{"class":731}," test:e2e\n",[114,30699,30701],{"id":30700},"_2-type-check","✅ 2. Type Check",[119,30703,30704],{"className":27367,"code":28772,"language":27369,"meta":124,"style":124},[126,30705,30706],{"__ignoreMap":124},[129,30707,30708,30710,30712],{"class":131,"line":132},[129,30709,28651],{"class":146},[129,30711,28781],{"class":731},[129,30713,28784],{"class":731},[114,30715,30717],{"id":30716},"_3-build-production","✅ 3. Build Production",[119,30719,30721],{"className":27367,"code":30720,"language":27369,"meta":124,"style":124},"npm run build\nnpm run preview\n",[126,30722,30723,30732],{"__ignoreMap":124},[129,30724,30725,30727,30729],{"class":131,"line":132},[129,30726,28651],{"class":146},[129,30728,28781],{"class":731},[129,30730,30731],{"class":731}," build\n",[129,30733,30734,30736,30738],{"class":131,"line":139},[129,30735,28651],{"class":146},[129,30737,28781],{"class":731},[129,30739,30740],{"class":731}," preview\n",[114,30742,30744],{"id":30743},"_4-performance-audit","✅ 4. Performance Audit",[119,30746,30748],{"className":27367,"code":30747,"language":27369,"meta":124,"style":124},"# Run Lighthouse\nnpx lighthouse http://localhost:3000\n",[126,30749,30750,30755],{"__ignoreMap":124},[129,30751,30752],{"class":131,"line":132},[129,30753,30754],{"class":135},"# Run Lighthouse\n",[129,30756,30757,30759,30762],{"class":131,"line":139},[129,30758,28631],{"class":146},[129,30760,30761],{"class":731}," lighthouse",[129,30763,30764],{"class":731}," http://localhost:3000\n",[114,30766,30768],{"id":30767},"_5-monitor-in-production","✅ 5. Monitor in Production",[10306,30770,30771,30774,30777],{},[9415,30772,30773],{},"Set up error tracking (Sentry, LogRocket)",[9415,30775,30776],{},"Monitor Core Web Vitals",[9415,30778,30779],{},"Check analytics for issues",[9456,30781],{},[99,30783,30785],{"id":30784},"migration-timeline","Migration Timeline",[103,30787,30788],{},[9418,30789,30790],{},"Recommended Schedule:",[10306,30792,30793,30799,30805],{},[9415,30794,30795,30798],{},[9418,30796,30797],{},"Week 1",": Pre-migration preparation (updates, backups, compatibility check)",[9415,30800,30801,30804],{},[9418,30802,30803],{},"Week 2",": Run codemod, fix breaking changes, update modules",[9415,30806,30807,30810],{},[9418,30808,30809],{},"Week 3",": Testing, performance optimization, deployment",[103,30812,30813,30816],{},[9418,30814,30815],{},"Don't wait until January 2026!"," Start your migration now to avoid last-minute issues.",[9456,30818],{},[99,30820,30822],{"id":30821},"performance-improvements-after-migration","Performance Improvements After Migration",[103,30824,30825],{},"Real-world results from migrating to Nuxt 4:",[30827,30828,30829,30848],"table",{},[30830,30831,30832],"thead",{},[30833,30834,30835,30839,30842,30845],"tr",{},[30836,30837,30838],"th",{},"Metric",[30836,30840,30841],{},"Nuxt 3",[30836,30843,30844],{},"Nuxt 4",[30836,30846,30847],{},"Improvement",[30849,30850,30851,30868,30884,30900,30916],"tbody",{},[30833,30852,30853,30857,30860,30863],{},[30854,30855,30856],"td",{},"Build Time",[30854,30858,30859],{},"45s",[30854,30861,30862],{},"32s",[30854,30864,30865],{},[9418,30866,30867],{},"29% faster",[30833,30869,30870,30873,30876,30879],{},[30854,30871,30872],{},"HMR Update",[30854,30874,30875],{},"800ms",[30854,30877,30878],{},"350ms",[30854,30880,30881],{},[9418,30882,30883],{},"56% faster",[30833,30885,30886,30889,30892,30895],{},[30854,30887,30888],{},"LCP",[30854,30890,30891],{},"2.1s",[30854,30893,30894],{},"1.6s",[30854,30896,30897],{},[9418,30898,30899],{},"24% faster",[30833,30901,30902,30905,30908,30911],{},[30854,30903,30904],{},"Bundle Size",[30854,30906,30907],{},"185KB",[30854,30909,30910],{},"162KB",[30854,30912,30913],{},[9418,30914,30915],{},"12% smaller",[30833,30917,30918,30921,30924,30927],{},[30854,30919,30920],{},"TTI",[30854,30922,30923],{},"3.2s",[30854,30925,30926],{},"2.4s",[30854,30928,30929],{},[9418,30930,30931],{},"25% faster",[9456,30933],{},[99,30935,30937],{"id":30936},"faq-nuxt-3-to-nuxt-4-migration","FAQ: Nuxt 3 to Nuxt 4 Migration",[114,30939,30941],{"id":30940},"when-is-nuxt-3-end-of-life","When is Nuxt 3 end of life?",[103,30943,30944,30947],{},[9418,30945,30946],{},"Nuxt 3 official support ends January 31, 2026."," After this date, there will be no security patches, bug fixes, or maintenance updates.",[114,30949,30951],{"id":30950},"how-long-does-migration-take","How long does migration take?",[103,30953,30954,30955,30958],{},"For most projects: ",[9418,30956,30957],{},"4-8 hours"," of active work, spread over 2-3 days for testing. Large enterprise applications may take 1-2 weeks.",[114,30960,30962],{"id":30961},"is-nuxt-4-backward-compatible","Is Nuxt 4 backward compatible?",[103,30964,30965,30968],{},[9418,30966,30967],{},"Mostly yes."," Nuxt 4 maintains compatibility with most Nuxt 3 APIs. The codemod tool handles most breaking changes automatically.",[114,30970,30972],{"id":30971},"what-if-my-module-isnt-nuxt-4-compatible","What if my module isn't Nuxt 4 compatible?",[103,30974,30975],{},"Check for:",[9412,30977,30978,30981,30984],{},[9415,30979,30980],{},"Module updates (many released Nuxt 4 versions)",[9415,30982,30983],{},"Alternative modules",[9415,30985,30986],{},"Native Nuxt 4 solutions (e.g., Nitro routes instead of middleware)",[114,30988,30990],{"id":30989},"can-i-rollback-if-migration-fails","Can I rollback if migration fails?",[103,30992,30993,30996],{},[9418,30994,30995],{},"Yes."," That's why we recommend creating a git branch first. You can always checkout your pre-migration code.",[114,30998,31000],{"id":30999},"should-new-projects-start-with-nuxt-4","Should new projects start with Nuxt 4?",[103,31002,31003,31006],{},[9418,31004,31005],{},"Absolutely."," Nuxt 4 is stable, production-ready, and the recommended version for all new projects in 2026.",[114,31008,31010],{"id":31009},"what-about-nuxt-5","What about Nuxt 5?",[103,31012,31013],{},"Nuxt 5 is planned for late 2026 with Nitro v3. Nuxt 4 provides a stable foundation with a clear upgrade path to Nuxt 5.",[9456,31015],{},[99,31017,31019],{"id":31018},"next-steps","Next Steps",[103,31021,31022],{},"Now that you've migrated to Nuxt 4:",[9412,31024,31025,31035,31045],{},[9415,31026,31027,31030,31031],{},[9418,31028,31029],{},"Optimize Performance",": Read our ",[7298,31032,31034],{"href":31033},"/blog/16-nuxt-4-ssr-performance-optimization","Nuxt 4 Performance Optimization Guide",[9415,31036,31037,31040,31041],{},[9418,31038,31039],{},"Explore New Features",": Check out ",[7298,31042,31044],{"href":31043},"/blog/24-nuxt-4-edge-computing-guide","Nuxt UI v4",[9415,31046,31047,31050,31051],{},[9418,31048,31049],{},"Deploy to Edge",": Learn about ",[7298,31052,31053],{"href":31043},"Edge Computing with Nuxt 4",[9456,31055],{},[99,31057,31059],{"id":31058},"need-help","Need Help?",[103,31061,31062,31063,4163],{},"Migration issues? Drop a comment below or reach out on Twitter ",[7298,31064,31067],{"href":31065,"rel":31066},"https://twitter.com/mubaidr",[10329],"@mubaidr",[103,31069,31070],{},[9418,31071,31072],{},"Resources:",[10306,31074,31075,31082,31089,31096],{},[9415,31076,31077],{},[7298,31078,31081],{"href":31079,"rel":31080},"https://nuxt.com/docs/getting-started/upgrade",[10329],"Official Nuxt 4 Migration Guide",[9415,31083,31084],{},[7298,31085,31088],{"href":31086,"rel":31087},"https://nuxt.com/blog/v4",[10329],"Nuxt 4 Release Notes",[9415,31090,31091],{},[7298,31092,31095],{"href":31093,"rel":31094},"https://codemod.com/registry/nuxt-4-migration-recipe",[10329],"Codemod Tool",[9415,31097,31098],{},[7298,31099,31102],{"href":31100,"rel":31101},"https://discord.nuxt.com",[10329],"Nuxt Discord",[9456,31104],{},[103,31106,31107,31110],{},[9418,31108,31109],{},"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!",[9504,31112,31113],{},"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":124,"searchDepth":139,"depth":139,"links":31115},[31116,31117,31118,31121,31128,31138,31144,31151,31158,31159,31160,31169,31170],{"id":28423,"depth":139,"text":28418},{"id":28464,"depth":139,"text":28465},{"id":28505,"depth":139,"text":28506,"children":31119},[31120],{"id":28509,"depth":16,"text":28510},{"id":28605,"depth":139,"text":28606,"children":31122},[31123,31124,31125,31126,31127],{"id":28612,"depth":16,"text":28613},{"id":28697,"depth":16,"text":28698},{"id":28765,"depth":16,"text":28766},{"id":28787,"depth":16,"text":28788},{"id":28808,"depth":16,"text":28809},{"id":28836,"depth":139,"text":28837,"children":31129},[31130,31131,31132,31133,31134,31135,31136,31137],{"id":28840,"depth":16,"text":28841},{"id":28931,"depth":16,"text":28932},{"id":29000,"depth":16,"text":29001},{"id":29221,"depth":16,"text":29222},{"id":29324,"depth":16,"text":29325},{"id":29647,"depth":16,"text":29648},{"id":29811,"depth":16,"text":29812},{"id":29935,"depth":16,"text":29936},{"id":30131,"depth":139,"text":30132,"children":31139},[31140,31141,31142,31143],{"id":30135,"depth":16,"text":30136},{"id":30218,"depth":16,"text":30219},{"id":30241,"depth":16,"text":30242},{"id":30333,"depth":16,"text":30334},{"id":30380,"depth":139,"text":30381,"children":31145},[31146,31147,31148,31149,31150],{"id":30384,"depth":16,"text":30385},{"id":30441,"depth":16,"text":30442},{"id":30508,"depth":16,"text":30509},{"id":30554,"depth":16,"text":30555},{"id":30640,"depth":16,"text":30641},{"id":30667,"depth":139,"text":30668,"children":31152},[31153,31154,31155,31156,31157],{"id":30674,"depth":16,"text":30675},{"id":30700,"depth":16,"text":30701},{"id":30716,"depth":16,"text":30717},{"id":30743,"depth":16,"text":30744},{"id":30767,"depth":16,"text":30768},{"id":30784,"depth":139,"text":30785},{"id":30821,"depth":139,"text":30822},{"id":30936,"depth":139,"text":30937,"children":31161},[31162,31163,31164,31165,31166,31167,31168],{"id":30940,"depth":16,"text":30941},{"id":30950,"depth":16,"text":30951},{"id":30961,"depth":16,"text":30962},{"id":30971,"depth":16,"text":30972},{"id":30989,"depth":16,"text":30990},{"id":30999,"depth":16,"text":31000},{"id":31009,"depth":16,"text":31010},{"id":31018,"depth":139,"text":31019},{"id":31058,"depth":139,"text":31059},"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":31174,"keywords":31175},"15 min read",[31176,31177,31178,31179,31180,31181,31182,31183,31184,31185],"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":28418,"description":31172},"Modern Development","Exploring cutting-edge development practices and tools",{"src":31191,"mime":9550,"alt":31192,"width":9552,"height":9553},"/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",[31195,31196,31197,9556,31198],"Nuxt","Vue","Migration","Web Development","s1UGLxrbneRBuHSmwjworg3f6K2Y8ZzD_eJLKdzGve8",{"id":24063,"title":24064,"abstract":9540,"author":9564,"authorUrl":9540,"body":31201,"date":27811,"dateUpdated":27811,"description":27812,"excerpt":9540,"extension":9541,"featured":186,"headline":9540,"image":9540,"meta":34568,"navigation":186,"ogImage":9540,"path":27815,"seo":34569,"series":9467,"seriesDescription":27817,"seriesOrder":16,"socialImage":34570,"stem":27821,"tags":34571,"__hash__":27825},{"type":96,"value":31202,"toc":34531},[31203,31205,31207,31209,31211,31229,31231,31233,31235,31259,31261,31279,31281,31283,31285,31599,31601,31927,31929,32343,32345,32607,32609,32611,32831,32833,33023,33025,33143,33145,33147,33349,33351,33655,33657,33921,33923,33925,33979,33981,34189,34191,34195,34263,34265,34267,34285,34287,34301,34303,34317,34319,34491,34493,34495,34517,34519,34521,34523,34525,34529],[99,31204,24064],{"id":24069},[103,31206,24072],{},[99,31208,24076],{"id":24075},[103,31210,24079],{},[10306,31212,31213,31217,31221,31225],{},[9415,31214,31215,24087],{},[9418,31216,24086],{},[9415,31218,31219,24092],{},[9418,31220,15531],{},[9415,31222,31223,24098],{},[9418,31224,24097],{},[9415,31226,31227,24104],{},[9418,31228,24103],{},[103,31230,24107],{},[99,31232,24111],{"id":24110},[114,31234,24115],{"id":24114},[119,31236,31237],{"className":121,"code":24118,"language":123,"meta":124,"style":124},[126,31238,31239,31243,31247,31251,31255],{"__ignoreMap":124},[129,31240,31241],{"class":131,"line":132},[129,31242,24125],{"class":135},[129,31244,31245],{"class":131,"line":139},[129,31246,24130],{"class":135},[129,31248,31249],{"class":131,"line":16},[129,31250,24135],{"class":135},[129,31252,31253],{"class":131,"line":190},[129,31254,24140],{"class":135},[129,31256,31257],{"class":131,"line":212},[129,31258,24145],{"class":135},[114,31260,24149],{"id":24148},[9412,31262,31263,31267,31271,31275],{},[9415,31264,31265,24157],{},[9418,31266,24156],{},[9415,31268,31269,24163],{},[9418,31270,24162],{},[9415,31272,31273,24169],{},[9418,31274,24168],{},[9415,31276,31277,24175],{},[9418,31278,24174],{},[99,31280,24179],{"id":24178},[114,31282,24183],{"id":24182},[103,31284,24186],{},[119,31286,31287],{"className":121,"code":24189,"language":123,"meta":124,"style":124},[126,31288,31289,31293,31323,31345,31363,31367,31391,31423,31455,31481,31513,31519,31523,31527,31541,31555,31559,31563,31581],{"__ignoreMap":124},[129,31290,31291],{"class":131,"line":132},[129,31292,24196],{"class":135},[129,31294,31295,31297,31299,31301,31303,31305,31307,31309,31311,31313,31315,31317,31319,31321],{"class":131,"line":139},[129,31296,12675],{"class":1771},[129,31298,688],{"class":150},[129,31300,24205],{"class":278},[129,31302,990],{"class":150},[129,31304,24210],{"class":278},[129,31306,990],{"class":150},[129,31308,24215],{"class":278},[129,31310,990],{"class":150},[129,31312,24220],{"class":278},[129,31314,2852],{"class":150},[129,31316,12695],{"class":1771},[129,31318,874],{"class":150},[129,31320,24229],{"class":731},[129,31322,908],{"class":150},[129,31324,31325,31327,31329,31331,31333,31335,31337,31339,31341,31343],{"class":131,"line":16},[129,31326,12675],{"class":1771},[129,31328,688],{"class":150},[129,31330,24240],{"class":278},[129,31332,990],{"class":150},[129,31334,24245],{"class":278},[129,31336,2852],{"class":150},[129,31338,12695],{"class":1771},[129,31340,874],{"class":150},[129,31342,24254],{"class":731},[129,31344,908],{"class":150},[129,31346,31347,31349,31351,31353,31355,31357,31359,31361],{"class":131,"line":190},[129,31348,12675],{"class":1771},[129,31350,688],{"class":150},[129,31352,13811],{"class":278},[129,31354,2852],{"class":150},[129,31356,12695],{"class":1771},[129,31358,874],{"class":150},[129,31360,13820],{"class":731},[129,31362,908],{"class":150},[129,31364,31365],{"class":131,"line":212},[129,31366,187],{"emptyLinePlaceholder":186},[129,31368,31369,31371,31373,31375,31377,31379,31381,31383,31385,31387,31389],{"class":131,"line":234},[129,31370,12363],{"class":1771},[129,31372,12731],{"class":142},[129,31374,9239],{"class":278},[129,31376,2710],{"class":150},[129,31378,24205],{"class":1683},[129,31380,2503],{"class":278},[129,31382,728],{"class":150},[129,31384,947],{"class":731},[129,31386,728],{"class":150},[129,31388,990],{"class":150},[129,31390,396],{"class":150},[129,31392,31393,31395,31397,31399,31401,31403,31405,31407,31409,31411,31413,31415,31417,31419,31421],{"class":131,"line":239},[129,31394,526],{"class":525},[129,31396,272],{"class":150},[129,31398,24220],{"class":1683},[129,31400,2503],{"class":278},[129,31402,728],{"class":150},[129,31404,3649],{"class":731},[129,31406,728],{"class":150},[129,31408,282],{"class":278},[129,31410,4163],{"class":150},[129,31412,24325],{"class":1683},[129,31414,6864],{"class":278},[129,31416,4163],{"class":150},[129,31418,24332],{"class":1683},[129,31420,6864],{"class":278},[129,31422,1335],{"class":150},[129,31424,31425,31427,31429,31431,31433,31435,31437,31439,31441,31443,31445,31447,31449,31451,31453],{"class":131,"line":245},[129,31426,1897],{"class":525},[129,31428,272],{"class":150},[129,31430,24210],{"class":1683},[129,31432,2503],{"class":278},[129,31434,728],{"class":150},[129,31436,1440],{"class":731},[129,31438,728],{"class":150},[129,31440,282],{"class":278},[129,31442,4163],{"class":150},[129,31444,24359],{"class":1683},[129,31446,6864],{"class":278},[129,31448,4163],{"class":150},[129,31450,24366],{"class":1683},[129,31452,6864],{"class":278},[129,31454,1335],{"class":150},[129,31456,31457,31459,31461,31463,31465,31467,31469,31471,31473,31475,31477,31479],{"class":131,"line":303},[129,31458,1888],{"class":525},[129,31460,272],{"class":150},[129,31462,24210],{"class":1683},[129,31464,2503],{"class":278},[129,31466,728],{"class":150},[129,31468,1940],{"class":731},[129,31470,728],{"class":150},[129,31472,282],{"class":278},[129,31474,4163],{"class":150},[129,31476,24359],{"class":1683},[129,31478,6864],{"class":278},[129,31480,1335],{"class":150},[129,31482,31483,31485,31487,31489,31491,31493,31495,31497,31499,31501,31503,31505,31507,31509,31511],{"class":131,"line":308},[129,31484,5054],{"class":525},[129,31486,272],{"class":150},[129,31488,24215],{"class":1683},[129,31490,2503],{"class":278},[129,31492,728],{"class":150},[129,31494,24411],{"class":731},[129,31496,728],{"class":150},[129,31498,282],{"class":278},[129,31500,4163],{"class":150},[129,31502,24420],{"class":1683},[129,31504,6864],{"class":278},[129,31506,4163],{"class":150},[129,31508,24359],{"class":1683},[129,31510,6864],{"class":278},[129,31512,1335],{"class":150},[129,31514,31515,31517],{"class":131,"line":332},[129,31516,1014],{"class":150},[129,31518,2825],{"class":278},[129,31520,31521],{"class":131,"line":534},[129,31522,187],{"emptyLinePlaceholder":186},[129,31524,31525],{"class":131,"line":29},[129,31526,24445],{"class":135},[129,31528,31529,31531,31533,31535,31537,31539],{"class":131,"line":554},[129,31530,12363],{"class":1771},[129,31532,12731],{"class":142},[129,31534,24454],{"class":278},[129,31536,2710],{"class":150},[129,31538,24240],{"class":1683},[129,31540,24461],{"class":278},[129,31542,31543,31545,31547,31549,31551,31553],{"class":131,"line":564},[129,31544,12363],{"class":1771},[129,31546,12731],{"class":142},[129,31548,24470],{"class":278},[129,31550,2710],{"class":150},[129,31552,24245],{"class":1683},[129,31554,24461],{"class":278},[129,31556,31557],{"class":131,"line":574},[129,31558,187],{"emptyLinePlaceholder":186},[129,31560,31561],{"class":131,"line":585},[129,31562,24485],{"class":135},[129,31564,31565,31567,31569,31571,31573,31575,31577,31579],{"class":131,"line":591},[129,31566,12363],{"class":1771},[129,31568,24492],{"class":142},[129,31570,518],{"class":146},[129,31572,160],{"class":150},[129,31574,24499],{"class":150},[129,31576,7825],{"class":278},[129,31578,4163],{"class":150},[129,31580,24506],{"class":278},[129,31582,31583,31585,31587,31589,31591,31593,31595,31597],{"class":131,"line":597},[129,31584,12363],{"class":1771},[129,31586,24492],{"class":142},[129,31588,24515],{"class":146},[129,31590,160],{"class":150},[129,31592,24499],{"class":150},[129,31594,7825],{"class":278},[129,31596,4163],{"class":150},[129,31598,24526],{"class":278},[114,31600,24530],{"id":24529},[119,31602,31603],{"className":121,"code":24533,"language":123,"meta":124,"style":124},[126,31604,31605,31609,31627,31645,31667,31671,31685,31689,31693,31739,31767,31771,31775,31813,31817,31831,31847,31855,31875,31889,31893,31899,31905,31909,31913],{"__ignoreMap":124},[129,31606,31607],{"class":131,"line":132},[129,31608,24540],{"class":135},[129,31610,31611,31613,31615,31617,31619,31621,31623,31625],{"class":131,"line":139},[129,31612,12675],{"class":1771},[129,31614,688],{"class":150},[129,31616,24549],{"class":278},[129,31618,2852],{"class":150},[129,31620,12695],{"class":1771},[129,31622,874],{"class":150},[129,31624,24558],{"class":731},[129,31626,908],{"class":150},[129,31628,31629,31631,31633,31635,31637,31639,31641,31643],{"class":131,"line":16},[129,31630,12675],{"class":1771},[129,31632,688],{"class":150},[129,31634,24569],{"class":278},[129,31636,2852],{"class":150},[129,31638,12695],{"class":1771},[129,31640,874],{"class":150},[129,31642,24578],{"class":731},[129,31644,908],{"class":150},[129,31646,31647,31649,31651,31653,31655,31657,31659,31661,31663,31665],{"class":131,"line":190},[129,31648,12675],{"class":1771},[129,31650,688],{"class":150},[129,31652,24589],{"class":278},[129,31654,990],{"class":150},[129,31656,24594],{"class":278},[129,31658,2852],{"class":150},[129,31660,12695],{"class":1771},[129,31662,874],{"class":150},[129,31664,24603],{"class":731},[129,31666,908],{"class":150},[129,31668,31669],{"class":131,"line":212},[129,31670,187],{"emptyLinePlaceholder":186},[129,31672,31673,31675,31677,31679,31681,31683],{"class":131,"line":234},[129,31674,1603],{"class":142},[129,31676,24616],{"class":278},[129,31678,2710],{"class":150},[129,31680,4822],{"class":150},[129,31682,24549],{"class":1683},[129,31684,2725],{"class":278},[129,31686,31687],{"class":131,"line":239},[129,31688,187],{"emptyLinePlaceholder":186},[129,31690,31691],{"class":131,"line":245},[129,31692,24633],{"class":135},[129,31694,31695,31697,31699,31701,31703,31705,31707,31709,31711,31713,31715,31717,31719,31721,31723,31725,31727,31729,31731,31733,31735,31737],{"class":131,"line":303},[129,31696,24638],{"class":278},[129,31698,4163],{"class":150},[129,31700,9351],{"class":1683},[129,31702,2503],{"class":278},[129,31704,728],{"class":150},[129,31706,7771],{"class":731},[129,31708,728],{"class":150},[129,31710,990],{"class":150},[129,31712,24569],{"class":1683},[129,31714,2503],{"class":278},[129,31716,728],{"class":150},[129,31718,10154],{"class":731},[129,31720,728],{"class":150},[129,31722,990],{"class":150},[129,31724,24667],{"class":278},[129,31726,990],{"class":150},[129,31728,15158],{"class":142},[129,31730,605],{"class":150},[129,31732,24676],{"class":268},[129,31734,282],{"class":150},[129,31736,285],{"class":142},[129,31738,396],{"class":150},[129,31740,31741,31743,31745,31747,31749,31751,31753,31755,31757,31759,31761,31763,31765],{"class":131,"line":308},[129,31742,6819],{"class":142},[129,31744,757],{"class":278},[129,31746,160],{"class":150},[129,31748,7316],{"class":278},[129,31750,4163],{"class":150},[129,31752,14017],{"class":278},[129,31754,4163],{"class":150},[129,31756,24701],{"class":1683},[129,31758,2503],{"class":525},[129,31760,728],{"class":150},[129,31762,10154],{"class":731},[129,31764,728],{"class":150},[129,31766,2825],{"class":525},[129,31768,31769],{"class":131,"line":332},[129,31770,24716],{"class":135},[129,31772,31773],{"class":131,"line":534},[129,31774,187],{"emptyLinePlaceholder":186},[129,31776,31777,31779,31781,31783,31785,31787,31789,31791,31793,31795,31797,31799,31801,31803,31805,31807,31809,31811],{"class":131,"line":29},[129,31778,6819],{"class":142},[129,31780,5678],{"class":278},[129,31782,160],{"class":150},[129,31784,2713],{"class":1771},[129,31786,24733],{"class":278},[129,31788,4163],{"class":150},[129,31790,24738],{"class":1683},[129,31792,2503],{"class":525},[129,31794,947],{"class":278},[129,31796,282],{"class":525},[129,31798,4163],{"class":150},[129,31800,24749],{"class":1683},[129,31802,2503],{"class":525},[129,31804,608],{"class":278},[129,31806,282],{"class":525},[129,31808,4163],{"class":150},[129,31810,24760],{"class":1683},[129,31812,2725],{"class":525},[129,31814,31815],{"class":131,"line":554},[129,31816,187],{"emptyLinePlaceholder":186},[129,31818,31819,31821,31823,31825,31827,31829],{"class":131,"line":564},[129,31820,1772],{"class":1771},[129,31822,7316],{"class":278},[129,31824,4163],{"class":150},[129,31826,10154],{"class":1683},[129,31828,2503],{"class":525},[129,31830,2738],{"class":150},[129,31832,31833,31835,31837,31839,31841,31843,31845],{"class":131,"line":574},[129,31834,24785],{"class":525},[129,31836,272],{"class":150},[129,31838,5678],{"class":278},[129,31840,425],{"class":525},[129,31842,14225],{"class":2755},[129,31844,418],{"class":525},[129,31846,1335],{"class":150},[129,31848,31849,31851,31853],{"class":131,"line":585},[129,31850,24802],{"class":525},[129,31852,272],{"class":150},[129,31854,396],{"class":150},[129,31856,31857,31859,31861,31863,31865,31867,31869,31871,31873],{"class":131,"line":591},[129,31858,24811],{"class":525},[129,31860,272],{"class":150},[129,31862,4822],{"class":150},[129,31864,5514],{"class":1683},[129,31866,6864],{"class":525},[129,31868,4163],{"class":150},[129,31870,24824],{"class":1683},[129,31872,6864],{"class":525},[129,31874,1335],{"class":150},[129,31876,31877,31879,31881,31883,31885,31887],{"class":131,"line":597},[129,31878,24833],{"class":525},[129,31880,272],{"class":150},[129,31882,874],{"class":150},[129,31884,922],{"class":731},[129,31886,728],{"class":150},[129,31888,1335],{"class":150},[129,31890,31891],{"class":131,"line":622},[129,31892,24848],{"class":150},[129,31894,31895,31897],{"class":131,"line":627},[129,31896,2822],{"class":150},[129,31898,2825],{"class":525},[129,31900,31901,31903],{"class":131,"line":632},[129,31902,1014],{"class":150},[129,31904,2825],{"class":278},[129,31906,31907],{"class":131,"line":651},[129,31908,187],{"emptyLinePlaceholder":186},[129,31910,31911],{"class":131,"line":657},[129,31912,24869],{"class":135},[129,31914,31915,31917,31919,31921,31923,31925],{"class":131,"line":662},[129,31916,12363],{"class":1771},[129,31918,24492],{"class":142},[129,31920,24878],{"class":146},[129,31922,160],{"class":150},[129,31924,24499],{"class":150},[129,31926,24885],{"class":278},[114,31928,24889],{"id":24888},[119,31930,31931],{"className":121,"code":24892,"language":123,"meta":124,"style":124},[126,31932,31933,31937,31957,31977,31981,31985,31997,32001,32041,32071,32075,32093,32119,32123,32127,32139,32143,32147,32151,32163,32195,32237,32255,32277,32291,32307,32331,32339],{"__ignoreMap":124},[129,31934,31935],{"class":131,"line":132},[129,31936,24899],{"class":135},[129,31938,31939,31941,31943,31945,31947,31949,31951,31953,31955],{"class":131,"line":139},[129,31940,12675],{"class":1771},[129,31942,24492],{"class":1771},[129,31944,688],{"class":150},[129,31946,24878],{"class":278},[129,31948,2852],{"class":150},[129,31950,12695],{"class":1771},[129,31952,874],{"class":150},[129,31954,24918],{"class":731},[129,31956,908],{"class":150},[129,31958,31959,31961,31963,31965,31967,31969,31971,31973,31975],{"class":131,"line":16},[129,31960,12675],{"class":1771},[129,31962,24492],{"class":1771},[129,31964,688],{"class":150},[129,31966,24931],{"class":278},[129,31968,2852],{"class":150},[129,31970,12695],{"class":1771},[129,31972,874],{"class":150},[129,31974,24603],{"class":731},[129,31976,908],{"class":150},[129,31978,31979],{"class":131,"line":190},[129,31980,187],{"emptyLinePlaceholder":186},[129,31982,31983],{"class":131,"line":212},[129,31984,24950],{"class":135},[129,31986,31987,31989,31991,31993,31995],{"class":131,"line":234},[129,31988,143],{"class":142},[129,31990,24957],{"class":146},[129,31992,160],{"class":150},[129,31994,24499],{"class":150},[129,31996,24964],{"class":278},[129,31998,31999],{"class":131,"line":239},[129,32000,187],{"emptyLinePlaceholder":186},[129,32002,32003,32005,32007,32009,32011,32013,32015,32017,32019,32021,32023,32025,32027,32029,32031,32033,32035,32037,32039],{"class":131,"line":245},[129,32004,10066],{"class":142},[129,32006,2678],{"class":142},[129,32008,9246],{"class":1683},[129,32010,151],{"class":150},[129,32012,154],{"class":146},[129,32014,5887],{"class":150},[129,32016,24985],{"class":268},[129,32018,272],{"class":150},[129,32020,169],{"class":146},[129,32022,990],{"class":150},[129,32024,8393],{"class":268},[129,32026,1583],{"class":150},[129,32028,24998],{"class":146},[129,32030,1742],{"class":150},[129,32032,2587],{"class":146},[129,32034,151],{"class":150},[129,32036,154],{"class":146},[129,32038,157],{"class":150},[129,32040,396],{"class":150},[129,32042,32043,32045,32047,32049,32051,32053,32055,32057,32059,32061,32063,32065,32067,32069],{"class":131,"line":303},[129,32044,6819],{"class":142},[129,32046,8545],{"class":278},[129,32048,160],{"class":150},[129,32050,2713],{"class":1771},[129,32052,10128],{"class":1683},[129,32054,2503],{"class":525},[129,32056,4830],{"class":150},[129,32058,1006],{"class":731},[129,32060,1009],{"class":150},[129,32062,24985],{"class":278},[129,32064,2020],{"class":150},[129,32066,990],{"class":150},[129,32068,8393],{"class":278},[129,32070,2825],{"class":525},[129,32072,32073],{"class":131,"line":308},[129,32074,187],{"emptyLinePlaceholder":186},[129,32076,32077,32079,32081,32083,32085,32087,32089,32091],{"class":131,"line":332},[129,32078,12795],{"class":1771},[129,32080,605],{"class":525},[129,32082,4796],{"class":150},[129,32084,25055],{"class":278},[129,32086,4163],{"class":150},[129,32088,25060],{"class":278},[129,32090,3517],{"class":525},[129,32092,2738],{"class":150},[129,32094,32095,32097,32099,32101,32103,32105,32107,32109,32111,32113,32115,32117],{"class":131,"line":534},[129,32096,25069],{"class":1771},[129,32098,4822],{"class":150},[129,32100,4825],{"class":1683},[129,32102,2503],{"class":525},[129,32104,4830],{"class":150},[129,32106,25080],{"class":731},[129,32108,1009],{"class":150},[129,32110,25055],{"class":278},[129,32112,4163],{"class":150},[129,32114,12820],{"class":278},[129,32116,2020],{"class":150},[129,32118,2825],{"class":525},[129,32120,32121],{"class":131,"line":29},[129,32122,594],{"class":150},[129,32124,32125],{"class":131,"line":554},[129,32126,187],{"emptyLinePlaceholder":186},[129,32128,32129,32131,32133,32135,32137],{"class":131,"line":564},[129,32130,1772],{"class":1771},[129,32132,8545],{"class":278},[129,32134,4163],{"class":150},[129,32136,10154],{"class":1683},[129,32138,2725],{"class":525},[129,32140,32141],{"class":131,"line":574},[129,32142,506],{"class":150},[129,32144,32145],{"class":131,"line":585},[129,32146,187],{"emptyLinePlaceholder":186},[129,32148,32149],{"class":131,"line":591},[129,32150,25125],{"class":135},[129,32152,32153,32155,32157,32159,32161],{"class":131,"line":597},[129,32154,12363],{"class":1771},[129,32156,12731],{"class":142},[129,32158,25134],{"class":278},[129,32160,2710],{"class":150},[129,32162,396],{"class":150},[129,32164,32165,32167,32169,32171,32173,32175,32177,32179,32181,32183,32185,32187,32189,32191,32193],{"class":131,"line":622},[129,32166,25143],{"class":1683},[129,32168,272],{"class":150},[129,32170,2027],{"class":150},[129,32172,285],{"class":142},[129,32174,9246],{"class":1683},[129,32176,151],{"class":150},[129,32178,25156],{"class":146},[129,32180,279],{"class":278},[129,32182,157],{"class":150},[129,32184,2503],{"class":278},[129,32186,728],{"class":150},[129,32188,25167],{"class":731},[129,32190,728],{"class":150},[129,32192,282],{"class":278},[129,32194,1335],{"class":150},[129,32196,32197,32199,32201,32203,32205,32207,32209,32211,32213,32215,32217,32219,32221,32223,32225,32227,32229,32231,32233,32235],{"class":131,"line":627},[129,32198,25178],{"class":1683},[129,32200,272],{"class":150},[129,32202,605],{"class":150},[129,32204,3649],{"class":268},[129,32206,272],{"class":150},[129,32208,169],{"class":146},[129,32210,282],{"class":150},[129,32212,285],{"class":142},[129,32214,9246],{"class":1683},[129,32216,151],{"class":150},[129,32218,25156],{"class":146},[129,32220,157],{"class":150},[129,32222,2503],{"class":278},[129,32224,4830],{"class":150},[129,32226,10135],{"class":731},[129,32228,1009],{"class":150},[129,32230,3649],{"class":278},[129,32232,2020],{"class":150},[129,32234,282],{"class":278},[129,32236,1335],{"class":150},[129,32238,32239,32241,32243,32245,32247,32249,32251,32253],{"class":131,"line":632},[129,32240,5267],{"class":1683},[129,32242,272],{"class":150},[129,32244,605],{"class":150},[129,32246,608],{"class":268},[129,32248,272],{"class":150},[129,32250,24515],{"class":146},[129,32252,282],{"class":150},[129,32254,25235],{"class":142},[129,32256,32257,32259,32261,32263,32265,32267,32269,32271,32273,32275],{"class":131,"line":651},[129,32258,25240],{"class":1683},[129,32260,151],{"class":150},[129,32262,25156],{"class":146},[129,32264,157],{"class":150},[129,32266,2503],{"class":278},[129,32268,728],{"class":150},[129,32270,25167],{"class":731},[129,32272,728],{"class":150},[129,32274,990],{"class":150},[129,32276,396],{"class":150},[129,32278,32279,32281,32283,32285,32287,32289],{"class":131,"line":657},[129,32280,25263],{"class":525},[129,32282,272],{"class":150},[129,32284,874],{"class":150},[129,32286,887],{"class":731},[129,32288,728],{"class":150},[129,32290,1335],{"class":150},[129,32292,32293,32295,32297,32299,32301,32303,32305],{"class":131,"line":662},[129,32294,7860],{"class":525},[129,32296,272],{"class":150},[129,32298,25282],{"class":278},[129,32300,4163],{"class":150},[129,32302,25287],{"class":1683},[129,32304,25290],{"class":278},[129,32306,1335],{"class":150},[129,32308,32309,32311,32313,32315,32317,32319,32321,32323,32325,32327,32329],{"class":131,"line":668},[129,32310,25297],{"class":525},[129,32312,272],{"class":150},[129,32314,688],{"class":150},[129,32316,874],{"class":150},[129,32318,25306],{"class":525},[129,32320,728],{"class":150},[129,32322,272],{"class":150},[129,32324,874],{"class":150},[129,32326,25315],{"class":731},[129,32328,728],{"class":150},[129,32330,2769],{"class":150},[129,32332,32333,32335,32337],{"class":131,"line":701},[129,32334,12926],{"class":150},[129,32336,282],{"class":278},[129,32338,1335],{"class":150},[129,32340,32341],{"class":131,"line":741},[129,32342,506],{"class":150},[114,32344,25335],{"id":25334},[119,32346,32347],{"className":121,"code":25338,"language":123,"meta":124,"style":124},[126,32348,32349,32353,32369,32387,32407,32411,32415,32453,32463,32467,32471,32475,32499,32507,32515,32533,32541,32545,32549,32561,32589,32593,32599],{"__ignoreMap":124},[129,32350,32351],{"class":131,"line":132},[129,32352,25345],{"class":135},[129,32354,32355,32357,32359,32361,32363,32365,32367],{"class":131,"line":139},[129,32356,151],{"class":150},[129,32358,25352],{"class":278},[129,32360,2710],{"class":150},[129,32362,728],{"class":150},[129,32364,25359],{"class":731},[129,32366,728],{"class":150},[129,32368,488],{"class":150},[129,32370,32371,32373,32375,32377,32379,32381,32383,32385],{"class":131,"line":16},[129,32372,12675],{"class":1771},[129,32374,688],{"class":150},[129,32376,25372],{"class":278},[129,32378,2852],{"class":150},[129,32380,12695],{"class":1771},[129,32382,25379],{"class":150},[129,32384,25382],{"class":731},[129,32386,25385],{"class":150},[129,32388,32389,32391,32393,32395,32397,32399,32401,32403,32405],{"class":131,"line":190},[129,32390,12675],{"class":1771},[129,32392,24492],{"class":1771},[129,32394,688],{"class":150},[129,32396,518],{"class":278},[129,32398,2852],{"class":150},[129,32400,12695],{"class":1771},[129,32402,25379],{"class":150},[129,32404,24603],{"class":731},[129,32406,25385],{"class":150},[129,32408,32409],{"class":131,"line":212},[129,32410,187],{"emptyLinePlaceholder":186},[129,32412,32413],{"class":131,"line":234},[129,32414,25414],{"class":135},[129,32416,32417,32419,32421,32423,32425,32427,32429,32431,32433,32435,32437,32439,32441,32443,32445,32447,32449,32451],{"class":131,"line":239},[129,32418,1603],{"class":142},[129,32420,688],{"class":150},[129,32422,757],{"class":525},[129,32424,272],{"class":150},[129,32426,7825],{"class":278},[129,32428,990],{"class":150},[129,32430,25431],{"class":278},[129,32432,1014],{"class":150},[129,32434,160],{"class":150},[129,32436,2713],{"class":1771},[129,32438,25440],{"class":1683},[129,32440,2503],{"class":278},[129,32442,25445],{"class":150},[129,32444,947],{"class":731},[129,32446,25445],{"class":150},[129,32448,990],{"class":150},[129,32450,2027],{"class":150},[129,32452,25235],{"class":142},[129,32454,32455,32457,32459,32461],{"class":131,"line":245},[129,32456,25460],{"class":278},[129,32458,4163],{"class":150},[129,32460,25465],{"class":1683},[129,32462,2725],{"class":278},[129,32464,32465],{"class":131,"line":303},[129,32466,2825],{"class":278},[129,32468,32469],{"class":131,"line":308},[129,32470,187],{"emptyLinePlaceholder":186},[129,32472,32473],{"class":131,"line":332},[129,32474,25480],{"class":135},[129,32476,32477,32479,32481,32483,32485,32487,32489,32491,32493,32495,32497],{"class":131,"line":534},[129,32478,1603],{"class":142},[129,32480,25487],{"class":278},[129,32482,2710],{"class":150},[129,32484,25492],{"class":1683},[129,32486,783],{"class":150},[129,32488,5678],{"class":525},[129,32490,272],{"class":150},[129,32492,518],{"class":146},[129,32494,25503],{"class":150},[129,32496,2503],{"class":278},[129,32498,2738],{"class":150},[129,32500,32501,32503,32505],{"class":131,"line":29},[129,32502,25512],{"class":525},[129,32504,272],{"class":150},[129,32506,396],{"class":150},[129,32508,32509,32511,32513],{"class":131,"line":554},[129,32510,25521],{"class":525},[129,32512,272],{"class":150},[129,32514,396],{"class":150},[129,32516,32517,32519,32521,32523,32525,32527,32529,32531],{"class":131,"line":564},[129,32518,25530],{"class":525},[129,32520,272],{"class":150},[129,32522,25535],{"class":278},[129,32524,13088],{"class":1771},[129,32526,25540],{"class":146},[129,32528,151],{"class":150},[129,32530,646],{"class":146},[129,32532,5201],{"class":150},[129,32534,32535,32537,32539],{"class":131,"line":574},[129,32536,25551],{"class":525},[129,32538,272],{"class":150},[129,32540,11933],{"class":5005},[129,32542,32543],{"class":131,"line":585},[129,32544,588],{"class":150},[129,32546,32547],{"class":131,"line":591},[129,32548,10727],{"class":150},[129,32550,32551,32553,32555,32557,32559],{"class":131,"line":597},[129,32552,25568],{"class":525},[129,32554,25571],{"class":150},[129,32556,5678],{"class":268},[129,32558,6332],{"class":150},[129,32560,396],{"class":150},[129,32562,32563,32565,32567,32569,32571,32573,32575,32577,32579,32581,32583,32585,32587],{"class":131,"line":622},[129,32564,4175],{"class":1771},[129,32566,2027],{"class":150},[129,32568,285],{"class":142},[129,32570,25588],{"class":1683},[129,32572,2503],{"class":525},[129,32574,25445],{"class":150},[129,32576,25595],{"class":731},[129,32578,25445],{"class":150},[129,32580,990],{"class":150},[129,32582,5678],{"class":278},[129,32584,4163],{"class":150},[129,32586,1940],{"class":278},[129,32588,2825],{"class":525},[129,32590,32591],{"class":131,"line":627},[129,32592,594],{"class":150},[129,32594,32595,32597],{"class":131,"line":632},[129,32596,1014],{"class":150},[129,32598,2825],{"class":278},[129,32600,32601,32603,32605],{"class":131,"line":651},[129,32602,25622],{"class":150},[129,32604,25625],{"class":278},[129,32606,488],{"class":150},[99,32608,25631],{"id":25630},[114,32610,25635],{"id":25634},[119,32612,32613],{"className":121,"code":25638,"language":123,"meta":124,"style":124},[126,32614,32615,32619,32637,32641,32645,32679,32691,32701,32717,32739,32755,32777,32785,32791,32795],{"__ignoreMap":124},[129,32616,32617],{"class":131,"line":132},[129,32618,25645],{"class":135},[129,32620,32621,32623,32625,32627,32629,32631,32633,32635],{"class":131,"line":139},[129,32622,12675],{"class":1771},[129,32624,688],{"class":150},[129,32626,13811],{"class":278},[129,32628,2852],{"class":150},[129,32630,12695],{"class":1771},[129,32632,874],{"class":150},[129,32634,13820],{"class":731},[129,32636,908],{"class":150},[129,32638,32639],{"class":131,"line":16},[129,32640,187],{"emptyLinePlaceholder":186},[129,32642,32643],{"class":131,"line":190},[129,32644,25672],{"class":135},[129,32646,32647,32649,32651,32653,32655,32657,32659,32661,32663,32665,32667,32669,32671,32673,32675,32677],{"class":131,"line":212},[129,32648,12363],{"class":1771},[129,32650,12731],{"class":142},[129,32652,25681],{"class":278},[129,32654,2710],{"class":150},[129,32656,25686],{"class":150},[129,32658,154],{"class":146},[129,32660,166],{"class":142},[129,32662,13811],{"class":146},[129,32664,4163],{"class":150},[129,32666,25697],{"class":146},[129,32668,5887],{"class":150},[129,32670,25702],{"class":268},[129,32672,272],{"class":150},[129,32674,163],{"class":146},[129,32676,282],{"class":150},[129,32678,25235],{"class":142},[129,32680,32681,32683,32685,32687,32689],{"class":131,"line":234},[129,32682,25715],{"class":278},[129,32684,4163],{"class":150},[129,32686,13880],{"class":1683},[129,32688,2503],{"class":278},[129,32690,2738],{"class":150},[129,32692,32693,32695,32697,32699],{"class":131,"line":239},[129,32694,24785],{"class":525},[129,32696,272],{"class":150},[129,32698,25732],{"class":278},[129,32700,1335],{"class":150},[129,32702,32703,32705,32707,32709,32711,32713,32715],{"class":131,"line":245},[129,32704,24802],{"class":525},[129,32706,272],{"class":150},[129,32708,13811],{"class":278},[129,32710,4163],{"class":150},[129,32712,13880],{"class":1683},[129,32714,2503],{"class":278},[129,32716,2738],{"class":150},[129,32718,32719,32721,32723,32725,32727,32729,32731,32733,32735,32737],{"class":131,"line":303},[129,32720,24811],{"class":525},[129,32722,272],{"class":150},[129,32724,13811],{"class":278},[129,32726,4163],{"class":150},[129,32728,204],{"class":1683},[129,32730,6864],{"class":278},[129,32732,4163],{"class":150},[129,32734,25769],{"class":1683},[129,32736,6864],{"class":278},[129,32738,1335],{"class":150},[129,32740,32741,32743,32745,32747,32749,32751,32753],{"class":131,"line":308},[129,32742,24833],{"class":525},[129,32744,272],{"class":150},[129,32746,13811],{"class":278},[129,32748,4163],{"class":150},[129,32750,204],{"class":1683},[129,32752,6864],{"class":278},[129,32754,1335],{"class":150},[129,32756,32757,32759,32761,32763,32765,32767,32769,32771,32773,32775],{"class":131,"line":332},[129,32758,25794],{"class":525},[129,32760,272],{"class":150},[129,32762,13811],{"class":278},[129,32764,4163],{"class":150},[129,32766,204],{"class":1683},[129,32768,6864],{"class":278},[129,32770,4163],{"class":150},[129,32772,25809],{"class":1683},[129,32774,6864],{"class":278},[129,32776,1335],{"class":150},[129,32778,32779,32781,32783],{"class":131,"line":534},[129,32780,12926],{"class":150},[129,32782,282],{"class":278},[129,32784,1335],{"class":150},[129,32786,32787,32789],{"class":131,"line":29},[129,32788,2822],{"class":150},[129,32790,2825],{"class":278},[129,32792,32793],{"class":131,"line":554},[129,32794,187],{"emptyLinePlaceholder":186},[129,32796,32797,32799,32801,32803,32805,32807,32809,32811,32813,32815,32817,32819,32821,32823,32825,32827,32829],{"class":131,"line":564},[129,32798,12363],{"class":1771},[129,32800,24492],{"class":142},[129,32802,673],{"class":146},[129,32804,151],{"class":150},[129,32806,154],{"class":146},[129,32808,157],{"class":150},[129,32810,160],{"class":150},[129,32812,13811],{"class":146},[129,32814,4163],{"class":150},[129,32816,2390],{"class":146},[129,32818,151],{"class":150},[129,32820,25858],{"class":146},[129,32822,25861],{"class":150},[129,32824,25864],{"class":278},[129,32826,151],{"class":150},[129,32828,154],{"class":146},[129,32830,3353],{"class":150},[114,32832,25874],{"id":25873},[119,32834,32835],{"className":121,"code":25877,"language":123,"meta":124,"style":124},[126,32836,32837,32841,32859,32863,32881,32903,32929,32969,32975,32979,33001],{"__ignoreMap":124},[129,32838,32839],{"class":131,"line":132},[129,32840,25884],{"class":135},[129,32842,32843,32845,32847,32849,32851,32853,32855,32857],{"class":131,"line":139},[129,32844,12675],{"class":1771},[129,32846,688],{"class":150},[129,32848,13811],{"class":278},[129,32850,2852],{"class":150},[129,32852,12695],{"class":1771},[129,32854,874],{"class":150},[129,32856,13820],{"class":731},[129,32858,908],{"class":150},[129,32860,32861],{"class":131,"line":16},[129,32862,187],{"emptyLinePlaceholder":186},[129,32864,32865,32867,32869,32871,32873,32875,32877,32879],{"class":131,"line":190},[129,32866,1603],{"class":142},[129,32868,25913],{"class":278},[129,32870,2710],{"class":150},[129,32872,13811],{"class":278},[129,32874,4163],{"class":150},[129,32876,13880],{"class":1683},[129,32878,2503],{"class":278},[129,32880,2738],{"class":150},[129,32882,32883,32885,32887,32889,32891,32893,32895,32897,32899,32901],{"class":131,"line":212},[129,32884,25930],{"class":525},[129,32886,272],{"class":150},[129,32888,13811],{"class":278},[129,32890,4163],{"class":150},[129,32892,204],{"class":1683},[129,32894,6864],{"class":278},[129,32896,4163],{"class":150},[129,32898,25945],{"class":1683},[129,32900,6864],{"class":278},[129,32902,1335],{"class":150},[129,32904,32905,32907,32909,32911,32913,32915,32917,32919,32921,32923,32925,32927],{"class":131,"line":234},[129,32906,25954],{"class":525},[129,32908,272],{"class":150},[129,32910,13811],{"class":278},[129,32912,4163],{"class":150},[129,32914,204],{"class":1683},[129,32916,6864],{"class":278},[129,32918,4163],{"class":150},[129,32920,13925],{"class":1683},[129,32922,2503],{"class":278},[129,32924,6116],{"class":2755},[129,32926,282],{"class":278},[129,32928,1335],{"class":150},[129,32930,32931,32933,32935,32937,32939,32941,32943,32945,32947,32949,32951,32953,32955,32957,32959,32961,32963,32965,32967],{"class":131,"line":239},[129,32932,25981],{"class":525},[129,32934,272],{"class":150},[129,32936,13811],{"class":278},[129,32938,4163],{"class":150},[129,32940,25990],{"class":1683},[129,32942,25993],{"class":278},[129,32944,728],{"class":150},[129,32946,12896],{"class":731},[129,32948,728],{"class":150},[129,32950,990],{"class":150},[129,32952,874],{"class":150},[129,32954,13174],{"class":731},[129,32956,728],{"class":150},[129,32958,990],{"class":150},[129,32960,874],{"class":150},[129,32962,12164],{"class":731},[129,32964,728],{"class":150},[129,32966,26018],{"class":278},[129,32968,1335],{"class":150},[129,32970,32971,32973],{"class":131,"line":245},[129,32972,1014],{"class":150},[129,32974,2825],{"class":278},[129,32976,32977],{"class":131,"line":303},[129,32978,187],{"emptyLinePlaceholder":186},[129,32980,32981,32983,32985,32987,32989,32991,32993,32995,32997,32999],{"class":131,"line":308},[129,32982,12363],{"class":1771},[129,32984,12731],{"class":142},[129,32986,26039],{"class":278},[129,32988,2710],{"class":150},[129,32990,26044],{"class":278},[129,32992,4163],{"class":150},[129,32994,14066],{"class":1683},[129,32996,14826],{"class":278},[129,32998,4163],{"class":150},[129,33000,26055],{"class":278},[129,33002,33003,33005,33007,33009,33011,33013,33015,33017,33019,33021],{"class":131,"line":332},[129,33004,12363],{"class":1771},[129,33006,24492],{"class":142},[129,33008,26064],{"class":146},[129,33010,160],{"class":150},[129,33012,13811],{"class":146},[129,33014,4163],{"class":150},[129,33016,2390],{"class":146},[129,33018,25861],{"class":150},[129,33020,26044],{"class":278},[129,33022,488],{"class":150},[114,33024,26082],{"id":26081},[119,33026,33027],{"className":121,"code":26085,"language":123,"meta":124,"style":124},[126,33028,33029,33033,33051,33055,33069,33077,33081,33085,33089,33093,33097,33101,33105,33109,33113,33127,33139],{"__ignoreMap":124},[129,33030,33031],{"class":131,"line":132},[129,33032,26092],{"class":135},[129,33034,33035,33037,33039,33041,33043,33045,33047,33049],{"class":131,"line":139},[129,33036,12675],{"class":1771},[129,33038,688],{"class":150},[129,33040,26101],{"class":278},[129,33042,2852],{"class":150},[129,33044,12695],{"class":1771},[129,33046,874],{"class":150},[129,33048,26110],{"class":731},[129,33050,908],{"class":150},[129,33052,33053],{"class":131,"line":16},[129,33054,187],{"emptyLinePlaceholder":186},[129,33056,33057,33059,33061,33063,33065,33067],{"class":131,"line":190},[129,33058,12363],{"class":1771},[129,33060,15158],{"class":142},[129,33062,2678],{"class":142},[129,33064,26127],{"class":1683},[129,33066,6864],{"class":150},[129,33068,396],{"class":150},[129,33070,33071,33073,33075],{"class":131,"line":212},[129,33072,26136],{"class":1771},[129,33074,26101],{"class":1683},[129,33076,26141],{"class":150},[129,33078,33079],{"class":131,"line":234},[129,33080,26146],{"class":731},[129,33082,33083],{"class":131,"line":239},[129,33084,26151],{"class":731},[129,33086,33087],{"class":131,"line":245},[129,33088,26156],{"class":731},[129,33090,33091],{"class":131,"line":303},[129,33092,26161],{"class":731},[129,33094,33095],{"class":131,"line":308},[129,33096,26166],{"class":731},[129,33098,33099],{"class":131,"line":332},[129,33100,26171],{"class":731},[129,33102,33103],{"class":131,"line":534},[129,33104,26176],{"class":150},[129,33106,33107],{"class":131,"line":29},[129,33108,506],{"class":150},[129,33110,33111],{"class":131,"line":554},[129,33112,187],{"emptyLinePlaceholder":186},[129,33114,33115,33117,33119,33121,33123,33125],{"class":131,"line":564},[129,33116,12363],{"class":1771},[129,33118,15158],{"class":142},[129,33120,2678],{"class":142},[129,33122,26195],{"class":1683},[129,33124,6864],{"class":150},[129,33126,396],{"class":150},[129,33128,33129,33131,33133,33135,33137],{"class":131,"line":574},[129,33130,26136],{"class":1771},[129,33132,26101],{"class":1683},[129,33134,4830],{"class":150},[129,33136,26210],{"class":731},[129,33138,26141],{"class":150},[129,33140,33141],{"class":131,"line":585},[129,33142,506],{"class":150},[99,33144,26220],{"id":26219},[114,33146,26224],{"id":26223},[119,33148,33149],{"className":121,"code":26227,"language":123,"meta":124,"style":124},[126,33150,33151,33155,33179,33205,33231,33251,33277,33307,33343],{"__ignoreMap":124},[129,33152,33153],{"class":131,"line":132},[129,33154,26234],{"class":135},[129,33156,33157,33159,33161,33163,33165,33167,33169,33171,33173,33175,33177],{"class":131,"line":139},[129,33158,12363],{"class":1771},[129,33160,12731],{"class":142},[129,33162,2707],{"class":278},[129,33164,2710],{"class":150},[129,33166,24205],{"class":1683},[129,33168,2503],{"class":278},[129,33170,728],{"class":150},[129,33172,26253],{"class":731},[129,33174,728],{"class":150},[129,33176,990],{"class":150},[129,33178,396],{"class":150},[129,33180,33181,33183,33185,33187,33189,33191,33193,33195,33197,33199,33201,33203],{"class":131,"line":16},[129,33182,526],{"class":525},[129,33184,272],{"class":150},[129,33186,24220],{"class":1683},[129,33188,2503],{"class":278},[129,33190,728],{"class":150},[129,33192,3649],{"class":731},[129,33194,728],{"class":150},[129,33196,282],{"class":278},[129,33198,4163],{"class":150},[129,33200,24325],{"class":1683},[129,33202,6864],{"class":278},[129,33204,1335],{"class":150},[129,33206,33207,33209,33211,33213,33215,33217,33219,33221,33223,33225,33227,33229],{"class":131,"line":190},[129,33208,1888],{"class":525},[129,33210,272],{"class":150},[129,33212,24210],{"class":1683},[129,33214,2503],{"class":278},[129,33216,728],{"class":150},[129,33218,1940],{"class":731},[129,33220,728],{"class":150},[129,33222,282],{"class":278},[129,33224,4163],{"class":150},[129,33226,24359],{"class":1683},[129,33228,6864],{"class":278},[129,33230,1335],{"class":150},[129,33232,33233,33235,33237,33239,33241,33243,33245,33247,33249],{"class":131,"line":212},[129,33234,26316],{"class":525},[129,33236,272],{"class":150},[129,33238,24210],{"class":1683},[129,33240,2503],{"class":278},[129,33242,728],{"class":150},[129,33244,26327],{"class":731},[129,33246,728],{"class":150},[129,33248,282],{"class":278},[129,33250,1335],{"class":150},[129,33252,33253,33255,33257,33259,33261,33263,33265,33267,33269,33271,33273,33275],{"class":131,"line":234},[129,33254,2637],{"class":525},[129,33256,272],{"class":150},[129,33258,26342],{"class":1683},[129,33260,2503],{"class":278},[129,33262,728],{"class":150},[129,33264,26349],{"class":731},[129,33266,728],{"class":150},[129,33268,282],{"class":278},[129,33270,4163],{"class":150},[129,33272,24359],{"class":1683},[129,33274,6864],{"class":278},[129,33276,1335],{"class":150},[129,33278,33279,33281,33283,33285,33287,33289,33291,33293,33295,33297,33299,33301,33303,33305],{"class":131,"line":239},[129,33280,26366],{"class":525},[129,33282,272],{"class":150},[129,33284,26371],{"class":1683},[129,33286,2503],{"class":278},[129,33288,728],{"class":150},[129,33290,26378],{"class":731},[129,33292,728],{"class":150},[129,33294,282],{"class":278},[129,33296,4163],{"class":150},[129,33298,26387],{"class":1683},[129,33300,2503],{"class":278},[129,33302,14225],{"class":2755},[129,33304,282],{"class":278},[129,33306,1335],{"class":150},[129,33308,33309,33311,33313,33315,33317,33319,33321,33323,33325,33327,33329,33331,33333,33335,33337,33339,33341],{"class":131,"line":245},[129,33310,26400],{"class":525},[129,33312,272],{"class":150},[129,33314,24220],{"class":1683},[129,33316,2503],{"class":278},[129,33318,728],{"class":150},[129,33320,26411],{"class":731},[129,33322,728],{"class":150},[129,33324,282],{"class":278},[129,33326,4163],{"class":150},[129,33328,26420],{"class":1683},[129,33330,2503],{"class":278},[129,33332,6864],{"class":150},[129,33334,285],{"class":142},[129,33336,26429],{"class":278},[129,33338,4163],{"class":150},[129,33340,26434],{"class":278},[129,33342,1335],{"class":150},[129,33344,33345,33347],{"class":131,"line":303},[129,33346,1014],{"class":150},[129,33348,2825],{"class":278},[114,33350,26446],{"id":26445},[119,33352,33353],{"className":121,"code":26449,"language":123,"meta":124,"style":124},[126,33354,33355,33359,33369,33379,33427,33441,33473,33477,33505,33529,33537,33547,33557,33561,33567,33571,33585,33615,33619,33623,33647,33651],{"__ignoreMap":124},[129,33356,33357],{"class":131,"line":132},[129,33358,26456],{"class":135},[129,33360,33361,33363,33365,33367],{"class":131,"line":139},[129,33362,24638],{"class":278},[129,33364,4163],{"class":150},[129,33366,2003],{"class":1683},[129,33368,4100],{"class":278},[129,33370,33371,33373,33375,33377],{"class":131,"line":16},[129,33372,3416],{"class":150},[129,33374,26473],{"class":731},[129,33376,728],{"class":150},[129,33378,1335],{"class":150},[129,33380,33381,33383,33385,33387,33389,33391,33393,33395,33397,33399,33401,33403,33405,33407,33409,33411,33413,33415,33417,33419,33421,33423,33425],{"class":131,"line":190},[129,33382,26482],{"class":1683},[129,33384,2503],{"class":278},[129,33386,728],{"class":150},[129,33388,26489],{"class":731},[129,33390,728],{"class":150},[129,33392,990],{"class":150},[129,33394,13811],{"class":278},[129,33396,4163],{"class":150},[129,33398,13880],{"class":1683},[129,33400,2503],{"class":278},[129,33402,2838],{"class":150},[129,33404,786],{"class":525},[129,33406,272],{"class":150},[129,33408,13811],{"class":278},[129,33410,4163],{"class":150},[129,33412,204],{"class":1683},[129,33414,6864],{"class":278},[129,33416,4163],{"class":150},[129,33418,25809],{"class":1683},[129,33420,15097],{"class":278},[129,33422,1014],{"class":150},[129,33424,26526],{"class":278},[129,33426,1335],{"class":150},[129,33428,33429,33431,33433,33435,33437,33439],{"class":131,"line":212},[129,33430,13276],{"class":142},[129,33432,605],{"class":150},[129,33434,24676],{"class":268},[129,33436,282],{"class":150},[129,33438,285],{"class":142},[129,33440,396],{"class":150},[129,33442,33443,33445,33447,33449,33451,33453,33455,33457,33459,33461,33463,33465,33467,33469,33471],{"class":131,"line":234},[129,33444,4681],{"class":142},[129,33446,688],{"class":150},[129,33448,786],{"class":278},[129,33450,2852],{"class":150},[129,33452,160],{"class":150},[129,33454,7316],{"class":278},[129,33456,4163],{"class":150},[129,33458,14017],{"class":278},[129,33460,4163],{"class":150},[129,33462,24701],{"class":1683},[129,33464,2503],{"class":525},[129,33466,728],{"class":150},[129,33468,26489],{"class":731},[129,33470,728],{"class":150},[129,33472,2825],{"class":525},[129,33474,33475],{"class":131,"line":239},[129,33476,187],{"emptyLinePlaceholder":186},[129,33478,33479,33481,33483,33485,33487,33489,33491,33493,33495,33497,33499,33501,33503],{"class":131,"line":245},[129,33480,4681],{"class":142},[129,33482,26585],{"class":278},[129,33484,160],{"class":150},[129,33486,2713],{"class":1771},[129,33488,24733],{"class":278},[129,33490,4163],{"class":150},[129,33492,26596],{"class":278},[129,33494,4163],{"class":150},[129,33496,26253],{"class":278},[129,33498,4163],{"class":150},[129,33500,26605],{"class":1683},[129,33502,2503],{"class":525},[129,33504,2738],{"class":150},[129,33506,33507,33509,33511,33513,33515,33517,33519,33521,33523,33525,33527],{"class":131,"line":303},[129,33508,13327],{"class":525},[129,33510,272],{"class":150},[129,33512,2782],{"class":1683},[129,33514,2503],{"class":525},[129,33516,26253],{"class":278},[129,33518,4163],{"class":150},[129,33520,3649],{"class":278},[129,33522,990],{"class":150},[129,33524,786],{"class":278},[129,33526,282],{"class":525},[129,33528,1335],{"class":150},[129,33530,33531,33533,33535],{"class":131,"line":308},[129,33532,26638],{"class":525},[129,33534,272],{"class":150},[129,33536,396],{"class":150},[129,33538,33539,33541,33543,33545],{"class":131,"line":332},[129,33540,26647],{"class":525},[129,33542,272],{"class":150},[129,33544,175],{"class":5005},[129,33546,1335],{"class":150},[129,33548,33549,33551,33553,33555],{"class":131,"line":534},[129,33550,26658],{"class":525},[129,33552,272],{"class":150},[129,33554,175],{"class":5005},[129,33556,1335],{"class":150},[129,33558,33559],{"class":131,"line":29},[129,33560,26669],{"class":150},[129,33562,33563,33565],{"class":131,"line":554},[129,33564,12926],{"class":150},[129,33566,2825],{"class":525},[129,33568,33569],{"class":131,"line":564},[129,33570,187],{"emptyLinePlaceholder":186},[129,33572,33573,33575,33577,33579,33581,33583],{"class":131,"line":574},[129,33574,5924],{"class":1771},[129,33576,605],{"class":525},[129,33578,4796],{"class":150},[129,33580,26690],{"class":278},[129,33582,3517],{"class":525},[129,33584,2738],{"class":150},[129,33586,33587,33589,33591,33593,33595,33597,33599,33601,33603,33605,33607,33609,33611,33613],{"class":131,"line":585},[129,33588,26699],{"class":1771},[129,33590,7316],{"class":278},[129,33592,4163],{"class":150},[129,33594,10154],{"class":1683},[129,33596,2503],{"class":525},[129,33598,2838],{"class":150},[129,33600,691],{"class":525},[129,33602,272],{"class":150},[129,33604,874],{"class":150},[129,33606,26718],{"class":731},[129,33608,728],{"class":150},[129,33610,26723],{"class":150},[129,33612,12646],{"class":2755},[129,33614,2825],{"class":525},[129,33616,33617],{"class":131,"line":591},[129,33618,588],{"class":150},[129,33620,33621],{"class":131,"line":597},[129,33622,187],{"emptyLinePlaceholder":186},[129,33624,33625,33627,33629,33631,33633,33635,33637,33639,33641,33643,33645],{"class":131,"line":622},[129,33626,4175],{"class":1771},[129,33628,7316],{"class":278},[129,33630,4163],{"class":150},[129,33632,10154],{"class":1683},[129,33634,2503],{"class":525},[129,33636,2838],{"class":150},[129,33638,757],{"class":525},[129,33640,272],{"class":150},[129,33642,26585],{"class":278},[129,33644,2852],{"class":150},[129,33646,2825],{"class":525},[129,33648,33649],{"class":131,"line":627},[129,33650,10727],{"class":150},[129,33652,33653],{"class":131,"line":632},[129,33654,2825],{"class":278},[114,33656,26771],{"id":26770},[119,33658,33659],{"className":26774,"code":26775,"language":26776,"meta":124,"style":124},[126,33660,33661,33665,33685,33705,33709,33721,33729,33735,33739,33755,33777,33791,33805,33831,33835,33843,33847,33855,33873,33889,33905,33913],{"__ignoreMap":124},[129,33662,33663],{"class":131,"line":132},[129,33664,26783],{"class":135},[129,33666,33667,33669,33671,33673,33675,33677,33679,33681,33683],{"class":131,"line":139},[129,33668,151],{"class":150},[129,33670,25625],{"class":525},[129,33672,26792],{"class":142},[129,33674,26795],{"class":142},[129,33676,2710],{"class":150},[129,33678,728],{"class":150},[129,33680,25359],{"class":731},[129,33682,728],{"class":150},[129,33684,488],{"class":150},[129,33686,33687,33689,33691,33693,33695,33697,33699,33701,33703],{"class":131,"line":16},[129,33688,12675],{"class":1771},[129,33690,24492],{"class":1771},[129,33692,688],{"class":150},[129,33694,2614],{"class":278},[129,33696,2852],{"class":150},[129,33698,12695],{"class":1771},[129,33700,874],{"class":150},[129,33702,24603],{"class":731},[129,33704,908],{"class":150},[129,33706,33707],{"class":131,"line":190},[129,33708,187],{"emptyLinePlaceholder":186},[129,33710,33711,33713,33715,33717,33719],{"class":131,"line":212},[129,33712,1603],{"class":142},[129,33714,26836],{"class":278},[129,33716,2710],{"class":150},[129,33718,26841],{"class":1683},[129,33720,26844],{"class":150},[129,33722,33723,33725,33727],{"class":131,"line":234},[129,33724,26849],{"class":525},[129,33726,272],{"class":150},[129,33728,26854],{"class":146},[129,33730,33731,33733],{"class":131,"line":239},[129,33732,26859],{"class":150},[129,33734,2725],{"class":278},[129,33736,33737],{"class":131,"line":245},[129,33738,187],{"emptyLinePlaceholder":186},[129,33740,33741,33743,33745,33747,33749,33751,33753],{"class":131,"line":303},[129,33742,1603],{"class":142},[129,33744,26872],{"class":278},[129,33746,2710],{"class":150},[129,33748,26877],{"class":1683},[129,33750,2503],{"class":278},[129,33752,6864],{"class":150},[129,33754,25235],{"class":142},[129,33756,33757,33759,33761,33763,33765,33767,33769,33771,33773,33775],{"class":131,"line":308},[129,33758,26888],{"class":150},[129,33760,26891],{"class":278},[129,33762,4163],{"class":150},[129,33764,26896],{"class":1683},[129,33766,2503],{"class":278},[129,33768,728],{"class":150},[129,33770,26903],{"class":731},[129,33772,728],{"class":150},[129,33774,990],{"class":150},[129,33776,396],{"class":150},[129,33778,33779,33781,33783,33785,33787,33789],{"class":131,"line":332},[129,33780,26914],{"class":525},[129,33782,272],{"class":150},[129,33784,874],{"class":150},[129,33786,26921],{"class":731},[129,33788,728],{"class":150},[129,33790,1335],{"class":150},[129,33792,33793,33795,33797,33799,33801,33803],{"class":131,"line":534},[129,33794,26930],{"class":525},[129,33796,272],{"class":150},[129,33798,874],{"class":150},[129,33800,41],{"class":731},[129,33802,728],{"class":150},[129,33804,1335],{"class":150},[129,33806,33807,33809,33811,33813,33815,33817,33819,33821,33823,33825,33827,33829],{"class":131,"line":29},[129,33808,2822],{"class":150},[129,33810,282],{"class":278},[129,33812,4163],{"class":150},[129,33814,14648],{"class":1683},[129,33816,2503],{"class":278},[129,33818,26955],{"class":1683},[129,33820,26958],{"class":278},[129,33822,4163],{"class":150},[129,33824,26690],{"class":278},[129,33826,4163],{"class":150},[129,33828,26967],{"class":278},[129,33830,1335],{"class":150},[129,33832,33833],{"class":131,"line":554},[129,33834,2825],{"class":278},[129,33836,33837,33839,33841],{"class":131,"line":564},[129,33838,25622],{"class":150},[129,33840,25625],{"class":525},[129,33842,488],{"class":150},[129,33844,33845],{"class":131,"line":574},[129,33846,187],{"emptyLinePlaceholder":186},[129,33848,33849,33851,33853],{"class":131,"line":585},[129,33850,151],{"class":150},[129,33852,26992],{"class":525},[129,33854,488],{"class":150},[129,33856,33857,33859,33861,33863,33865,33867,33869,33871],{"class":131,"line":591},[129,33858,26999],{"class":150},[129,33860,25595],{"class":525},[129,33862,12366],{"class":142},[129,33864,2710],{"class":150},[129,33866,728],{"class":150},[129,33868,27010],{"class":731},[129,33870,728],{"class":150},[129,33872,488],{"class":150},[129,33874,33875,33877,33879,33881,33883,33885,33887],{"class":131,"line":597},[129,33876,27019],{"class":150},[129,33878,114],{"class":525},[129,33880,157],{"class":150},[129,33882,27026],{"class":278},[129,33884,25622],{"class":150},[129,33886,114],{"class":525},[129,33888,488],{"class":150},[129,33890,33891,33893,33895,33897,33899,33901,33903],{"class":131,"line":622},[129,33892,27019],{"class":150},[129,33894,103],{"class":525},[129,33896,157],{"class":150},[129,33898,27043],{"class":278},[129,33900,25622],{"class":150},[129,33902,103],{"class":525},[129,33904,488],{"class":150},[129,33906,33907,33909,33911],{"class":131,"line":627},[129,33908,27054],{"class":150},[129,33910,25595],{"class":525},[129,33912,488],{"class":150},[129,33914,33915,33917,33919],{"class":131,"line":632},[129,33916,25622],{"class":150},[129,33918,26992],{"class":525},[129,33920,488],{"class":150},[99,33922,27070],{"id":27069},[114,33924,27074],{"id":27073},[119,33926,33927],{"className":121,"code":27077,"language":123,"meta":124,"style":124},[126,33928,33929,33933,33949,33953,33957],{"__ignoreMap":124},[129,33930,33931],{"class":131,"line":132},[129,33932,27084],{"class":135},[129,33934,33935,33937,33939,33941,33943,33945,33947],{"class":131,"line":139},[129,33936,1603],{"class":142},[129,33938,27091],{"class":278},[129,33940,2710],{"class":150},[129,33942,8400],{"class":278},[129,33944,4163],{"class":150},[129,33946,27100],{"class":278},[129,33948,27103],{"class":135},[129,33950,33951],{"class":131,"line":16},[129,33952,187],{"emptyLinePlaceholder":186},[129,33954,33955],{"class":131,"line":190},[129,33956,27112],{"class":135},[129,33958,33959,33961,33963,33965,33967,33969,33971,33973,33975,33977],{"class":131,"line":212},[129,33960,1603],{"class":142},[129,33962,27091],{"class":278},[129,33964,2710],{"class":150},[129,33966,8400],{"class":278},[129,33968,4163],{"class":150},[129,33970,27100],{"class":278},[129,33972,13088],{"class":1771},[129,33974,169],{"class":146},[129,33976,1844],{"class":150},[129,33978,4089],{"class":150},[114,33980,27138],{"id":27137},[119,33982,33983],{"className":121,"code":27141,"language":123,"meta":124,"style":124},[126,33984,33985,33989,33997,34005,34013,34017,34021,34039,34055,34059,34063,34067,34085,34107,34129,34135,34139,34157,34179,34185],{"__ignoreMap":124},[129,33986,33987],{"class":131,"line":132},[129,33988,27148],{"class":135},[129,33990,33991,33993,33995],{"class":131,"line":139},[129,33992,515],{"class":142},[129,33994,518],{"class":146},[129,33996,396],{"class":150},[129,33998,33999,34001,34003],{"class":131,"line":16},[129,34000,526],{"class":525},[129,34002,272],{"class":150},[129,34004,551],{"class":146},[129,34006,34007,34009,34011],{"class":131,"line":190},[129,34008,1897],{"class":525},[129,34010,272],{"class":150},[129,34012,551],{"class":146},[129,34014,34015],{"class":131,"line":212},[129,34016,506],{"class":150},[129,34018,34019],{"class":131,"line":234},[129,34020,187],{"emptyLinePlaceholder":186},[129,34022,34023,34025,34027,34029,34031,34033,34035,34037],{"class":131,"line":239},[129,34024,1680],{"class":142},[129,34026,14012],{"class":1683},[129,34028,2503],{"class":150},[129,34030,608],{"class":268},[129,34032,272],{"class":150},[129,34034,13091],{"class":146},[129,34036,282],{"class":150},[129,34038,396],{"class":150},[129,34040,34041,34043,34045,34047,34049,34051,34053],{"class":131,"line":245},[129,34042,6819],{"class":142},[129,34044,5678],{"class":278},[129,34046,160],{"class":150},[129,34048,757],{"class":278},[129,34050,1998],{"class":1771},[129,34052,518],{"class":146},[129,34054,27215],{"class":135},[129,34056,34057],{"class":131,"line":303},[129,34058,506],{"class":150},[129,34060,34061],{"class":131,"line":308},[129,34062,187],{"emptyLinePlaceholder":186},[129,34064,34065],{"class":131,"line":332},[129,34066,27228],{"class":135},[129,34068,34069,34071,34073,34075,34077,34079,34081,34083],{"class":131,"line":534},[129,34070,1603],{"class":142},[129,34072,27235],{"class":278},[129,34074,2710],{"class":150},[129,34076,13811],{"class":278},[129,34078,4163],{"class":150},[129,34080,13880],{"class":1683},[129,34082,2503],{"class":278},[129,34084,2738],{"class":150},[129,34086,34087,34089,34091,34093,34095,34097,34099,34101,34103,34105],{"class":131,"line":29},[129,34088,526],{"class":525},[129,34090,272],{"class":150},[129,34092,13811],{"class":278},[129,34094,4163],{"class":150},[129,34096,204],{"class":1683},[129,34098,6864],{"class":278},[129,34100,4163],{"class":150},[129,34102,25809],{"class":1683},[129,34104,6864],{"class":278},[129,34106,1335],{"class":150},[129,34108,34109,34111,34113,34115,34117,34119,34121,34123,34125,34127],{"class":131,"line":554},[129,34110,1897],{"class":525},[129,34112,272],{"class":150},[129,34114,13811],{"class":278},[129,34116,4163],{"class":150},[129,34118,204],{"class":1683},[129,34120,6864],{"class":278},[129,34122,4163],{"class":150},[129,34124,1440],{"class":1683},[129,34126,6864],{"class":278},[129,34128,1335],{"class":150},[129,34130,34131,34133],{"class":131,"line":564},[129,34132,1014],{"class":150},[129,34134,2825],{"class":278},[129,34136,34137],{"class":131,"line":574},[129,34138,187],{"emptyLinePlaceholder":186},[129,34140,34141,34143,34145,34147,34149,34151,34153,34155],{"class":131,"line":585},[129,34142,1680],{"class":142},[129,34144,14012],{"class":1683},[129,34146,2503],{"class":150},[129,34148,608],{"class":268},[129,34150,272],{"class":150},[129,34152,13091],{"class":146},[129,34154,282],{"class":150},[129,34156,396],{"class":150},[129,34158,34159,34161,34163,34165,34167,34169,34171,34173,34175,34177],{"class":131,"line":591},[129,34160,6819],{"class":142},[129,34162,5678],{"class":278},[129,34164,160],{"class":150},[129,34166,27330],{"class":278},[129,34168,4163],{"class":150},[129,34170,14066],{"class":1683},[129,34172,2503],{"class":525},[129,34174,608],{"class":278},[129,34176,3517],{"class":525},[129,34178,27343],{"class":135},[129,34180,34181,34183],{"class":131,"line":597},[129,34182,1772],{"class":1771},[129,34184,27350],{"class":278},[129,34186,34187],{"class":131,"line":622},[129,34188,506],{"class":150},[114,34190,27358],{"id":27357},[103,34192,34193,27364],{},[9418,34194,27363],{},[119,34196,34197],{"className":27367,"code":27368,"language":27369,"meta":124,"style":124},[126,34198,34199,34203,34207,34221,34229,34243,34255,34259],{"__ignoreMap":124},[129,34200,34201],{"class":131,"line":132},[129,34202,27376],{"class":135},[129,34204,34205],{"class":131,"line":139},[129,34206,2738],{"class":150},[129,34208,34209,34211,34213,34215,34217,34219],{"class":131,"line":16},[129,34210,27385],{"class":146},[129,34212,272],{"class":1683},[129,34214,874],{"class":150},[129,34216,27392],{"class":731},[129,34218,728],{"class":150},[129,34220,1335],{"class":731},[129,34222,34223,34225,34227],{"class":131,"line":190},[129,34224,27401],{"class":146},[129,34226,272],{"class":1683},[129,34228,396],{"class":731},[129,34230,34231,34233,34235,34237,34239,34241],{"class":131,"line":212},[129,34232,27410],{"class":146},[129,34234,272],{"class":1683},[129,34236,874],{"class":150},[129,34238,27417],{"class":731},[129,34240,728],{"class":150},[129,34242,1335],{"class":731},[129,34244,34245,34247,34249,34251,34253],{"class":131,"line":234},[129,34246,27426],{"class":146},[129,34248,272],{"class":1683},[129,34250,874],{"class":150},[129,34252,27433],{"class":731},[129,34254,908],{"class":150},[129,34256,34257],{"class":131,"line":239},[129,34258,594],{"class":150},[129,34260,34261],{"class":131,"line":245},[129,34262,506],{"class":278},[99,34264,27447],{"id":27446},[114,34266,27451],{"id":27450},[10306,34268,34269,34273,34277,34281],{},[9415,34270,34271,27459],{},[9418,34272,27458],{},[9415,34274,34275,27465],{},[9418,34276,27464],{},[9415,34278,34279,27471],{},[9418,34280,27470],{},[9415,34282,34283,27477],{},[9418,34284,27476],{},[114,34286,27481],{"id":27480},[10306,34288,34289,34293,34297],{},[9415,34290,34291,27489],{},[9418,34292,27488],{},[9415,34294,34295,27495],{},[9418,34296,27494],{},[9415,34298,34299,27501],{},[9418,34300,27500],{},[114,34302,27505],{"id":27504},[10306,34304,34305,34309,34313],{},[9415,34306,34307,27513],{},[9418,34308,27512],{},[9415,34310,34311,27519],{},[9418,34312,27518],{},[9415,34314,34315,27525],{},[9418,34316,27524],{},[99,34318,27529],{"id":27528},[119,34320,34321],{"className":121,"code":27532,"language":123,"meta":124,"style":124},[126,34322,34323,34327,34345,34363,34367,34387,34419,34425,34429,34449,34485],{"__ignoreMap":124},[129,34324,34325],{"class":131,"line":132},[129,34326,27539],{"class":135},[129,34328,34329,34331,34333,34335,34337,34339,34341,34343],{"class":131,"line":139},[129,34330,12675],{"class":1771},[129,34332,688],{"class":150},[129,34334,27548],{"class":278},[129,34336,2852],{"class":150},[129,34338,12695],{"class":1771},[129,34340,874],{"class":150},[129,34342,27557],{"class":731},[129,34344,908],{"class":150},[129,34346,34347,34349,34351,34353,34355,34357,34359,34361],{"class":131,"line":16},[129,34348,12675],{"class":1771},[129,34350,688],{"class":150},[129,34352,25372],{"class":278},[129,34354,2852],{"class":150},[129,34356,12695],{"class":1771},[129,34358,874],{"class":150},[129,34360,25382],{"class":731},[129,34362,908],{"class":150},[129,34364,34365],{"class":131,"line":190},[129,34366,187],{"emptyLinePlaceholder":186},[129,34368,34369,34371,34373,34375,34377,34379,34381,34383,34385],{"class":131,"line":212},[129,34370,12164],{"class":1683},[129,34372,2503],{"class":278},[129,34374,728],{"class":150},[129,34376,27592],{"class":731},[129,34378,728],{"class":150},[129,34380,990],{"class":150},[129,34382,2027],{"class":150},[129,34384,285],{"class":142},[129,34386,396],{"class":150},[129,34388,34389,34391,34393,34395,34397,34399,34401,34403,34405,34407,34409,34411,34413,34415,34417],{"class":131,"line":234},[129,34390,27607],{"class":1683},[129,34392,2503],{"class":525},[129,34394,27612],{"class":278},[129,34396,4163],{"class":150},[129,34398,25465],{"class":1683},[129,34400,27619],{"class":525},[129,34402,4163],{"class":150},[129,34404,27624],{"class":278},[129,34406,4163],{"class":150},[129,34408,27629],{"class":1683},[129,34410,151],{"class":150},[129,34412,646],{"class":146},[129,34414,279],{"class":525},[129,34416,157],{"class":150},[129,34418,2725],{"class":525},[129,34420,34421,34423],{"class":131,"line":239},[129,34422,1014],{"class":150},[129,34424,2825],{"class":278},[129,34426,34427],{"class":131,"line":245},[129,34428,187],{"emptyLinePlaceholder":186},[129,34430,34431,34433,34435,34437,34439,34441,34443,34445,34447],{"class":131,"line":303},[129,34432,12164],{"class":1683},[129,34434,2503],{"class":278},[129,34436,728],{"class":150},[129,34438,27660],{"class":731},[129,34440,728],{"class":150},[129,34442,990],{"class":150},[129,34444,2027],{"class":150},[129,34446,285],{"class":142},[129,34448,396],{"class":150},[129,34450,34451,34453,34455,34457,34459,34461,34463,34465,34467,34469,34471,34473,34475,34477,34479,34481,34483],{"class":131,"line":308},[129,34452,27607],{"class":1683},[129,34454,2503],{"class":525},[129,34456,27612],{"class":278},[129,34458,4163],{"class":150},[129,34460,5379],{"class":278},[129,34462,282],{"class":525},[129,34464,4163],{"class":150},[129,34466,27689],{"class":1683},[129,34468,2503],{"class":525},[129,34470,14225],{"class":2755},[129,34472,282],{"class":525},[129,34474,4163],{"class":150},[129,34476,27629],{"class":1683},[129,34478,151],{"class":150},[129,34480,27704],{"class":146},[129,34482,157],{"class":150},[129,34484,2725],{"class":525},[129,34486,34487,34489],{"class":131,"line":332},[129,34488,1014],{"class":150},[129,34490,2825],{"class":278},[99,34492,27718],{"id":27717},[103,34494,27721],{},[9412,34496,34497,34501,34507,34513],{},[9415,34498,34499,27729],{},[9418,34500,27728],{},[9415,34502,34503,27735,34505,27739],{},[9418,34504,27734],{},[126,34506,27738],{},[9415,34508,34509,27735,34511,27748],{},[9418,34510,27744],{},[126,34512,27747],{},[9415,34514,34515,27754],{},[9418,34516,27753],{},[99,34518,9407],{"id":9406},[103,34520,27759],{},[103,34522,27762],{},[9456,34524],{},[103,34526,34527,27770],{},[9418,34528,27769],{},[9504,34530,27773],{},{"title":124,"searchDepth":139,"depth":139,"links":34532},[34533,34534,34535,34539,34545,34550,34555,34560,34565,34566,34567],{"id":24069,"depth":139,"text":24064},{"id":24075,"depth":139,"text":24076},{"id":24110,"depth":139,"text":24111,"children":34536},[34537,34538],{"id":24114,"depth":16,"text":24115},{"id":24148,"depth":16,"text":24149},{"id":24178,"depth":139,"text":24179,"children":34540},[34541,34542,34543,34544],{"id":24182,"depth":16,"text":24183},{"id":24529,"depth":16,"text":24530},{"id":24888,"depth":16,"text":24889},{"id":25334,"depth":16,"text":25335},{"id":25630,"depth":139,"text":25631,"children":34546},[34547,34548,34549],{"id":25634,"depth":16,"text":25635},{"id":25873,"depth":16,"text":25874},{"id":26081,"depth":16,"text":26082},{"id":26219,"depth":139,"text":26220,"children":34551},[34552,34553,34554],{"id":26223,"depth":16,"text":26224},{"id":26445,"depth":16,"text":26446},{"id":26770,"depth":16,"text":26771},{"id":27069,"depth":139,"text":27070,"children":34556},[34557,34558,34559],{"id":27073,"depth":16,"text":27074},{"id":27137,"depth":16,"text":27138},{"id":27357,"depth":16,"text":27358},{"id":27446,"depth":139,"text":27447,"children":34561},[34562,34563,34564],{"id":27450,"depth":16,"text":27451},{"id":27480,"depth":16,"text":27481},{"id":27504,"depth":16,"text":27505},{"id":27528,"depth":139,"text":27529},{"id":27717,"depth":139,"text":27718},{"id":9406,"depth":139,"text":9407},{"readingTime":27814},{"title":24064,"description":27812},{"src":27819,"mime":9550,"alt":27820,"width":9552,"height":9553},[9556,10271,27823,27488,27824],["Reactive",34573],{"$scolor-mode":34574,"$snuxt-seo-utils:routeRules":34576,"$stoasts":34577,"$ssite-config":34578},{"preference":34575,"value":34575,"unknown":186,"forced":9542},"system",{"head":-1,"seoMeta":-1},[],{"_priority":34579,"defaultLocale":34582,"description":34583,"env":13174,"indexable":186,"name":34584,"url":34585},{"env":34580,"indexable":34581,"url":34581,"name":34581,"description":34581,"defaultLocale":34581},-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",34588],{"blog-post-/blog/11-typescript-advanced-patterns":-1,"profile-data":-1,"series-TypeScript Mastery":-1,"related-posts-/blog/11-typescript-advanced-patterns":-1}]