Skip to main content

TypeScript + Node.js in Production: A Complete Guide

mubaidr
Wednesday, February 28, 2024
TypeScriptNode.jsBackendProduction
TypeScript + Node.js in Production: A Complete Guide

TypeScript + Node.js in Production: A Complete Guide

Running TypeScript in production requires careful consideration of build processes, performance, and maintainability. After deploying dozens of TypeScript Node.js applications, here's everything you need to know.

Project Setup and Configuration

Essential Dependencies

{
  "devDependencies": {
    "@types/node": "^20.0.0",
    "typescript": "^5.0.0",
    "ts-node": "^10.9.0",
    "nodemon": "^3.0.0",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0"
  },
  "dependencies": {
    "dotenv": "^16.0.0",
    "express": "^4.18.0",
    "@types/express": "^4.17.0"
  }
}

TypeScript Configuration

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "commonjs",
    "lib": ["ES2022"],
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "removeComments": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist", "**/*.test.ts"]
}

Build and Deployment Strategies

Development vs Production Builds

// package.json scripts
{
  "scripts": {
    "dev": "nodemon --exec ts-node src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js",
    "start:prod": "NODE_ENV=production node dist/index.js",
    "type-check": "tsc --noEmit",
    "lint": "eslint src/**/*.ts",
    "test": "jest"
  }
}

Docker Configuration

# Multi-stage build for production
FROM node:18-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

FROM node:18-alpine AS production

WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./

EXPOSE 3000
CMD ["npm", "run", "start:prod"]

Error Handling and Type Safety

Custom Error Classes

// src/errors/AppError.ts
export class AppError extends Error {
  public readonly statusCode: number
  public readonly isOperational: boolean

  constructor(
    message: string,
    statusCode: number = 500,
    isOperational: boolean = true,
  ) {
    super(message)
    this.statusCode = statusCode
    this.isOperational = isOperational

    Error.captureStackTrace(this, this.constructor)
  }
}

export class ValidationError extends AppError {
  constructor(message: string) {
    super(message, 400)
  }
}

export class NotFoundError extends AppError {
  constructor(resource: string) {
    super(`${resource} not found`, 404)
  }
}

Global Error Handler

// src/middleware/errorHandler.ts
import { Request, Response, NextFunction } from "express"
import { AppError } from "../errors/AppError"

export const errorHandler = (
  error: Error,
  req: Request,
  res: Response,
  next: NextFunction,
) => {
  if (error instanceof AppError) {
    return res.status(error.statusCode).json({
      status: "error",
      message: error.message,
      ...(process.env.NODE_ENV === "development" && { stack: error.stack }),
    })
  }

  // Log unexpected errors
  console.error("Unexpected error:", error)

  res.status(500).json({
    status: "error",
    message: "Internal server error",
  })
}

Database Integration with Type Safety

Prisma Integration

// src/database/client.ts
import { PrismaClient } from "@prisma/client"

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined
}

export const prisma = globalForPrisma.prisma ?? new PrismaClient()

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma
}

Repository Pattern

// src/repositories/UserRepository.ts
import { User, Prisma } from "@prisma/client"
import { prisma } from "../database/client"

export class UserRepository {
  async findById(id: string): Promise<User | null> {
    return prisma.user.findUnique({
      where: { id },
    })
  }

  async create(data: Prisma.UserCreateInput): Promise<User> {
    return prisma.user.create({
      data,
    })
  }

  async update(id: string, data: Prisma.UserUpdateInput): Promise<User> {
    return prisma.user.update({
      where: { id },
      data,
    })
  }

  async delete(id: string): Promise<void> {
    await prisma.user.delete({
      where: { id },
    })
  }
}

API Design with Strong Types

Request/Response Types

// src/types/api.ts
export interface CreateUserRequest {
  email: string
  name: string
  password: string
}

export interface UserResponse {
  id: string
  email: string
  name: string
  createdAt: string
  updatedAt: string
}

export interface ApiResponse<T = unknown> {
  success: boolean
  data?: T
  error?: string
  message?: string
}

Validated Controllers

// src/controllers/UserController.ts
import { Request, Response, NextFunction } from "express"
import { z } from "zod"
import { UserService } from "../services/UserService"
import { ValidationError } from "../errors/AppError"

const createUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(2),
  password: z.string().min(8),
})

export class UserController {
  constructor(private userService: UserService) {}

  async createUser(req: Request, res: Response, next: NextFunction) {
    try {
      const validatedData = createUserSchema.parse(req.body)
      const user = await this.userService.createUser(validatedData)

      res.status(201).json({
        success: true,
        data: user,
      })
    } catch (error) {
      if (error instanceof z.ZodError) {
        next(
          new ValidationError(error.errors[0]?.message || "Validation failed"),
        )
      } else {
        next(error)
      }
    }
  }
}

Performance Optimization

Compilation Speed

// tsconfig.json - for faster builds
{
  "compilerOptions": {
    "incremental": true,
    "tsBuildInfoFile": ".tsbuildinfo"
  },
  "ts-node": {
    "transpileOnly": true,
    "files": true
  }
}

Runtime Performance

// Use type assertions carefully
const user = data as User // Fast but unsafe
const user = data satisfies User // Type-safe validation

// Prefer interfaces over types for objects
interface User {
  id: string
  name: string
}

// Use const assertions for immutable data
const config = {
  port: 3000,
  host: "localhost",
} as const

Monitoring and Logging

Structured Logging

// src/utils/logger.ts
import winston from "winston"

export const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || "info",
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.errors({ stack: true }),
    winston.format.json(),
  ),
  transports: [
    new winston.transports.File({ filename: "error.log", level: "error" }),
    new winston.transports.File({ filename: "combined.log" }),
    ...(process.env.NODE_ENV !== "production"
      ? [
          new winston.transports.Console({
            format: winston.format.simple(),
          }),
        ]
      : []),
  ],
})

Testing Strategy

Unit Tests with Jest

// src/services/__tests__/UserService.test.ts
import { UserService } from "../UserService"
import { UserRepository } from "../../repositories/UserRepository"

jest.mock("../../repositories/UserRepository")

describe("UserService", () => {
  let userService: UserService
  let mockUserRepository: jest.Mocked<UserRepository>

  beforeEach(() => {
    mockUserRepository = new UserRepository() as jest.Mocked<UserRepository>
    userService = new UserService(mockUserRepository)
  })

  it("should create user successfully", async () => {
    const userData = {
      email: "test@example.com",
      name: "Test User",
      password: "password123",
    }

    mockUserRepository.create.mockResolvedValue({
      id: "1",
      ...userData,
      createdAt: new Date(),
      updatedAt: new Date(),
    })

    const result = await userService.createUser(userData)

    expect(result).toBeDefined()
    expect(result.email).toBe(userData.email)
    expect(mockUserRepository.create).toHaveBeenCalledWith(userData)
  })
})

Conclusion

TypeScript in Node.js production environments requires attention to build processes, error handling, and type safety. The investment in proper setup pays dividends in maintainability, developer experience, and runtime reliability.

Key takeaways:

  • Use strict TypeScript configuration
  • Implement proper error handling with custom error classes
  • Leverage type-safe database access patterns
  • Optimize for both development and production builds
  • Maintain comprehensive testing coverage

With these practices, you'll build robust, scalable Node.js applications that are a joy to maintain and extend.


Continue Your TypeScript Journey

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

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

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

Muhammad Ubaid R.

\n",[122,20553,20554,20559,20577,20599,20619,20623,20628,20669,20681,20685,20689,20694,20721,20730,20739,20760,20769,20773,20777,20791,20821,20825,20831],{"__ignoreMap":120},[125,20555,20556],{"class":127,"line":128},[125,20557,20558],{"class":385},"// app/pages/users.vue\n",[125,20560,20561,20563,20566,20568,20570,20573,20575],{"class":127,"line":135},[125,20562,2108],{"class":131},[125,20564,20565],{"class":965},"script setup lang",[125,20567,1532],{"class":131},[125,20569,145],{"class":131},[125,20571,20572],{"class":170},"ts",[125,20574,145],{"class":131},[125,20576,3937],{"class":131},[125,20578,20579,20581,20583,20586,20588,20590,20593,20596],{"class":127,"line":16},[125,20580,1468],{"class":1125},[125,20582,1471],{"class":131},[125,20584,20585],{"class":965}," usersApi",[125,20587,1487],{"class":131},[125,20589,1490],{"class":1125},[125,20591,20592],{"class":131}," '",[125,20594,20595],{"class":170},"@/lib/api/client",[125,20597,20598],{"class":131},"'\n",[125,20600,20601,20603,20605,20607,20609,20611,20613,20615,20617],{"class":127,"line":179},[125,20602,1468],{"class":1125},[125,20604,19705],{"class":1125},[125,20606,1471],{"class":131},[125,20608,2032],{"class":965},[125,20610,1487],{"class":131},[125,20612,1490],{"class":1125},[125,20614,20592],{"class":131},[125,20616,19816],{"class":170},[125,20618,20598],{"class":131},[125,20620,20621],{"class":127,"line":200},[125,20622,978],{"emptyLinePlaceholder":977},[125,20624,20625],{"class":127,"line":221},[125,20626,20627],{"class":385},"// Fully typed with inference\n",[125,20629,20630,20632,20634,20636,20638,20640,20642,20645,20647,20649,20651,20654,20656,20659,20661,20663,20665,20667],{"class":127,"line":242},[125,20631,1883],{"class":141},[125,20633,1471],{"class":131},[125,20635,2263],{"class":1151},[125,20637,148],{"class":131},[125,20639,17572],{"class":965},[125,20641,735],{"class":131},[125,20643,20644],{"class":965}," error ",[125,20646,1426],{"class":131},[125,20648,1209],{"class":131},[125,20650,2934],{"class":1125},[125,20652,20653],{"class":1293}," useAsyncData",[125,20655,1247],{"class":965},[125,20657,20658],{"class":131},"'",[125,20660,10781],{"class":170},[125,20662,20658],{"class":131},[125,20664,735],{"class":131},[125,20666,3895],{"class":131},[125,20668,20448],{"class":141},[125,20670,20671,20674,20676,20679],{"class":127,"line":263},[125,20672,20673],{"class":965}," usersApi",[125,20675,1290],{"class":131},[125,20677,20678],{"class":1293},"getAll",[125,20680,1955],{"class":965},[125,20682,20683],{"class":127,"line":282},[125,20684,1253],{"class":965},[125,20686,20687],{"class":127,"line":288},[125,20688,978],{"emptyLinePlaceholder":977},[125,20690,20691],{"class":127,"line":302},[125,20692,20693],{"class":385},"// Type-safe component\n",[125,20695,20696,20698,20701,20703,20706,20708,20710,20712,20714,20717,20719],{"class":127,"line":323},[125,20697,1883],{"class":141},[125,20699,20700],{"class":965}," UserCard ",[125,20702,1532],{"class":131},[125,20704,20705],{"class":1293}," defineComponent",[125,20707,4992],{"class":131},[125,20709,2929],{"class":1151},[125,20711,148],{"class":131},[125,20713,2032],{"class":159},[125,20715,20716],{"class":131}," }>",[125,20718,1247],{"class":965},[125,20720,132],{"class":131},[125,20722,20723,20726,20728],{"class":127,"line":29},[125,20724,20725],{"class":1151}," props",[125,20727,148],{"class":131},[125,20729,151],{"class":131},[125,20731,20732,20735,20737],{"class":127,"line":362},[125,20733,20734],{"class":1151}," user",[125,20736,148],{"class":131},[125,20738,151],{"class":131},[125,20740,20741,20744,20746,20749,20751,20754,20756,20758],{"class":127,"line":368},[125,20742,20743],{"class":1151}," type",[125,20745,148],{"class":131},[125,20747,20748],{"class":965}," Object ",[125,20750,1894],{"class":1125},[125,20752,20753],{"class":159}," PropType",[125,20755,2108],{"class":131},[125,20757,2111],{"class":159},[125,20759,14964],{"class":131},[125,20761,20762,20765,20767],{"class":127,"line":601},[125,20763,20764],{"class":1151}," required",[125,20766,148],{"class":131},[125,20768,683],{"class":1229},[125,20770,20771],{"class":127,"line":615},[125,20772,3133],{"class":131},[125,20774,20775],{"class":127,"line":629},[125,20776,285],{"class":131},[125,20778,20779,20782,20785,20787,20789],{"class":127,"line":643},[125,20780,20781],{"class":1151}," setup",[125,20783,20784],{"class":131},"({",[125,20786,2929],{"class":1188},[125,20788,16085],{"class":131},[125,20790,151],{"class":131},[125,20792,20793,20795,20797,20799,20802,20804,20806,20809,20811,20813,20815,20817,20819],{"class":127,"line":657},[125,20794,1614],{"class":1125},[125,20796,3895],{"class":131},[125,20798,3898],{"class":141},[125,20800,20801],{"class":1293}," h",[125,20803,1247],{"class":1151},[125,20805,20658],{"class":131},[125,20807,20808],{"class":170},"div",[125,20810,20658],{"class":131},[125,20812,735],{"class":131},[125,20814,2929],{"class":965},[125,20816,1290],{"class":131},[125,20818,11754],{"class":965},[125,20820,1253],{"class":1151},[125,20822,20823],{"class":127,"line":671},[125,20824,365],{"class":131},[125,20826,20827,20829],{"class":127,"line":686},[125,20828,1426],{"class":131},[125,20830,1253],{"class":965},[125,20832,20833,20836,20839],{"class":127,"line":691},[125,20834,20835],{"class":131},"(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",[122,20853,20854,20859,20877,20881,20886,20924,20937,20948,20964,20987,21003,21027,21035,21041,21045],{"__ignoreMap":120},[125,20855,20856],{"class":127,"line":128},[125,20857,20858],{"class":385},"// shared/types/common.ts\n",[125,20860,20861,20863,20865,20867,20869,20871,20873,20875],{"class":127,"line":135},[125,20862,1468],{"class":1125},[125,20864,1471],{"class":131},[125,20866,2650],{"class":965},[125,20868,1487],{"class":131},[125,20870,1490],{"class":1125},[125,20872,167],{"class":131},[125,20874,2659],{"class":170},[125,20876,279],{"class":131},[125,20878,20879],{"class":127,"line":16},[125,20880,978],{"emptyLinePlaceholder":977},[125,20882,20883],{"class":127,"line":179},[125,20884,20885],{"class":385},"// Common response structure\n",[125,20887,20888,20890,20892,20895,20897,20900,20902,20904,20906,20908,20911,20913,20916,20918,20920,20922],{"class":127,"line":200},[125,20889,1126],{"class":1125},[125,20891,1526],{"class":141},[125,20893,20894],{"class":965}," apiResponseSchema ",[125,20896,1532],{"class":131},[125,20898,20899],{"class":131}," <",[125,20901,2552],{"class":159},[125,20903,1135],{"class":141},[125,20905,2650],{"class":159},[125,20907,1290],{"class":131},[125,20909,20910],{"class":159},"ZodType",[125,20912,4490],{"class":131},[125,20914,20915],{"class":1188},"dataSchema",[125,20917,148],{"class":131},[125,20919,4498],{"class":159},[125,20921,1349],{"class":131},[125,20923,20448],{"class":141},[125,20925,20926,20929,20931,20933,20935],{"class":127,"line":221},[125,20927,20928],{"class":965}," z",[125,20930,1290],{"class":131},[125,20932,2719],{"class":1293},[125,20934,1247],{"class":965},[125,20936,132],{"class":131},[125,20938,20939,20941,20943,20946],{"class":127,"line":242},[125,20940,19998],{"class":1151},[125,20942,148],{"class":131},[125,20944,20945],{"class":965}," dataSchema",[125,20947,176],{"class":131},[125,20949,20950,20952,20954,20956,20958,20960,20962],{"class":127,"line":263},[125,20951,20015],{"class":1151},[125,20953,148],{"class":131},[125,20955,2650],{"class":965},[125,20957,1290],{"class":131},[125,20959,2719],{"class":1293},[125,20961,1247],{"class":965},[125,20963,132],{"class":131},[125,20965,20966,20968,20970,20972,20974,20976,20978,20980,20983,20985],{"class":127,"line":282},[125,20967,20024],{"class":1151},[125,20969,148],{"class":131},[125,20971,2650],{"class":965},[125,20973,1290],{"class":131},[125,20975,2736],{"class":1293},[125,20977,2739],{"class":965},[125,20979,1290],{"class":131},[125,20981,20982],{"class":1293},"datetime",[125,20984,2739],{"class":965},[125,20986,176],{"class":131},[125,20988,20989,20991,20993,20995,20997,20999,21001],{"class":127,"line":288},[125,20990,20046],{"class":1151},[125,20992,148],{"class":131},[125,20994,2650],{"class":965},[125,20996,1290],{"class":131},[125,20998,2736],{"class":1293},[125,21000,2739],{"class":965},[125,21002,176],{"class":131},[125,21004,21005,21008,21010,21012,21014,21016,21018,21020,21023,21025],{"class":127,"line":302},[125,21006,21007],{"class":1151}," requestId",[125,21009,148],{"class":131},[125,21011,2650],{"class":965},[125,21013,1290],{"class":131},[125,21015,2736],{"class":1293},[125,21017,2739],{"class":965},[125,21019,1290],{"class":131},[125,21021,21022],{"class":1293},"uuid",[125,21024,2739],{"class":965},[125,21026,176],{"class":131},[125,21028,21029,21031,21033],{"class":127,"line":323},[125,21030,1729],{"class":131},[125,21032,1349],{"class":965},[125,21034,176],{"class":131},[125,21036,21037,21039],{"class":127,"line":29},[125,21038,1830],{"class":131},[125,21040,1253],{"class":965},[125,21042,21043],{"class":127,"line":362},[125,21044,978],{"emptyLinePlaceholder":977},[125,21046,21047,21049,21051,21053,21055,21057,21059,21061,21063,21065,21067,21069,21072,21075,21078,21080,21082],{"class":127,"line":368},[125,21048,1126],{"class":1125},[125,21050,19705],{"class":141},[125,21052,2547],{"class":159},[125,21054,2108],{"class":131},[125,21056,2552],{"class":159},[125,21058,2119],{"class":131},[125,21060,1209],{"class":131},[125,21062,2650],{"class":159},[125,21064,1290],{"class":131},[125,21066,4758],{"class":159},[125,21068,2108],{"class":131},[125,21070,21071],{"class":159},"ReturnType",[125,21073,21074],{"class":131},"\n",[122,21092,21093,21098,21116,21120,21139,21163,21190,21234,21240,21244,21269],{"__ignoreMap":120},[125,21094,21095],{"class":127,"line":128},[125,21096,21097],{"class":385},"// lib/env.ts\n",[125,21099,21100,21102,21104,21106,21108,21110,21112,21114],{"class":127,"line":135},[125,21101,1468],{"class":1125},[125,21103,1471],{"class":131},[125,21105,2650],{"class":965},[125,21107,1487],{"class":131},[125,21109,1490],{"class":1125},[125,21111,167],{"class":131},[125,21113,2659],{"class":170},[125,21115,279],{"class":131},[125,21117,21118],{"class":127,"line":16},[125,21119,978],{"emptyLinePlaceholder":977},[125,21121,21122,21124,21127,21129,21131,21133,21135,21137],{"class":127,"line":179},[125,21123,1883],{"class":141},[125,21125,21126],{"class":965}," envSchema ",[125,21128,1532],{"class":131},[125,21130,2650],{"class":965},[125,21132,1290],{"class":131},[125,21134,2719],{"class":1293},[125,21136,1247],{"class":965},[125,21138,132],{"class":131},[125,21140,21141,21144,21146,21148,21150,21152,21154,21156,21159,21161],{"class":127,"line":200},[125,21142,21143],{"class":1151}," DATABASE_URL",[125,21145,148],{"class":131},[125,21147,2650],{"class":965},[125,21149,1290],{"class":131},[125,21151,2736],{"class":1293},[125,21153,2739],{"class":965},[125,21155,1290],{"class":131},[125,21157,21158],{"class":1293},"url",[125,21160,2739],{"class":965},[125,21162,176],{"class":131},[125,21164,21165,21168,21170,21172,21174,21176,21178,21180,21182,21184,21186,21188],{"class":127,"line":221},[125,21166,21167],{"class":1151}," API_KEY",[125,21169,148],{"class":131},[125,21171,2650],{"class":965},[125,21173,1290],{"class":131},[125,21175,2736],{"class":1293},[125,21177,2739],{"class":965},[125,21179,1290],{"class":131},[125,21181,2767],{"class":1293},[125,21183,1247],{"class":965},[125,21185,4132],{"class":961},[125,21187,1349],{"class":965},[125,21189,176],{"class":131},[125,21191,21192,21195,21197,21199,21201,21204,21207,21209,21211,21213,21215,21217,21219,21221,21223,21225,21227,21229,21232],{"class":127,"line":242},[125,21193,21194],{"class":1151}," NODE_ENV",[125,21196,148],{"class":131},[125,21198,2650],{"class":965},[125,21200,1290],{"class":131},[125,21202,21203],{"class":1293},"enum",[125,21205,21206],{"class":965},"([",[125,21208,145],{"class":131},[125,21210,1699],{"class":170},[125,21212,145],{"class":131},[125,21214,735],{"class":131},[125,21216,167],{"class":131},[125,21218,1984],{"class":170},[125,21220,145],{"class":131},[125,21222,735],{"class":131},[125,21224,167],{"class":131},[125,21226,921],{"class":170},[125,21228,145],{"class":131},[125,21230,21231],{"class":965},"])",[125,21233,176],{"class":131},[125,21235,21236,21238],{"class":127,"line":263},[125,21237,1426],{"class":131},[125,21239,1253],{"class":965},[125,21241,21242],{"class":127,"line":282},[125,21243,978],{"emptyLinePlaceholder":977},[125,21245,21246,21248,21250,21253,21255,21258,21260,21262,21264,21266],{"class":127,"line":288},[125,21247,1126],{"class":1125},[125,21249,1526],{"class":141},[125,21251,21252],{"class":965}," env ",[125,21254,1532],{"class":131},[125,21256,21257],{"class":965}," envSchema",[125,21259,1290],{"class":131},[125,21261,2911],{"class":1293},[125,21263,3692],{"class":965},[125,21265,1290],{"class":131},[125,21267,21268],{"class":965},"env)\n",[125,21270,21271,21273,21275,21278,21280,21282,21284,21286,21288,21290],{"class":127,"line":302},[125,21272,1126],{"class":1125},[125,21274,19705],{"class":141},[125,21276,21277],{"class":159}," Env",[125,21279,1209],{"class":131},[125,21281,2650],{"class":159},[125,21283,1290],{"class":131},[125,21285,4758],{"class":159},[125,21287,21074],{"class":131},[125,21289,21257],{"class":965},[125,21291,3937],{"class":131},[110,21293,21295],{"id":21294},"_3-database-migrations-with-type-safety","3. Database Migrations with Type Safety",[115,21297,21299],{"className":1112,"code":21298,"language":184,"meta":120,"style":120},"// 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",[122,21300,21301,21306,21326,21330,21345,21355,21360,21365,21370,21375,21380,21385,21390,21394,21398,21413,21426],{"__ignoreMap":120},[125,21302,21303],{"class":127,"line":128},[125,21304,21305],{"class":385},"// db/migrations/001_create_users.ts\n",[125,21307,21308,21310,21312,21315,21317,21319,21321,21324],{"class":127,"line":135},[125,21309,1468],{"class":1125},[125,21311,1471],{"class":131},[125,21313,21314],{"class":965}," sql",[125,21316,1487],{"class":131},[125,21318,1490],{"class":1125},[125,21320,167],{"class":131},[125,21322,21323],{"class":170},"drizzle-orm",[125,21325,279],{"class":131},[125,21327,21328],{"class":127,"line":16},[125,21329,978],{"emptyLinePlaceholder":977},[125,21331,21332,21334,21336,21338,21341,21343],{"class":127,"line":179},[125,21333,1126],{"class":1125},[125,21335,4029],{"class":141},[125,21337,4963],{"class":141},[125,21339,21340],{"class":1293}," up",[125,21342,2739],{"class":131},[125,21344,151],{"class":131},[125,21346,21347,21350,21352],{"class":127,"line":200},[125,21348,21349],{"class":1125}," await",[125,21351,21314],{"class":1293},[125,21353,21354],{"class":131},"`\n",[125,21356,21357],{"class":127,"line":221},[125,21358,21359],{"class":170}," CREATE TABLE users (\n",[125,21361,21362],{"class":127,"line":242},[125,21363,21364],{"class":170}," id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n",[125,21366,21367],{"class":127,"line":263},[125,21368,21369],{"class":170}," email TEXT NOT NULL UNIQUE,\n",[125,21371,21372],{"class":127,"line":282},[125,21373,21374],{"class":170}," name TEXT NOT NULL,\n",[125,21376,21377],{"class":127,"line":288},[125,21378,21379],{"class":170}," created_at TIMESTAMPTZ DEFAULT NOW()\n",[125,21381,21382],{"class":127,"line":302},[125,21383,21384],{"class":170}," )\n",[125,21386,21387],{"class":127,"line":323},[125,21388,21389],{"class":131}," `\n",[125,21391,21392],{"class":127,"line":29},[125,21393,371],{"class":131},[125,21395,21396],{"class":127,"line":362},[125,21397,978],{"emptyLinePlaceholder":977},[125,21399,21400,21402,21404,21406,21409,21411],{"class":127,"line":368},[125,21401,1126],{"class":1125},[125,21403,4029],{"class":141},[125,21405,4963],{"class":141},[125,21407,21408],{"class":1293}," down",[125,21410,2739],{"class":131},[125,21412,151],{"class":131},[125,21414,21415,21417,21419,21421,21424],{"class":127,"line":601},[125,21416,21349],{"class":1125},[125,21418,21314],{"class":1293},[125,21420,1432],{"class":131},[125,21422,21423],{"class":170},"DROP TABLE users",[125,21425,21354],{"class":131},[125,21427,21428],{"class":127,"line":615},[125,21429,371],{"class":131},[98,21431,21433],{"id":21432},"real-world-example-e-commerce-product-api","Real-World Example: E-Commerce Product API",[110,21435,21437],{"id":21436},"database-schema","Database Schema",[115,21439,21441],{"className":1112,"code":21440,"language":184,"meta":120,"style":120},"// 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",[122,21442,21443,21448,21473,21499,21525,21547,21575,21609,21650],{"__ignoreMap":120},[125,21444,21445],{"class":127,"line":128},[125,21446,21447],{"class":385},"// db/schema/products.ts\n",[125,21449,21450,21452,21454,21456,21458,21460,21462,21464,21467,21469,21471],{"class":127,"line":135},[125,21451,1126],{"class":1125},[125,21453,1526],{"class":141},[125,21455,12513],{"class":965},[125,21457,1532],{"class":131},[125,21459,19418],{"class":1293},[125,21461,1247],{"class":965},[125,21463,145],{"class":131},[125,21465,21466],{"class":170},"products",[125,21468,145],{"class":131},[125,21470,735],{"class":131},[125,21472,151],{"class":131},[125,21474,21475,21477,21479,21481,21483,21485,21487,21489,21491,21493,21495,21497],{"class":127,"line":16},[125,21476,2492],{"class":1151},[125,21478,148],{"class":131},[125,21480,19433],{"class":1293},[125,21482,1247],{"class":965},[125,21484,145],{"class":131},[125,21486,2095],{"class":170},[125,21488,145],{"class":131},[125,21490,1349],{"class":965},[125,21492,1290],{"class":131},[125,21494,19538],{"class":1293},[125,21496,2739],{"class":965},[125,21498,176],{"class":131},[125,21500,21501,21503,21505,21507,21509,21511,21513,21515,21517,21519,21521,21523],{"class":127,"line":179},[125,21502,2455],{"class":1151},[125,21504,148],{"class":131},[125,21506,19423],{"class":1293},[125,21508,1247],{"class":965},[125,21510,145],{"class":131},[125,21512,11754],{"class":170},[125,21514,145],{"class":131},[125,21516,1349],{"class":965},[125,21518,1290],{"class":131},[125,21520,19572],{"class":1293},[125,21522,2739],{"class":965},[125,21524,176],{"class":131},[125,21526,21527,21530,21532,21534,21536,21538,21541,21543,21545],{"class":127,"line":200},[125,21528,21529],{"class":1151}," description",[125,21531,148],{"class":131},[125,21533,19423],{"class":1293},[125,21535,1247],{"class":965},[125,21537,145],{"class":131},[125,21539,21540],{"class":170},"description",[125,21542,145],{"class":131},[125,21544,1349],{"class":965},[125,21546,176],{"class":131},[125,21548,21549,21551,21553,21556,21558,21560,21563,21565,21567,21569,21571,21573],{"class":127,"line":221},[125,21550,12444],{"class":1151},[125,21552,148],{"class":131},[125,21554,21555],{"class":1293}," numeric",[125,21557,1247],{"class":965},[125,21559,145],{"class":131},[125,21561,21562],{"class":170},"price",[125,21564,145],{"class":131},[125,21566,1349],{"class":965},[125,21568,1290],{"class":131},[125,21570,19572],{"class":1293},[125,21572,2739],{"class":965},[125,21574,176],{"class":131},[125,21576,21577,21580,21582,21585,21587,21589,21592,21594,21596,21598,21601,21603,21605,21607],{"class":127,"line":242},[125,21578,21579],{"class":1151}," inventory",[125,21581,148],{"class":131},[125,21583,21584],{"class":1293}," integer",[125,21586,1247],{"class":965},[125,21588,145],{"class":131},[125,21590,21591],{"class":170},"inventory",[125,21593,145],{"class":131},[125,21595,1349],{"class":965},[125,21597,1290],{"class":131},[125,21599,21600],{"class":1293},"default",[125,21602,1247],{"class":965},[125,21604,3074],{"class":961},[125,21606,1349],{"class":965},[125,21608,176],{"class":131},[125,21610,21611,21614,21616,21618,21620,21622,21625,21627,21629,21631,21634,21636,21638,21640,21643,21645,21648],{"class":127,"line":263},[125,21612,21613],{"class":1151}," categoryId",[125,21615,148],{"class":131},[125,21617,19433],{"class":1293},[125,21619,1247],{"class":965},[125,21621,145],{"class":131},[125,21623,21624],{"class":170},"category_id",[125,21626,145],{"class":131},[125,21628,1349],{"class":965},[125,21630,1290],{"class":131},[125,21632,21633],{"class":1293},"references",[125,21635,1247],{"class":965},[125,21637,2739],{"class":131},[125,21639,3898],{"class":141},[125,21641,21642],{"class":965}," categories",[125,21644,1290],{"class":131},[125,21646,21647],{"class":965},"id)",[125,21649,176],{"class":131},[125,21651,21652,21654],{"class":127,"line":282},[125,21653,1426],{"class":131},[125,21655,1253],{"class":965},[110,21657,21659],{"id":21658},"api-route","API Route",[115,21661,21663],{"className":1112,"code":21662,"language":184,"meta":120,"style":120},"// 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",[122,21664,21665,21670,21680,21691,21742,21756,21788,21792,21823,21847,21856,21867,21878,21883,21889,21893,21908,21941,21945,21949,21973,21977],{"__ignoreMap":120},[125,21666,21667],{"class":127,"line":128},[125,21668,21669],{"class":385},"// server/routes/api/products.ts\n",[125,21671,21672,21674,21676,21678],{"class":127,"line":135},[125,21673,19851],{"class":965},[125,21675,1290],{"class":131},[125,21677,11816],{"class":1293},[125,21679,1183],{"class":965},[125,21681,21682,21684,21687,21689],{"class":127,"line":16},[125,21683,138],{"class":131},[125,21685,21686],{"class":170},"/products/:id",[125,21688,145],{"class":131},[125,21690,176],{"class":131},[125,21692,21693,21696,21698,21700,21703,21705,21707,21709,21711,21713,21715,21717,21719,21721,21723,21725,21727,21729,21731,21733,21735,21737,21740],{"class":127,"line":179},[125,21694,21695],{"class":1293}," zValidator",[125,21697,1247],{"class":965},[125,21699,145],{"class":131},[125,21701,21702],{"class":170},"param",[125,21704,145],{"class":131},[125,21706,735],{"class":131},[125,21708,2650],{"class":965},[125,21710,1290],{"class":131},[125,21712,2719],{"class":1293},[125,21714,1247],{"class":965},[125,21716,3553],{"class":131},[125,21718,2153],{"class":1151},[125,21720,148],{"class":131},[125,21722,2650],{"class":965},[125,21724,1290],{"class":131},[125,21726,2736],{"class":1293},[125,21728,2739],{"class":965},[125,21730,1290],{"class":131},[125,21732,21022],{"class":1293},[125,21734,3968],{"class":965},[125,21736,1426],{"class":131},[125,21738,21739],{"class":965},"))",[125,21741,176],{"class":131},[125,21743,21744,21746,21748,21750,21752,21754],{"class":127,"line":200},[125,21745,2087],{"class":141},[125,21747,1597],{"class":131},[125,21749,19889],{"class":1188},[125,21751,1349],{"class":131},[125,21753,3898],{"class":141},[125,21755,151],{"class":131},[125,21757,21758,21760,21762,21764,21766,21768,21770,21772,21774,21776,21778,21780,21782,21784,21786],{"class":127,"line":221},[125,21759,4040],{"class":141},[125,21761,1471],{"class":131},[125,21763,2153],{"class":965},[125,21765,1487],{"class":131},[125,21767,1209],{"class":131},[125,21769,17064],{"class":965},[125,21771,1290],{"class":131},[125,21773,2861],{"class":965},[125,21775,1290],{"class":131},[125,21777,19914],{"class":1293},[125,21779,1247],{"class":1151},[125,21781,145],{"class":131},[125,21783,21702],{"class":170},[125,21785,145],{"class":131},[125,21787,1253],{"class":1151},[125,21789,21790],{"class":127,"line":242},[125,21791,978],{"emptyLinePlaceholder":977},[125,21793,21794,21796,21799,21801,21803,21805,21807,21810,21812,21814,21816,21819,21821],{"class":127,"line":263},[125,21795,4040],{"class":141},[125,21797,21798],{"class":965}," product",[125,21800,1209],{"class":131},[125,21802,2934],{"class":1125},[125,21804,19946],{"class":965},[125,21806,1290],{"class":131},[125,21808,21809],{"class":965},"query",[125,21811,1290],{"class":131},[125,21813,21466],{"class":965},[125,21815,1290],{"class":131},[125,21817,21818],{"class":1293},"findFirst",[125,21820,1247],{"class":1151},[125,21822,132],{"class":131},[125,21824,21825,21827,21829,21831,21833,21835,21837,21839,21841,21843,21845],{"class":127,"line":282},[125,21826,2146],{"class":1151},[125,21828,148],{"class":131},[125,21830,12580],{"class":1293},[125,21832,1247],{"class":1151},[125,21834,21466],{"class":965},[125,21836,1290],{"class":131},[125,21838,2095],{"class":965},[125,21840,735],{"class":131},[125,21842,2153],{"class":965},[125,21844,1349],{"class":1151},[125,21846,176],{"class":131},[125,21848,21849,21852,21854],{"class":127,"line":288},[125,21850,21851],{"class":1151}," with",[125,21853,148],{"class":131},[125,21855,151],{"class":131},[125,21857,21858,21861,21863,21865],{"class":127,"line":302},[125,21859,21860],{"class":1151}," category",[125,21862,148],{"class":131},[125,21864,1230],{"class":1229},[125,21866,176],{"class":131},[125,21868,21869,21872,21874,21876],{"class":127,"line":323},[125,21870,21871],{"class":1151}," images",[125,21873,148],{"class":131},[125,21875,1230],{"class":1229},[125,21877,176],{"class":131},[125,21879,21880],{"class":127,"line":29},[125,21881,21882],{"class":131}," },\n",[125,21884,21885,21887],{"class":127,"line":362},[125,21886,1729],{"class":131},[125,21888,1253],{"class":1151},[125,21890,21891],{"class":127,"line":368},[125,21892,978],{"emptyLinePlaceholder":977},[125,21894,21895,21897,21899,21901,21904,21906],{"class":127,"line":601},[125,21896,15679],{"class":1125},[125,21898,1597],{"class":1151},[125,21900,14572],{"class":131},[125,21902,21903],{"class":965},"product",[125,21905,1584],{"class":1151},[125,21907,132],{"class":131},[125,21909,21910,21913,21915,21917,21919,21921,21923,21925,21927,21929,21932,21934,21937,21939],{"class":127,"line":615},[125,21911,21912],{"class":1125}," return",[125,21914,17064],{"class":965},[125,21916,1290],{"class":131},[125,21918,119],{"class":1293},[125,21920,1247],{"class":1151},[125,21922,3553],{"class":131},[125,21924,1665],{"class":1151},[125,21926,148],{"class":131},[125,21928,167],{"class":131},[125,21930,21931],{"class":170},"Product not found",[125,21933,145],{"class":131},[125,21935,21936],{"class":131}," },",[125,21938,1437],{"class":961},[125,21940,1253],{"class":1151},[125,21942,21943],{"class":127,"line":629},[125,21944,3133],{"class":131},[125,21946,21947],{"class":127,"line":643},[125,21948,978],{"emptyLinePlaceholder":977},[125,21950,21951,21953,21955,21957,21959,21961,21963,21965,21967,21969,21971],{"class":127,"line":657},[125,21952,1614],{"class":1125},[125,21954,17064],{"class":965},[125,21956,1290],{"class":131},[125,21958,119],{"class":1293},[125,21960,1247],{"class":1151},[125,21962,3553],{"class":131},[125,21964,2263],{"class":1151},[125,21966,148],{"class":131},[125,21968,21798],{"class":965},[125,21970,1487],{"class":131},[125,21972,1253],{"class":1151},[125,21974,21975],{"class":127,"line":671},[125,21976,285],{"class":131},[125,21978,21979],{"class":127,"line":686},[125,21980,1253],{"class":965},[110,21982,21984],{"id":21983},"frontend-component","Frontend Component",[115,21986,21990],{"className":21987,"code":21988,"language":21989,"meta":120,"style":120},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\n\n\n\n","vue",[122,21991,21992,21997,22019,22039,22043,22058,22068,22075,22079,22097,22123,22139,22154,22183,22187,22195,22199,22208,22228,22246,22263,22272],{"__ignoreMap":120},[125,21993,21994],{"class":127,"line":128},[125,21995,21996],{"class":385},"\n",[125,21998,21999,22001,22003,22006,22009,22011,22013,22015,22017],{"class":127,"line":135},[125,22000,2108],{"class":131},[125,22002,20838],{"class":1151},[125,22004,22005],{"class":141}," setup",[125,22007,22008],{"class":141}," lang",[125,22010,1532],{"class":131},[125,22012,145],{"class":131},[125,22014,20572],{"class":170},[125,22016,145],{"class":131},[125,22018,3937],{"class":131},[125,22020,22021,22023,22025,22027,22029,22031,22033,22035,22037],{"class":127,"line":16},[125,22022,1468],{"class":1125},[125,22024,19705],{"class":1125},[125,22026,1471],{"class":131},[125,22028,12421],{"class":965},[125,22030,1487],{"class":131},[125,22032,1490],{"class":1125},[125,22034,167],{"class":131},[125,22036,19816],{"class":170},[125,22038,279],{"class":131},[125,22040,22041],{"class":127,"line":179},[125,22042,978],{"emptyLinePlaceholder":977},[125,22044,22045,22047,22050,22052,22055],{"class":127,"line":200},[125,22046,1883],{"class":141},[125,22048,22049],{"class":965}," props ",[125,22051,1532],{"class":131},[125,22053,22054],{"class":1293}," defineProps",[125,22056,22057],{"class":131},"<{\n",[125,22059,22060,22063,22065],{"class":127,"line":221},[125,22061,22062],{"class":1151}," product",[125,22064,148],{"class":131},[125,22066,22067],{"class":159}," Product\n",[125,22069,22070,22073],{"class":127,"line":242},[125,22071,22072],{"class":131},"}>",[125,22074,1955],{"class":965},[125,22076,22077],{"class":127,"line":263},[125,22078,978],{"emptyLinePlaceholder":977},[125,22080,22081,22083,22086,22088,22091,22093,22095],{"class":127,"line":282},[125,22082,1883],{"class":141},[125,22084,22085],{"class":965}," formattedPrice ",[125,22087,1532],{"class":131},[125,22089,22090],{"class":1293}," computed",[125,22092,1247],{"class":965},[125,22094,2739],{"class":131},[125,22096,20448],{"class":141},[125,22098,22099,22102,22105,22107,22110,22112,22114,22117,22119,22121],{"class":127,"line":288},[125,22100,22101],{"class":131}," new",[125,22103,22104],{"class":965}," Intl",[125,22106,1290],{"class":131},[125,22108,22109],{"class":1293},"NumberFormat",[125,22111,1247],{"class":965},[125,22113,145],{"class":131},[125,22115,22116],{"class":170},"en-US",[125,22118,145],{"class":131},[125,22120,735],{"class":131},[125,22122,151],{"class":131},[125,22124,22125,22128,22130,22132,22135,22137],{"class":127,"line":302},[125,22126,22127],{"class":1151}," style",[125,22129,148],{"class":131},[125,22131,167],{"class":131},[125,22133,22134],{"class":170},"currency",[125,22136,145],{"class":131},[125,22138,176],{"class":131},[125,22140,22141,22144,22146,22148,22150,22152],{"class":127,"line":323},[125,22142,22143],{"class":1151}," currency",[125,22145,148],{"class":131},[125,22147,167],{"class":131},[125,22149,41],{"class":170},[125,22151,145],{"class":131},[125,22153,176],{"class":131},[125,22155,22156,22158,22160,22162,22164,22166,22169,22172,22174,22176,22178,22181],{"class":127,"line":29},[125,22157,1830],{"class":131},[125,22159,1349],{"class":965},[125,22161,1290],{"class":131},[125,22163,3511],{"class":1293},[125,22165,1247],{"class":965},[125,22167,22168],{"class":1293},"Number",[125,22170,22171],{"class":965},"(props",[125,22173,1290],{"class":131},[125,22175,21903],{"class":965},[125,22177,1290],{"class":131},[125,22179,22180],{"class":965},"price))",[125,22182,176],{"class":131},[125,22184,22185],{"class":127,"line":362},[125,22186,1253],{"class":965},[125,22188,22189,22191,22193],{"class":127,"line":368},[125,22190,20835],{"class":131},[125,22192,20838],{"class":1151},[125,22194,3937],{"class":131},[125,22196,22197],{"class":127,"line":601},[125,22198,978],{"emptyLinePlaceholder":977},[125,22200,22201,22203,22206],{"class":127,"line":615},[125,22202,2108],{"class":131},[125,22204,22205],{"class":1151},"template",[125,22207,3937],{"class":131},[125,22209,22210,22213,22215,22217,22219,22221,22224,22226],{"class":127,"line":629},[125,22211,22212],{"class":131}," <",[125,22214,20808],{"class":1151},[125,22216,1129],{"class":141},[125,22218,1532],{"class":131},[125,22220,145],{"class":131},[125,22222,22223],{"class":170},"product-card",[125,22225,145],{"class":131},[125,22227,3937],{"class":131},[125,22229,22230,22233,22235,22237,22240,22242,22244],{"class":127,"line":643},[125,22231,22232],{"class":131}," <",[125,22234,110],{"class":1151},[125,22236,2119],{"class":131},[125,22238,22239],{"class":965},"{{ product.name }}",[125,22241,20835],{"class":131},[125,22243,110],{"class":1151},[125,22245,3937],{"class":131},[125,22247,22248,22250,22252,22254,22257,22259,22261],{"class":127,"line":657},[125,22249,22232],{"class":131},[125,22251,102],{"class":1151},[125,22253,2119],{"class":131},[125,22255,22256],{"class":965},"{{ formattedPrice }}",[125,22258,20835],{"class":131},[125,22260,102],{"class":1151},[125,22262,3937],{"class":131},[125,22264,22265,22268,22270],{"class":127,"line":671},[125,22266,22267],{"class":131}," {\n expectTypeOf(usersApi.getAll()).resolves.toEqualTypeOf()\n})\n\ntest(\"usersApi.create accepts NewUser\", () => {\n expectTypeOf(usersApi.create).parameter(0).toEqualTypeOf()\n})\n",[122,22747,22748,22753,22773,22791,22795,22816,22853,22859,22863,22884,22922],{"__ignoreMap":120},[125,22749,22750],{"class":127,"line":128},[125,22751,22752],{"class":385},"// tests/types.test.ts\n",[125,22754,22755,22757,22759,22762,22764,22766,22768,22771],{"class":127,"line":135},[125,22756,1468],{"class":1125},[125,22758,1471],{"class":131},[125,22760,22761],{"class":965}," expectTypeOf",[125,22763,1487],{"class":131},[125,22765,1490],{"class":1125},[125,22767,167],{"class":131},[125,22769,22770],{"class":170},"expect-type",[125,22772,279],{"class":131},[125,22774,22775,22777,22779,22781,22783,22785,22787,22789],{"class":127,"line":16},[125,22776,1468],{"class":1125},[125,22778,1471],{"class":131},[125,22780,20585],{"class":965},[125,22782,1487],{"class":131},[125,22784,1490],{"class":1125},[125,22786,167],{"class":131},[125,22788,20595],{"class":170},[125,22790,279],{"class":131},[125,22792,22793],{"class":127,"line":179},[125,22794,978],{"emptyLinePlaceholder":977},[125,22796,22797,22799,22801,22803,22806,22808,22810,22812,22814],{"class":127,"line":200},[125,22798,921],{"class":1293},[125,22800,1247],{"class":965},[125,22802,145],{"class":131},[125,22804,22805],{"class":170},"usersApi.getAll returns User[]",[125,22807,145],{"class":131},[125,22809,735],{"class":131},[125,22811,3895],{"class":131},[125,22813,3898],{"class":141},[125,22815,151],{"class":131},[125,22817,22818,22821,22823,22826,22828,22830,22833,22835,22838,22840,22843,22845,22847,22849,22851],{"class":127,"line":221},[125,22819,22820],{"class":1293}," expectTypeOf",[125,22822,1247],{"class":1151},[125,22824,22825],{"class":965},"usersApi",[125,22827,1290],{"class":131},[125,22829,20678],{"class":1293},[125,22831,22832],{"class":1151},"())",[125,22834,1290],{"class":131},[125,22836,22837],{"class":965},"resolves",[125,22839,1290],{"class":131},[125,22841,22842],{"class":1293},"toEqualTypeOf",[125,22844,2108],{"class":131},[125,22846,2111],{"class":159},[125,22848,10184],{"class":1151},[125,22850,2119],{"class":131},[125,22852,1955],{"class":1151},[125,22854,22855,22857],{"class":127,"line":242},[125,22856,1426],{"class":131},[125,22858,1253],{"class":965},[125,22860,22861],{"class":127,"line":263},[125,22862,978],{"emptyLinePlaceholder":977},[125,22864,22865,22867,22869,22871,22874,22876,22878,22880,22882],{"class":127,"line":282},[125,22866,921],{"class":1293},[125,22868,1247],{"class":965},[125,22870,145],{"class":131},[125,22872,22873],{"class":170},"usersApi.create accepts NewUser",[125,22875,145],{"class":131},[125,22877,735],{"class":131},[125,22879,3895],{"class":131},[125,22881,3898],{"class":141},[125,22883,151],{"class":131},[125,22885,22886,22888,22890,22892,22894,22896,22898,22900,22903,22905,22907,22909,22911,22913,22915,22918,22920],{"class":127,"line":288},[125,22887,22820],{"class":1293},[125,22889,1247],{"class":1151},[125,22891,22825],{"class":965},[125,22893,1290],{"class":131},[125,22895,2218],{"class":965},[125,22897,1349],{"class":1151},[125,22899,1290],{"class":131},[125,22901,22902],{"class":1293},"parameter",[125,22904,1247],{"class":1151},[125,22906,3074],{"class":961},[125,22908,1349],{"class":1151},[125,22910,1290],{"class":131},[125,22912,22842],{"class":1293},[125,22914,2108],{"class":131},[125,22916,22917],{"class":159},"NewUser",[125,22919,2119],{"class":131},[125,22921,1955],{"class":1151},[125,22923,22924,22926],{"class":127,"line":302},[125,22925,1426],{"class":131},[125,22927,1253],{"class":965},[98,22929,22931],{"id":22930},"performance-considerations","Performance Considerations",[102,22933,22934],{},"Type safety doesn't have to impact performance:",[4348,22936,22937,22943,22953,22962],{},[4314,22938,22939,22942],{},[4343,22940,22941],{},"Tree-shaking",": Unused types are removed in production",[4314,22944,22945,22948,22949,22952],{},[4343,22946,22947],{},"Type-only imports",": Use ",[122,22950,22951],{},"import type"," to avoid runtime overhead",[4314,22954,22955,22948,22958,22961],{},[4343,22956,22957],{},"Zod optimization",[122,22959,22960],{},"z.safeParse()"," for better performance",[4314,22963,22964,22967],{},[4343,22965,22966],{},"Code splitting",": Split types by feature/route",[98,22969,4303],{"id":4302},[102,22971,22972],{},"End-to-end type safety is no longer optional in 2026—it's a fundamental requirement for building reliable, maintainable applications. By leveraging modern tools like TypeScript, Zod, and type-safe frameworks, you can catch errors before they reach production and provide a better developer experience.",[102,22974,22975],{},"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.",[4333,22977],{},[102,22979,22980,22983],{},[4343,22981,22982],{},"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.",[4384,22985,22986],{},"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":120,"searchDepth":135,"depth":135,"links":22988},[22989,22990,22991,22995,23001,23006,23011,23016,23021,23022,23023],{"id":19282,"depth":135,"text":19277},{"id":19288,"depth":135,"text":19289},{"id":19323,"depth":135,"text":19324,"children":22992},[22993,22994],{"id":19327,"depth":16,"text":19328},{"id":19361,"depth":16,"text":19362},{"id":19391,"depth":135,"text":19392,"children":22996},[22997,22998,22999,23000],{"id":19395,"depth":16,"text":19396},{"id":19742,"depth":16,"text":19743},{"id":20101,"depth":16,"text":20102},{"id":20547,"depth":16,"text":20548},{"id":20843,"depth":135,"text":20844,"children":23002},[23003,23004,23005],{"id":20847,"depth":16,"text":20848},{"id":21086,"depth":16,"text":21087},{"id":21294,"depth":16,"text":21295},{"id":21432,"depth":135,"text":21433,"children":23007},[23008,23009,23010],{"id":21436,"depth":16,"text":21437},{"id":21658,"depth":16,"text":21659},{"id":21983,"depth":16,"text":21984},{"id":22282,"depth":135,"text":22283,"children":23012},[23013,23014,23015],{"id":22286,"depth":16,"text":22287},{"id":22350,"depth":16,"text":22351},{"id":22570,"depth":16,"text":22571},{"id":22659,"depth":135,"text":22660,"children":23017},[23018,23019,23020],{"id":22663,"depth":16,"text":22664},{"id":22693,"depth":16,"text":22694},{"id":22717,"depth":16,"text":22718},{"id":22741,"depth":135,"text":22742},{"id":22930,"depth":135,"text":22931},{"id":4302,"depth":135,"text":4303},"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":23027},"11 min read","/blog/27-end-to-end-type-safety-guide-2026",{"title":19277,"description":23025},"Advanced TypeScript patterns for full-stack development",{"src":23032,"mime":5167,"alt":23033,"width":5169,"height":5170},"/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",[4432,5174,23036,22701,23037],"Full-Stack","API Design","N8RnEQivPlHqHoUy1OdwWQLnfChWlNh-gR5oMZhHnsA",[23040,23629,26413],{"id":4439,"title":4440,"abstract":92,"author":93,"authorUrl":92,"body":23041,"date":5158,"dateUpdated":5158,"description":5159,"excerpt":92,"extension":4424,"featured":977,"headline":92,"image":92,"meta":23625,"navigation":977,"ogImage":92,"path":5162,"seo":23626,"series":4345,"seriesDescription":5164,"seriesOrder":128,"socialImage":23627,"stem":5171,"tags":23628,"__hash__":5177},{"type":95,"value":23042,"toc":23595},[23043,23045,23047,23049,23051,23053,23055,23057,23211,23213,23215,23217,23219,23221,23223,23227,23229,23231,23233,23235,23237,23239,23345,23347,23349,23351,23353,23355,23357,23359,23361,23363,23365,23367,23369,23371,23373,23375,23377,23379,23551,23553,23555,23557,23559,23561,23563,23585,23587,23589,23591,23593],[98,23044,4440],{"id":4445},[102,23046,4448],{},[102,23048,4451],{},[98,23050,4455],{"id":4454},[102,23052,4458],{},[110,23054,4462],{"id":4461},[102,23056,4465],{},[115,23058,23059],{"className":1112,"code":4468,"language":184,"meta":120,"style":120},[122,23060,23061,23065,23097,23107,23111,23133,23137,23141,23175,23185,23189],{"__ignoreMap":120},[125,23062,23063],{"class":127,"line":128},[125,23064,4475],{"class":385},[125,23066,23067,23069,23071,23073,23075,23077,23079,23081,23083,23085,23087,23089,23091,23093,23095],{"class":127,"line":135},[125,23068,4480],{"class":141},[125,23070,4483],{"class":1293},[125,23072,2108],{"class":131},[125,23074,2552],{"class":159},[125,23076,4490],{"class":131},[125,23078,4493],{"class":1188},[125,23080,148],{"class":131},[125,23082,4498],{"class":159},[125,23084,2102],{"class":131},[125,23086,1471],{"class":131},[125,23088,4505],{"class":1151},[125,23090,148],{"class":131},[125,23092,4498],{"class":159},[125,23094,1487],{"class":131},[125,23096,151],{"class":131},[125,23098,23099,23101,23103,23105],{"class":127,"line":16},[125,23100,4518],{"class":1125},[125,23102,1471],{"class":131},[125,23104,4505],{"class":965},[125,23106,4525],{"class":131},[125,23108,23109],{"class":127,"line":179},[125,23110,371],{"class":131},[125,23112,23113,23115,23117,23119,23121,23123,23125,23127,23129,23131],{"class":127,"line":200},[125,23114,1883],{"class":141},[125,23116,4536],{"class":965},[125,23118,1532],{"class":131},[125,23120,4483],{"class":1293},[125,23122,1247],{"class":965},[125,23124,145],{"class":131},[125,23126,4547],{"class":170},[125,23128,145],{"class":131},[125,23130,1584],{"class":965},[125,23132,4554],{"class":385},[125,23134,23135],{"class":127,"line":221},[125,23136,978],{"emptyLinePlaceholder":977},[125,23138,23139],{"class":127,"line":242},[125,23140,4563],{"class":385},[125,23142,23143,23145,23147,23149,23151,23153,23155,23157,23159,23161,23163,23165,23167,23169,23171,23173],{"class":127,"line":263},[125,23144,4480],{"class":141},[125,23146,4483],{"class":1293},[125,23148,2108],{"class":131},[125,23150,1883],{"class":141},[125,23152,4498],{"class":159},[125,23154,4490],{"class":131},[125,23156,4493],{"class":1188},[125,23158,148],{"class":131},[125,23160,4498],{"class":159},[125,23162,2102],{"class":131},[125,23164,1471],{"class":131},[125,23166,4505],{"class":1151},[125,23168,148],{"class":131},[125,23170,4498],{"class":159},[125,23172,1487],{"class":131},[125,23174,151],{"class":131},[125,23176,23177,23179,23181,23183],{"class":127,"line":282},[125,23178,4518],{"class":1125},[125,23180,1471],{"class":131},[125,23182,4505],{"class":965},[125,23184,4525],{"class":131},[125,23186,23187],{"class":127,"line":288},[125,23188,371],{"class":131},[125,23190,23191,23193,23195,23197,23199,23201,23203,23205,23207,23209],{"class":127,"line":302},[125,23192,1883],{"class":141},[125,23194,4536],{"class":965},[125,23196,1532],{"class":131},[125,23198,4483],{"class":1293},[125,23200,1247],{"class":965},[125,23202,145],{"class":131},[125,23204,4547],{"class":170},[125,23206,145],{"class":131},[125,23208,1584],{"class":965},[125,23210,4634],{"class":385},[102,23212,4637],{},[110,23214,4641],{"id":4640},[102,23216,4644],{},[98,23218,4648],{"id":4647},[102,23220,4651],{},[110,23222,4655],{"id":4654},[102,23224,4658,23225,4662],{},[122,23226,4661],{},[110,23228,4666],{"id":4665},[102,23230,4669],{},[98,23232,4673],{"id":4672},[102,23234,4676],{},[110,23236,4680],{"id":4679},[102,23238,4683],{},[115,23240,23241],{"className":1112,"code":4686,"language":184,"meta":120,"style":120},[122,23242,23243,23269,23311,23317,23323],{"__ignoreMap":120},[125,23244,23245,23247,23249,23251,23253,23255,23257,23259,23261,23263,23265,23267],{"class":127,"line":128},[125,23246,4693],{"class":141},[125,23248,4696],{"class":159},[125,23250,1209],{"class":131},[125,23252,4701],{"class":131},[125,23254,4704],{"class":170},[125,23256,4707],{"class":131},[125,23258,2736],{"class":159},[125,23260,1426],{"class":131},[125,23262,4714],{"class":170},[125,23264,4707],{"class":131},[125,23266,4719],{"class":159},[125,23268,4722],{"class":131},[125,23270,23271,23273,23275,23277,23279,23281,23283,23285,23287,23289,23291,23293,23295,23297,23299,23301,23303,23305,23307,23309],{"class":127,"line":135},[125,23272,4693],{"class":141},[125,23274,4729],{"class":159},[125,23276,2108],{"class":131},[125,23278,2552],{"class":159},[125,23280,2119],{"class":131},[125,23282,1209],{"class":131},[125,23284,4498],{"class":159},[125,23286,1135],{"class":141},[125,23288,4701],{"class":131},[125,23290,4704],{"class":170},[125,23292,4707],{"class":131},[125,23294,2736],{"class":159},[125,23296,1426],{"class":131},[125,23298,4714],{"class":170},[125,23300,4707],{"class":131},[125,23302,4758],{"class":131},[125,23304,4761],{"class":159},[125,23306,1135],{"class":131},[125,23308,1206],{"class":159},[125,23310,4722],{"class":131},[125,23312,23313,23315],{"class":127,"line":16},[125,23314,4772],{"class":131},[125,23316,4775],{"class":159},[125,23318,23319,23321],{"class":127,"line":179},[125,23320,4780],{"class":131},[125,23322,4783],{"class":159},[125,23324,23325,23327,23329,23331,23333,23335,23337,23339,23341,23343],{"class":127,"line":200},[125,23326,4693],{"class":141},[125,23328,4790],{"class":159},[125,23330,1209],{"class":131},[125,23332,4729],{"class":159},[125,23334,2108],{"class":131},[125,23336,1432],{"class":131},[125,23338,4801],{"class":170},[125,23340,1432],{"class":131},[125,23342,2119],{"class":131},[125,23344,4808],{"class":385},[110,23346,4812],{"id":4811},[102,23348,4815],{},[98,23350,4819],{"id":4818},[102,23352,4822],{},[110,23354,4826],{"id":4825},[102,23356,4829],{},[110,23358,4833],{"id":4832},[102,23360,4836],{},[98,23362,4840],{"id":4839},[102,23364,4843],{},[110,23366,4847],{"id":4846},[102,23368,4850],{},[110,23370,4854],{"id":4853},[102,23372,4857],{},[98,23374,4861],{"id":4860},[110,23376,4865],{"id":4864},[102,23378,4868],{},[115,23380,23381],{"className":1112,"code":4871,"language":184,"meta":120,"style":120},[122,23382,23383,23387,23403,23411,23419,23427,23447,23451,23455,23459,23469,23479,23509,23535,23547],{"__ignoreMap":120},[125,23384,23385],{"class":127,"line":128},[125,23386,4878],{"class":385},[125,23388,23389,23391,23393,23395,23397,23399,23401],{"class":127,"line":135},[125,23390,4693],{"class":141},[125,23392,2547],{"class":159},[125,23394,2108],{"class":131},[125,23396,2552],{"class":159},[125,23398,2119],{"class":131},[125,23400,1209],{"class":131},[125,23402,151],{"class":131},[125,23404,23405,23407,23409],{"class":127,"line":16},[125,23406,2574],{"class":1151},[125,23408,148],{"class":131},[125,23410,2580],{"class":159},[125,23412,23413,23415,23417],{"class":127,"line":179},[125,23414,4907],{"class":1151},[125,23416,148],{"class":131},[125,23418,151],{"class":131},[125,23420,23421,23423,23425],{"class":127,"line":200},[125,23422,4916],{"class":1151},[125,23424,148],{"class":131},[125,23426,2450],{"class":159},[125,23428,23429,23431,23433,23435,23437,23439,23441,23443,23445],{"class":127,"line":221},[125,23430,4925],{"class":1151},[125,23432,148],{"class":131},[125,23434,167],{"class":131},[125,23436,4932],{"class":170},[125,23438,145],{"class":131},[125,23440,1914],{"class":131},[125,23442,167],{"class":131},[125,23444,4941],{"class":170},[125,23446,279],{"class":131},[125,23448,23449],{"class":127,"line":242},[125,23450,365],{"class":131},[125,23452,23453],{"class":127,"line":263},[125,23454,371],{"class":131},[125,23456,23457],{"class":127,"line":282},[125,23458,978],{"emptyLinePlaceholder":977},[125,23460,23461,23463,23465,23467],{"class":127,"line":288},[125,23462,4960],{"class":141},[125,23464,4963],{"class":141},[125,23466,4966],{"class":1293},[125,23468,1183],{"class":131},[125,23470,23471,23473,23475,23477],{"class":127,"line":302},[125,23472,2492],{"class":1188},[125,23474,148],{"class":131},[125,23476,1206],{"class":159},[125,23478,176],{"class":131},[125,23480,23481,23483,23485,23487,23489,23491,23493,23495,23497,23499,23501,23503,23505,23507],{"class":127,"line":323},[125,23482,2102],{"class":131},[125,23484,2105],{"class":159},[125,23486,2108],{"class":131},[125,23488,4989],{"class":159},[125,23490,4992],{"class":131},[125,23492,2153],{"class":1151},[125,23494,148],{"class":131},[125,23496,1206],{"class":159},[125,23498,5001],{"class":131},[125,23500,5004],{"class":1151},[125,23502,148],{"class":131},[125,23504,1194],{"class":159},[125,23506,5011],{"class":131},[125,23508,151],{"class":131},[125,23510,23511,23513,23515,23517,23519,23521,23523,23525,23527,23529,23531,23533],{"class":127,"line":29},[125,23512,5018],{"class":141},[125,23514,5021],{"class":965},[125,23516,1209],{"class":131},[125,23518,2934],{"class":1125},[125,23520,5028],{"class":1293},[125,23522,1247],{"class":1151},[125,23524,1432],{"class":131},[125,23526,5035],{"class":170},[125,23528,4707],{"class":131},[125,23530,2095],{"class":965},[125,23532,5042],{"class":131},[125,23534,1253],{"class":1151},[125,23536,23537,23539,23541,23543,23545],{"class":127,"line":362},[125,23538,4518],{"class":1125},[125,23540,5021],{"class":965},[125,23542,1290],{"class":131},[125,23544,119],{"class":1293},[125,23546,1955],{"class":1151},[125,23548,23549],{"class":127,"line":368},[125,23550,371],{"class":131},[110,23552,5064],{"id":5063},[102,23554,5067],{},[110,23556,5071],{"id":5070},[102,23558,5074],{},[98,23560,5078],{"id":5077},[102,23562,5081],{},[4348,23564,23565,23569,23573,23577,23581],{},[4314,23566,23567,5089],{},[4343,23568,5088],{},[4314,23570,23571,5095],{},[4343,23572,5094],{},[4314,23574,23575,5101],{},[4343,23576,5100],{},[4314,23578,23579,5107],{},[4343,23580,5106],{},[4314,23582,23583,5113],{},[4343,23584,5112],{},[98,23586,4303],{"id":4302},[102,23588,5118],{},[102,23590,5121],{},[102,23592,5124],{},[4384,23594,5127],{},{"title":120,"searchDepth":135,"depth":135,"links":23596},[23597,23598,23602,23606,23610,23614,23618,23623,23624],{"id":4445,"depth":135,"text":4440},{"id":4454,"depth":135,"text":4455,"children":23599},[23600,23601],{"id":4461,"depth":16,"text":4462},{"id":4640,"depth":16,"text":4641},{"id":4647,"depth":135,"text":4648,"children":23603},[23604,23605],{"id":4654,"depth":16,"text":4655},{"id":4665,"depth":16,"text":4666},{"id":4672,"depth":135,"text":4673,"children":23607},[23608,23609],{"id":4679,"depth":16,"text":4680},{"id":4811,"depth":16,"text":4812},{"id":4818,"depth":135,"text":4819,"children":23611},[23612,23613],{"id":4825,"depth":16,"text":4826},{"id":4832,"depth":16,"text":4833},{"id":4839,"depth":135,"text":4840,"children":23615},[23616,23617],{"id":4846,"depth":16,"text":4847},{"id":4853,"depth":16,"text":4854},{"id":4860,"depth":135,"text":4861,"children":23619},[23620,23621,23622],{"id":4864,"depth":16,"text":4865},{"id":5063,"depth":16,"text":5064},{"id":5070,"depth":16,"text":5071},{"id":5077,"depth":135,"text":5078},{"id":4302,"depth":135,"text":4303},{"readingTime":5161},{"title":4440,"description":5159},{"src":5166,"mime":5167,"alt":5168,"width":5169,"height":5170},[4432,5173,5174,5175,5176],{"id":23630,"title":23631,"abstract":92,"author":93,"authorUrl":92,"body":23632,"date":26384,"dateUpdated":26384,"description":26385,"excerpt":92,"extension":4424,"featured":977,"headline":92,"image":92,"meta":26386,"navigation":977,"ogImage":92,"path":26399,"seo":26400,"series":26401,"seriesDescription":26402,"seriesOrder":135,"socialImage":26403,"stem":26406,"tags":26407,"__hash__":26412},"blog/blog/22-nuxt-3-to-4-migration-guide-2026.md","Nuxt 3 to Nuxt 4 Migration Guide: Complete Checklist for 2026",{"type":95,"value":23633,"toc":26327},[23634,23637,23646,23660,23673,23675,23679,23682,23708,23714,23716,23720,23724,23729,23740,23745,23766,23771,23782,23787,23798,23803,23814,23816,23820,23823,23827,23830,23908,23912,23915,23932,23937,23960,23965,23976,23980,23983,23998,24002,24005,24019,24023,24026,24045,24047,24051,24055,24058,24119,24124,24142,24146,24149,24196,24199,24211,24215,24220,24307,24313,24432,24436,24443,24448,24456,24461,24467,24470,24532,24535,24539,24546,24550,24617,24622,24695,24700,24858,24862,24865,24869,24933,24938,25022,25026,25029,25034,25076,25081,25146,25150,25153,25158,25175,25180,25222,25227,25340,25342,25346,25350,25353,25359,25368,25429,25433,25436,25441,25446,25452,25456,25459,25464,25544,25548,25553,25570,25575,25589,25591,25595,25599,25603,25652,25656,25660,25719,25723,25727,25765,25769,25773,25851,25855,25859,25876,25878,25882,25885,25889,25911,25915,25927,25931,25954,25958,25978,25982,25993,25995,25999,26004,26024,26030,26032,26036,26039,26145,26147,26151,26155,26161,26165,26172,26176,26182,26186,26189,26200,26204,26210,26214,26220,26224,26227,26229,26233,26236,26267,26269,26273,26281,26286,26316,26318,26324],[98,23635,23631],{"id":23636},"nuxt-3-to-nuxt-4-migration-guide-complete-checklist-for-2026",[102,23638,23639,23642,23643],{},[4343,23640,23641],{},"Last updated:"," February 2026\n",[4343,23644,23645],{},"What changed in this update:",[4311,23647,23648,23651,23654,23657],{},[4314,23649,23650],{},"Added migration timeline reminder (Nuxt 3 EOL: January 31, 2026)",[4314,23652,23653],{},"Updated codemod tool instructions",[4314,23655,23656],{},"Added new module compatibility matrix",[4314,23658,23659],{},"Expanded troubleshooting section",[23661,23662,23663],"blockquote",{},[102,23664,23665,23668,23669,23672],{},[4343,23666,23667],{},"⚠️ Critical Timeline",": Nuxt 3 official support ends ",[4343,23670,23671],{},"January 31, 2026",". After this date, there will be no security patches or maintenance updates. Migrating to Nuxt 4 is essential for production applications.",[4333,23674],{},[98,23676,23678],{"id":23677},"why-migrate-to-nuxt-4-now","Why Migrate to Nuxt 4 Now?",[102,23680,23681],{},"If you're still on Nuxt 3 in early 2026, you're facing:",[4348,23683,23684,23690,23696,23702],{},[4314,23685,23686,23689],{},[4343,23687,23688],{},"Security risks",": No security patches after January 2026",[4314,23691,23692,23695],{},[4343,23693,23694],{},"Module incompatibility",": New module versions target Nuxt 4+",[4314,23697,23698,23701],{},[4343,23699,23700],{},"Missing features",": Performance improvements and DX enhancements",[4314,23703,23704,23707],{},[4343,23705,23706],{},"No LTS support",": Critical for enterprise applications",[102,23709,23710,23713],{},[4343,23711,23712],{},"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.",[4333,23715],{},[98,23717,23719],{"id":23718},"whats-new-in-nuxt-4","What's New in Nuxt 4?",[110,23721,23723],{"id":23722},"key-improvements","Key Improvements",[102,23725,23726],{},[4343,23727,23728],{},"1. Improved App Directory Structure",[4311,23730,23731,23734,23737],{},[4314,23732,23733],{},"Cleaner separation of concerns",[4314,23735,23736],{},"Better TypeScript integration",[4314,23738,23739],{},"Enhanced auto-imports",[102,23741,23742],{},[4343,23743,23744],{},"2. Smarter Data Fetching",[4311,23746,23747,23757,23760,23763],{},[4314,23748,23749,23752,23753,23756],{},[122,23750,23751],{},"useAsyncData"," and ",[122,23754,23755],{},"useFetch"," automatically share data with same keys",[4314,23758,23759],{},"Automatic cleanup on component unmount",[4314,23761,23762],{},"Reactive keys for automatic refetching",[4314,23764,23765],{},"Better caching strategies",[102,23767,23768],{},[4343,23769,23770],{},"3. Enhanced TypeScript Ergonomics",[4311,23772,23773,23776,23779],{},[4314,23774,23775],{},"Zero-config TypeScript setup",[4314,23777,23778],{},"Better type inference for composables",[4314,23780,23781],{},"Improved module type generation",[102,23783,23784],{},[4343,23785,23786],{},"4. Faster Development Tooling",[4311,23788,23789,23792,23795],{},[4314,23790,23791],{},"Optimized HMR (Hot Module Replacement)",[4314,23793,23794],{},"Faster cold starts",[4314,23796,23797],{},"Improved build performance",[102,23799,23800],{},[4343,23801,23802],{},"5. Nitro v2 Integration",[4311,23804,23805,23808,23811],{},[4314,23806,23807],{},"Better server-side rendering",[4314,23809,23810],{},"Enhanced API routes",[4314,23812,23813],{},"Improved edge deployment support",[4333,23815],{},[98,23817,23819],{"id":23818},"pre-migration-checklist","Pre-Migration Checklist",[102,23821,23822],{},"Before starting the migration, complete these steps:",[110,23824,23826],{"id":23825},"_1-update-dependencies","✅ 1. Update Dependencies",[102,23828,23829],{},"Update to the latest Nuxt 3.x version first:",[115,23831,23833],{"className":22580,"code":23832,"language":22582,"meta":120,"style":120},"# 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",[122,23834,23835,23840,23851,23855,23860,23871,23875,23880,23890,23899],{"__ignoreMap":120},[125,23836,23837],{"class":127,"line":128},[125,23838,23839],{"class":385},"# Check current version\n",[125,23841,23842,23845,23848],{"class":127,"line":135},[125,23843,23844],{"class":159},"npx",[125,23846,23847],{"class":170}," nuxi",[125,23849,23850],{"class":170}," info\n",[125,23852,23853],{"class":127,"line":16},[125,23854,978],{"emptyLinePlaceholder":977},[125,23856,23857],{"class":127,"line":179},[125,23858,23859],{"class":385},"# Update to latest Nuxt 3\n",[125,23861,23862,23865,23868],{"class":127,"line":200},[125,23863,23864],{"class":159},"npm",[125,23866,23867],{"class":170}," install",[125,23869,23870],{"class":170}," nuxt@latest\n",[125,23872,23873],{"class":127,"line":221},[125,23874,978],{"emptyLinePlaceholder":977},[125,23876,23877],{"class":127,"line":242},[125,23878,23879],{"class":385},"# Or with yarn/pnpm/bun\n",[125,23881,23882,23885,23888],{"class":127,"line":263},[125,23883,23884],{"class":159},"yarn",[125,23886,23887],{"class":170}," add",[125,23889,23870],{"class":170},[125,23891,23892,23895,23897],{"class":127,"line":282},[125,23893,23894],{"class":159},"pnpm",[125,23896,23887],{"class":170},[125,23898,23870],{"class":170},[125,23900,23901,23904,23906],{"class":127,"line":288},[125,23902,23903],{"class":159},"bun",[125,23905,23887],{"class":170},[125,23907,23870],{"class":170},[110,23909,23911],{"id":23910},"_2-review-module-compatibility","✅ 2. Review Module Compatibility",[102,23913,23914],{},"Check if your modules support Nuxt 4:",[115,23916,23918],{"className":22580,"code":23917,"language":22582,"meta":120,"style":120},"npx nuxi upgrade --force\n",[122,23919,23920],{"__ignoreMap":120},[125,23921,23922,23924,23926,23929],{"class":127,"line":128},[125,23923,23844],{"class":159},[125,23925,23847],{"class":170},[125,23927,23928],{"class":170}," upgrade",[125,23930,23931],{"class":170}," --force\n",[102,23933,23934],{},[4343,23935,23936],{},"Compatible Modules (Nuxt 4 Ready):",[4311,23938,23939,23942,23945,23948,23951,23954,23957],{},[4314,23940,23941],{},"✅ @nuxt/content (v3+)",[4314,23943,23944],{},"✅ @nuxt/ui (v3+)",[4314,23946,23947],{},"✅ @nuxt/icon",[4314,23949,23950],{},"✅ @nuxtjs/seo",[4314,23952,23953],{},"✅ @nuxtjs/tailwindcss (v6+)",[4314,23955,23956],{},"✅ @pinia/nuxt",[4314,23958,23959],{},"✅ @vueuse/nuxt",[102,23961,23962],{},[4343,23963,23964],{},"Modules Requiring Updates:",[4311,23966,23967,23970,23973],{},[4314,23968,23969],{},"⚠️ @nuxtjs/auth → Use @sidebase/nuxt-auth or nuxt-auth-utils",[4314,23971,23972],{},"⚠️ @nuxtjs/i18n → Update to v8+",[4314,23974,23975],{},"⚠️ Custom server middleware → Migrate to Nitro server routes",[110,23977,23979],{"id":23978},"_3-run-type-check","✅ 3. Run Type Check",[102,23981,23982],{},"Fix all TypeScript errors before migrating:",[115,23984,23986],{"className":22580,"code":23985,"language":22582,"meta":120,"style":120},"npm run type-check\n",[122,23987,23988],{"__ignoreMap":120},[125,23989,23990,23992,23995],{"class":127,"line":128},[125,23991,23864],{"class":159},[125,23993,23994],{"class":170}," run",[125,23996,23997],{"class":170}," type-check\n",[110,23999,24001],{"id":24000},"_4-update-test-suite","✅ 4. Update Test Suite",[102,24003,24004],{},"Ensure all tests pass on Nuxt 3 before migration:",[115,24006,24008],{"className":22580,"code":24007,"language":22582,"meta":120,"style":120},"npm run test\n",[122,24009,24010],{"__ignoreMap":120},[125,24011,24012,24014,24016],{"class":127,"line":128},[125,24013,23864],{"class":159},[125,24015,23994],{"class":170},[125,24017,24018],{"class":170}," test\n",[110,24020,24022],{"id":24021},"_5-backup-your-code","✅ 5. Backup Your Code",[102,24024,24025],{},"Create a git branch for migration:",[115,24027,24029],{"className":22580,"code":24028,"language":22582,"meta":120,"style":120},"git checkout -b migration/nuxt-4\n",[122,24030,24031],{"__ignoreMap":120},[125,24032,24033,24036,24039,24042],{"class":127,"line":128},[125,24034,24035],{"class":159},"git",[125,24037,24038],{"class":170}," checkout",[125,24040,24041],{"class":170}," -b",[125,24043,24044],{"class":170}," migration/nuxt-4\n",[4333,24046],{},[98,24048,24050],{"id":24049},"step-by-step-migration-process","Step-by-Step Migration Process",[110,24052,24054],{"id":24053},"step-1-use-the-codemod-tool-recommended","Step 1: Use the Codemod Tool (Recommended)",[102,24056,24057],{},"Nuxt partnered with Codemod to create an automated migration tool:",[115,24059,24061],{"className":22580,"code":24060,"language":22582,"meta":120,"style":120},"# 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",[122,24062,24063,24068,24078,24082,24087,24098,24108],{"__ignoreMap":120},[125,24064,24065],{"class":127,"line":128},[125,24066,24067],{"class":385},"# Run the migration codemod\n",[125,24069,24070,24072,24075],{"class":127,"line":135},[125,24071,23844],{"class":159},[125,24073,24074],{"class":170}," codemod@latest",[125,24076,24077],{"class":170}," nuxt/4/migration-recipe\n",[125,24079,24080],{"class":127,"line":16},[125,24081,978],{"emptyLinePlaceholder":977},[125,24083,24084],{"class":127,"line":179},[125,24085,24086],{"class":385},"# Or with your package manager\n",[125,24088,24089,24091,24094,24096],{"class":127,"line":200},[125,24090,23884],{"class":159},[125,24092,24093],{"class":170}," dlx",[125,24095,24074],{"class":170},[125,24097,24077],{"class":170},[125,24099,24100,24102,24104,24106],{"class":127,"line":221},[125,24101,23894],{"class":159},[125,24103,24093],{"class":170},[125,24105,24074],{"class":170},[125,24107,24077],{"class":170},[125,24109,24110,24112,24115,24117],{"class":127,"line":242},[125,24111,23903],{"class":159},[125,24113,24114],{"class":170}," x",[125,24116,24074],{"class":170},[125,24118,24077],{"class":170},[102,24120,24121],{},[4343,24122,24123],{},"What the codemod does:",[4311,24125,24126,24133,24136,24139],{},[4314,24127,24128,24129,24132],{},"Updates ",[122,24130,24131],{},"nuxt.config.ts"," configuration",[4314,24134,24135],{},"Migrates directory structure (if needed)",[4314,24137,24138],{},"Updates deprecated imports",[4314,24140,24141],{},"Fixes common API changes",[110,24143,24145],{"id":24144},"step-2-update-packagejson","Step 2: Update package.json",[102,24147,24148],{},"Change Nuxt version to 4:",[115,24150,24152],{"className":117,"code":24151,"language":119,"meta":120,"style":120},"{\n \"devDependencies\": {\n \"nuxt\": \"^4.0.0\"\n }\n}\n",[122,24153,24154,24158,24170,24188,24192],{"__ignoreMap":120},[125,24155,24156],{"class":127,"line":128},[125,24157,132],{"class":131},[125,24159,24160,24162,24164,24166,24168],{"class":127,"line":135},[125,24161,138],{"class":131},[125,24163,142],{"class":141},[125,24165,145],{"class":131},[125,24167,148],{"class":131},[125,24169,151],{"class":131},[125,24171,24172,24174,24177,24179,24181,24183,24186],{"class":127,"line":16},[125,24173,156],{"class":131},[125,24175,24176],{"class":159},"nuxt",[125,24178,145],{"class":131},[125,24180,148],{"class":131},[125,24182,167],{"class":131},[125,24184,24185],{"class":170},"^4.0.0",[125,24187,279],{"class":131},[125,24189,24190],{"class":127,"line":179},[125,24191,365],{"class":131},[125,24193,24194],{"class":127,"line":200},[125,24195,371],{"class":131},[102,24197,24198],{},"Then install:",[115,24200,24202],{"className":22580,"code":24201,"language":22582,"meta":120,"style":120},"npm install\n",[122,24203,24204],{"__ignoreMap":120},[125,24205,24206,24208],{"class":127,"line":128},[125,24207,23864],{"class":159},[125,24209,24210],{"class":170}," install\n",[110,24212,24214],{"id":24213},"step-3-update-nuxtconfigts","Step 3: Update nuxt.config.ts",[102,24216,24217],{},[4343,24218,24219],{},"Nuxt 3:",[115,24221,24223],{"className":1112,"code":24222,"language":184,"meta":120,"style":120},"export default defineNuxtConfig({\n modules: [\"@nuxt/content\"],\n app: {\n head: {\n title: \"My App\",\n },\n },\n})\n",[122,24224,24225,24239,24259,24268,24277,24293,24297,24301],{"__ignoreMap":120},[125,24226,24227,24229,24232,24235,24237],{"class":127,"line":128},[125,24228,1126],{"class":1125},[125,24230,24231],{"class":1125}," default",[125,24233,24234],{"class":1293}," defineNuxtConfig",[125,24236,1247],{"class":965},[125,24238,132],{"class":131},[125,24240,24241,24244,24246,24248,24250,24253,24255,24257],{"class":127,"line":135},[125,24242,24243],{"class":1151}," modules",[125,24245,148],{"class":131},[125,24247,457],{"class":965},[125,24249,145],{"class":131},[125,24251,24252],{"class":170},"@nuxt/content",[125,24254,145],{"class":131},[125,24256,3077],{"class":965},[125,24258,176],{"class":131},[125,24260,24261,24264,24266],{"class":127,"line":16},[125,24262,24263],{"class":1151}," app",[125,24265,148],{"class":131},[125,24267,151],{"class":131},[125,24269,24270,24273,24275],{"class":127,"line":179},[125,24271,24272],{"class":1151}," head",[125,24274,148],{"class":131},[125,24276,151],{"class":131},[125,24278,24279,24282,24284,24286,24289,24291],{"class":127,"line":200},[125,24280,24281],{"class":1151}," title",[125,24283,148],{"class":131},[125,24285,167],{"class":131},[125,24287,24288],{"class":170},"My App",[125,24290,145],{"class":131},[125,24292,176],{"class":131},[125,24294,24295],{"class":127,"line":221},[125,24296,20061],{"class":131},[125,24298,24299],{"class":127,"line":242},[125,24300,285],{"class":131},[125,24302,24303,24305],{"class":127,"line":263},[125,24304,1426],{"class":131},[125,24306,1253],{"class":965},[102,24308,24309,24312],{},[4343,24310,24311],{},"Nuxt 4:"," (mostly the same, but check for deprecated options)",[115,24314,24316],{"className":1112,"code":24315,"language":184,"meta":120,"style":120},"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",[122,24317,24318,24330,24348,24356,24364,24378,24382,24386,24391,24400,24411,24422,24426],{"__ignoreMap":120},[125,24319,24320,24322,24324,24326,24328],{"class":127,"line":128},[125,24321,1126],{"class":1125},[125,24323,24231],{"class":1125},[125,24325,24234],{"class":1293},[125,24327,1247],{"class":965},[125,24329,132],{"class":131},[125,24331,24332,24334,24336,24338,24340,24342,24344,24346],{"class":127,"line":135},[125,24333,24243],{"class":1151},[125,24335,148],{"class":131},[125,24337,457],{"class":965},[125,24339,145],{"class":131},[125,24341,24252],{"class":170},[125,24343,145],{"class":131},[125,24345,3077],{"class":965},[125,24347,176],{"class":131},[125,24349,24350,24352,24354],{"class":127,"line":16},[125,24351,24263],{"class":1151},[125,24353,148],{"class":131},[125,24355,151],{"class":131},[125,24357,24358,24360,24362],{"class":127,"line":179},[125,24359,24272],{"class":1151},[125,24361,148],{"class":131},[125,24363,151],{"class":131},[125,24365,24366,24368,24370,24372,24374,24376],{"class":127,"line":200},[125,24367,24281],{"class":1151},[125,24369,148],{"class":131},[125,24371,167],{"class":131},[125,24373,24288],{"class":170},[125,24375,145],{"class":131},[125,24377,176],{"class":131},[125,24379,24380],{"class":127,"line":221},[125,24381,20061],{"class":131},[125,24383,24384],{"class":127,"line":242},[125,24385,285],{"class":131},[125,24387,24388],{"class":127,"line":263},[125,24389,24390],{"class":385}," // New in Nuxt 4: Better TypeScript defaults\n",[125,24392,24393,24396,24398],{"class":127,"line":282},[125,24394,24395],{"class":1151}," typescript",[125,24397,148],{"class":131},[125,24399,151],{"class":131},[125,24401,24402,24405,24407,24409],{"class":127,"line":288},[125,24403,24404],{"class":1151}," strict",[125,24406,148],{"class":131},[125,24408,1230],{"class":1229},[125,24410,176],{"class":131},[125,24412,24413,24416,24418,24420],{"class":127,"line":302},[125,24414,24415],{"class":1151}," typeCheck",[125,24417,148],{"class":131},[125,24419,1230],{"class":1229},[125,24421,176],{"class":131},[125,24423,24424],{"class":127,"line":323},[125,24425,285],{"class":131},[125,24427,24428,24430],{"class":127,"line":29},[125,24429,1426],{"class":131},[125,24431,1253],{"class":965},[110,24433,24435],{"id":24434},"step-4-migrate-directory-structure-optional","Step 4: Migrate Directory Structure (Optional)",[102,24437,24438,24439,24442],{},"Nuxt 4 introduces an optional ",[122,24440,24441],{},"app/"," directory structure for better organization:",[102,24444,24445],{},[4343,24446,24447],{},"Old Structure (still works):",[115,24449,24454],{"className":24450,"code":24452,"language":24453},[24451],"language-text","├── components/\n├── pages/\n├── composables/\n├── layouts/\n└── plugins/\n","text",[122,24455,24452],{"__ignoreMap":120},[102,24457,24458],{},[4343,24459,24460],{},"New Structure (recommended for new projects):",[115,24462,24465],{"className":24463,"code":24464,"language":24453},[24451],"├── app/\n│ ├── components/\n│ ├── pages/\n│ ├── composables/\n│ ├── layouts/\n│ └── plugins/\n├── content/\n└── public/\n",[122,24466,24464],{"__ignoreMap":120},[102,24468,24469],{},"To adopt the new structure:",[115,24471,24473],{"className":22580,"code":24472,"language":22582,"meta":120,"style":120},"mkdir -p app\nmv components app/\nmv pages app/\nmv composables app/\nmv layouts app/\nmv plugins app/\n",[122,24474,24475,24485,24496,24505,24514,24523],{"__ignoreMap":120},[125,24476,24477,24480,24483],{"class":127,"line":128},[125,24478,24479],{"class":159},"mkdir",[125,24481,24482],{"class":170}," -p",[125,24484,20098],{"class":170},[125,24486,24487,24490,24493],{"class":127,"line":135},[125,24488,24489],{"class":159},"mv",[125,24491,24492],{"class":170}," components",[125,24494,24495],{"class":170}," app/\n",[125,24497,24498,24500,24503],{"class":127,"line":16},[125,24499,24489],{"class":159},[125,24501,24502],{"class":170}," pages",[125,24504,24495],{"class":170},[125,24506,24507,24509,24512],{"class":127,"line":179},[125,24508,24489],{"class":159},[125,24510,24511],{"class":170}," composables",[125,24513,24495],{"class":170},[125,24515,24516,24518,24521],{"class":127,"line":200},[125,24517,24489],{"class":159},[125,24519,24520],{"class":170}," layouts",[125,24522,24495],{"class":170},[125,24524,24525,24527,24530],{"class":127,"line":221},[125,24526,24489],{"class":159},[125,24528,24529],{"class":170}," plugins",[125,24531,24495],{"class":170},[102,24533,24534],{},"Update imports if necessary (most auto-imports work the same).",[110,24536,24538],{"id":24537},"step-5-update-data-fetching","Step 5: Update Data Fetching",[102,24540,24541,24542,23752,24544,148],{},"Nuxt 4 improves ",[122,24543,23751],{},[122,24545,23755],{},[102,24547,24548],{},[4343,24549,24219],{},[115,24551,24553],{"className":1112,"code":24552,"language":184,"meta":120,"style":120},"const { data } = await useFetch(\"/api/posts\", {\n key: \"posts\",\n lazy: true,\n})\n",[122,24554,24555,24585,24600,24611],{"__ignoreMap":120},[125,24556,24557,24559,24561,24563,24565,24567,24569,24572,24574,24576,24579,24581,24583],{"class":127,"line":128},[125,24558,1883],{"class":141},[125,24560,1471],{"class":131},[125,24562,3284],{"class":965},[125,24564,1426],{"class":131},[125,24566,1209],{"class":131},[125,24568,2934],{"class":1125},[125,24570,24571],{"class":1293}," useFetch",[125,24573,1247],{"class":965},[125,24575,145],{"class":131},[125,24577,24578],{"class":170},"/api/posts",[125,24580,145],{"class":131},[125,24582,735],{"class":131},[125,24584,151],{"class":131},[125,24586,24587,24590,24592,24594,24596,24598],{"class":127,"line":135},[125,24588,24589],{"class":1151}," key",[125,24591,148],{"class":131},[125,24593,167],{"class":131},[125,24595,10790],{"class":170},[125,24597,145],{"class":131},[125,24599,176],{"class":131},[125,24601,24602,24605,24607,24609],{"class":127,"line":16},[125,24603,24604],{"class":1151}," lazy",[125,24606,148],{"class":131},[125,24608,1230],{"class":1229},[125,24610,176],{"class":131},[125,24612,24613,24615],{"class":127,"line":179},[125,24614,1426],{"class":131},[125,24616,1253],{"class":965},[102,24618,24619,24621],{},[4343,24620,24311],{}," (same API, better behavior)",[115,24623,24625],{"className":1112,"code":24624,"language":184,"meta":120,"style":120},"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",[122,24626,24627,24655,24669,24679,24684,24689],{"__ignoreMap":120},[125,24628,24629,24631,24633,24635,24637,24639,24641,24643,24645,24647,24649,24651,24653],{"class":127,"line":128},[125,24630,1883],{"class":141},[125,24632,1471],{"class":131},[125,24634,3284],{"class":965},[125,24636,1426],{"class":131},[125,24638,1209],{"class":131},[125,24640,2934],{"class":1125},[125,24642,24571],{"class":1293},[125,24644,1247],{"class":965},[125,24646,145],{"class":131},[125,24648,24578],{"class":170},[125,24650,145],{"class":131},[125,24652,735],{"class":131},[125,24654,151],{"class":131},[125,24656,24657,24659,24661,24663,24665,24667],{"class":127,"line":135},[125,24658,24589],{"class":1151},[125,24660,148],{"class":131},[125,24662,167],{"class":131},[125,24664,10790],{"class":170},[125,24666,145],{"class":131},[125,24668,176],{"class":131},[125,24670,24671,24673,24675,24677],{"class":127,"line":16},[125,24672,24604],{"class":1151},[125,24674,148],{"class":131},[125,24676,1230],{"class":1229},[125,24678,176],{"class":131},[125,24680,24681],{"class":127,"line":179},[125,24682,24683],{"class":385}," // Now automatically shares data across components with same key\n",[125,24685,24686],{"class":127,"line":200},[125,24687,24688],{"class":385}," // Automatic cleanup on unmount\n",[125,24690,24691,24693],{"class":127,"line":221},[125,24692,1426],{"class":131},[125,24694,1253],{"class":965},[102,24696,24697],{},[4343,24698,24699],{},"New Features:",[115,24701,24703],{"className":1112,"code":24702,"language":184,"meta":120,"style":120},"// 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",[122,24704,24705,24710,24742,24746,24751,24756,24803,24807,24812],{"__ignoreMap":120},[125,24706,24707],{"class":127,"line":128},[125,24708,24709],{"class":385},"// Reactive keys automatically refetch\n",[125,24711,24712,24714,24716,24718,24720,24722,24724,24726,24728,24730,24733,24735,24738,24740],{"class":127,"line":135},[125,24713,1883],{"class":141},[125,24715,1471],{"class":131},[125,24717,3284],{"class":965},[125,24719,1426],{"class":131},[125,24721,1209],{"class":131},[125,24723,2934],{"class":1125},[125,24725,24571],{"class":1293},[125,24727,1247],{"class":965},[125,24729,1432],{"class":131},[125,24731,24732],{"class":170},"/api/posts/",[125,24734,4707],{"class":131},[125,24736,24737],{"class":965},"postId",[125,24739,5042],{"class":131},[125,24741,1253],{"class":965},[125,24743,24744],{"class":127,"line":16},[125,24745,978],{"emptyLinePlaceholder":977},[125,24747,24748],{"class":127,"line":179},[125,24749,24750],{"class":385},"// Multiple components with same key share data\n",[125,24752,24753],{"class":127,"line":200},[125,24754,24755],{"class":385},"// Component A\n",[125,24757,24758,24760,24762,24764,24766,24769,24771,24773,24775,24777,24779,24781,24783,24785,24787,24789,24791,24793,24795,24797,24799,24801],{"class":127,"line":221},[125,24759,1883],{"class":141},[125,24761,1471],{"class":131},[125,24763,2263],{"class":1151},[125,24765,148],{"class":131},[125,24767,24768],{"class":965}," posts ",[125,24770,1426],{"class":131},[125,24772,1209],{"class":131},[125,24774,2934],{"class":1125},[125,24776,24571],{"class":1293},[125,24778,1247],{"class":965},[125,24780,145],{"class":131},[125,24782,24578],{"class":170},[125,24784,145],{"class":131},[125,24786,735],{"class":131},[125,24788,1471],{"class":131},[125,24790,14553],{"class":1151},[125,24792,148],{"class":131},[125,24794,167],{"class":131},[125,24796,10790],{"class":170},[125,24798,145],{"class":131},[125,24800,1487],{"class":131},[125,24802,1253],{"class":965},[125,24804,24805],{"class":127,"line":242},[125,24806,978],{"emptyLinePlaceholder":977},[125,24808,24809],{"class":127,"line":263},[125,24810,24811],{"class":385},"// Component B (gets same data, no duplicate request)\n",[125,24813,24814,24816,24818,24820,24822,24824,24826,24828,24830,24832,24834,24836,24838,24840,24842,24844,24846,24848,24850,24852,24854,24856],{"class":127,"line":282},[125,24815,1883],{"class":141},[125,24817,1471],{"class":131},[125,24819,2263],{"class":1151},[125,24821,148],{"class":131},[125,24823,24768],{"class":965},[125,24825,1426],{"class":131},[125,24827,1209],{"class":131},[125,24829,2934],{"class":1125},[125,24831,24571],{"class":1293},[125,24833,1247],{"class":965},[125,24835,145],{"class":131},[125,24837,24578],{"class":170},[125,24839,145],{"class":131},[125,24841,735],{"class":131},[125,24843,1471],{"class":131},[125,24845,14553],{"class":1151},[125,24847,148],{"class":131},[125,24849,167],{"class":131},[125,24851,10790],{"class":170},[125,24853,145],{"class":131},[125,24855,1487],{"class":131},[125,24857,1253],{"class":965},[110,24859,24861],{"id":24860},"step-6-update-plugins","Step 6: Update Plugins",[102,24863,24864],{},"Nuxt 4 uses auto-imports for plugins by default:",[102,24866,24867],{},[4343,24868,24219],{},[115,24870,24872],{"className":1112,"code":24871,"language":184,"meta":120,"style":120},"// plugins/my-plugin.ts\nexport default defineNuxtPlugin((nuxtApp) => {\n nuxtApp.provide(\"myPlugin\", myPlugin)\n})\n",[122,24873,24874,24879,24901,24927],{"__ignoreMap":120},[125,24875,24876],{"class":127,"line":128},[125,24877,24878],{"class":385},"// plugins/my-plugin.ts\n",[125,24880,24881,24883,24885,24888,24890,24892,24895,24897,24899],{"class":127,"line":135},[125,24882,1126],{"class":1125},[125,24884,24231],{"class":1125},[125,24886,24887],{"class":1293}," defineNuxtPlugin",[125,24889,1247],{"class":965},[125,24891,1247],{"class":131},[125,24893,24894],{"class":1188},"nuxtApp",[125,24896,1349],{"class":131},[125,24898,3898],{"class":141},[125,24900,151],{"class":131},[125,24902,24903,24906,24908,24911,24913,24915,24918,24920,24922,24925],{"class":127,"line":16},[125,24904,24905],{"class":965}," nuxtApp",[125,24907,1290],{"class":131},[125,24909,24910],{"class":1293},"provide",[125,24912,1247],{"class":1151},[125,24914,145],{"class":131},[125,24916,24917],{"class":170},"myPlugin",[125,24919,145],{"class":131},[125,24921,735],{"class":131},[125,24923,24924],{"class":965}," myPlugin",[125,24926,1253],{"class":1151},[125,24928,24929,24931],{"class":127,"line":179},[125,24930,1426],{"class":131},[125,24932,1253],{"class":965},[102,24934,24935,24937],{},[4343,24936,24311],{}," (same, but better type inference)",[115,24939,24941],{"className":1112,"code":24940,"language":184,"meta":120,"style":120},"// 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",[122,24942,24943,24947,24967,24989,24995,24999,25004],{"__ignoreMap":120},[125,24944,24945],{"class":127,"line":128},[125,24946,24878],{"class":385},[125,24948,24949,24951,24953,24955,24957,24959,24961,24963,24965],{"class":127,"line":135},[125,24950,1126],{"class":1125},[125,24952,24231],{"class":1125},[125,24954,24887],{"class":1293},[125,24956,1247],{"class":965},[125,24958,1247],{"class":131},[125,24960,24894],{"class":1188},[125,24962,1349],{"class":131},[125,24964,3898],{"class":141},[125,24966,151],{"class":131},[125,24968,24969,24971,24973,24975,24977,24979,24981,24983,24985,24987],{"class":127,"line":16},[125,24970,24905],{"class":965},[125,24972,1290],{"class":131},[125,24974,24910],{"class":1293},[125,24976,1247],{"class":1151},[125,24978,145],{"class":131},[125,24980,24917],{"class":170},[125,24982,145],{"class":131},[125,24984,735],{"class":131},[125,24986,24924],{"class":965},[125,24988,1253],{"class":1151},[125,24990,24991,24993],{"class":127,"line":179},[125,24992,1426],{"class":131},[125,24994,1253],{"class":965},[125,24996,24997],{"class":127,"line":200},[125,24998,978],{"emptyLinePlaceholder":977},[125,25000,25001],{"class":127,"line":221},[125,25002,25003],{"class":385},"// Usage in components (auto-typed)\n",[125,25005,25006,25008,25010,25013,25015,25017,25020],{"class":127,"line":242},[125,25007,1883],{"class":141},[125,25009,1471],{"class":131},[125,25011,25012],{"class":965}," $myPlugin ",[125,25014,1426],{"class":131},[125,25016,1209],{"class":131},[125,25018,25019],{"class":1293}," useNuxtApp",[125,25021,1955],{"class":965},[110,25023,25025],{"id":25024},"step-7-update-server-routes","Step 7: Update Server Routes",[102,25027,25028],{},"Migrate server middleware to Nitro server routes:",[102,25030,25031],{},[4343,25032,25033],{},"Old (Nuxt 3 server middleware):",[115,25035,25037],{"className":1112,"code":25036,"language":184,"meta":120,"style":120},"// server/middleware/auth.ts\nexport default defineEventHandler((event) => {\n // middleware logic\n})\n",[122,25038,25039,25044,25065,25070],{"__ignoreMap":120},[125,25040,25041],{"class":127,"line":128},[125,25042,25043],{"class":385},"// server/middleware/auth.ts\n",[125,25045,25046,25048,25050,25053,25055,25057,25059,25061,25063],{"class":127,"line":135},[125,25047,1126],{"class":1125},[125,25049,24231],{"class":1125},[125,25051,25052],{"class":1293}," defineEventHandler",[125,25054,1247],{"class":965},[125,25056,1247],{"class":131},[125,25058,15645],{"class":1188},[125,25060,1349],{"class":131},[125,25062,3898],{"class":141},[125,25064,151],{"class":131},[125,25066,25067],{"class":127,"line":16},[125,25068,25069],{"class":385}," // middleware logic\n",[125,25071,25072,25074],{"class":127,"line":179},[125,25073,1426],{"class":131},[125,25075,1253],{"class":965},[102,25077,25078],{},[4343,25079,25080],{},"New (Nitro server routes - same syntax, better performance):",[115,25082,25084],{"className":1112,"code":25083,"language":184,"meta":120,"style":120},"// server/api/auth.ts\nexport default defineEventHandler((event) => {\n // API route logic\n return { user: event.context.user }\n})\n",[122,25085,25086,25091,25111,25116,25140],{"__ignoreMap":120},[125,25087,25088],{"class":127,"line":128},[125,25089,25090],{"class":385},"// server/api/auth.ts\n",[125,25092,25093,25095,25097,25099,25101,25103,25105,25107,25109],{"class":127,"line":135},[125,25094,1126],{"class":1125},[125,25096,24231],{"class":1125},[125,25098,25052],{"class":1293},[125,25100,1247],{"class":965},[125,25102,1247],{"class":131},[125,25104,15645],{"class":1188},[125,25106,1349],{"class":131},[125,25108,3898],{"class":141},[125,25110,151],{"class":131},[125,25112,25113],{"class":127,"line":16},[125,25114,25115],{"class":385}," // API route logic\n",[125,25117,25118,25120,25122,25124,25126,25129,25131,25134,25136,25138],{"class":127,"line":179},[125,25119,4518],{"class":1125},[125,25121,1471],{"class":131},[125,25123,2929],{"class":1151},[125,25125,148],{"class":131},[125,25127,25128],{"class":965}," event",[125,25130,1290],{"class":131},[125,25132,25133],{"class":965},"context",[125,25135,1290],{"class":131},[125,25137,2132],{"class":965},[125,25139,4525],{"class":131},[125,25141,25142,25144],{"class":127,"line":200},[125,25143,1426],{"class":131},[125,25145,1253],{"class":965},[110,25147,25149],{"id":25148},"step-8-replace-vuex-with-pinia","Step 8: Replace Vuex with Pinia",[102,25151,25152],{},"If you're still using Vuex, migrate to Pinia:",[102,25154,25155],{},[4343,25156,25157],{},"Install Pinia:",[115,25159,25161],{"className":22580,"code":25160,"language":22582,"meta":120,"style":120},"npm install pinia @pinia/nuxt\n",[122,25162,25163],{"__ignoreMap":120},[125,25164,25165,25167,25169,25172],{"class":127,"line":128},[125,25166,23864],{"class":159},[125,25168,23867],{"class":170},[125,25170,25171],{"class":170}," pinia",[125,25173,25174],{"class":170}," @pinia/nuxt\n",[102,25176,25177],{},[4343,25178,25179],{},"Add to nuxt.config.ts:",[115,25181,25183],{"className":1112,"code":25182,"language":184,"meta":120,"style":120},"export default defineNuxtConfig({\n modules: [\"@pinia/nuxt\"],\n})\n",[122,25184,25185,25197,25216],{"__ignoreMap":120},[125,25186,25187,25189,25191,25193,25195],{"class":127,"line":128},[125,25188,1126],{"class":1125},[125,25190,24231],{"class":1125},[125,25192,24234],{"class":1293},[125,25194,1247],{"class":965},[125,25196,132],{"class":131},[125,25198,25199,25201,25203,25205,25207,25210,25212,25214],{"class":127,"line":135},[125,25200,24243],{"class":1151},[125,25202,148],{"class":131},[125,25204,457],{"class":965},[125,25206,145],{"class":131},[125,25208,25209],{"class":170},"@pinia/nuxt",[125,25211,145],{"class":131},[125,25213,3077],{"class":965},[125,25215,176],{"class":131},[125,25217,25218,25220],{"class":127,"line":16},[125,25219,1426],{"class":131},[125,25221,1253],{"class":965},[102,25223,25224],{},[4343,25225,25226],{},"Migrate stores:",[115,25228,25230],{"className":1112,"code":25229,"language":184,"meta":120,"style":120},"// 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",[122,25231,25232,25237,25264,25279,25291,25299,25308,25317,25326,25330,25334],{"__ignoreMap":120},[125,25233,25234],{"class":127,"line":128},[125,25235,25236],{"class":385},"// stores/counter.ts\n",[125,25238,25239,25241,25243,25246,25248,25251,25253,25255,25258,25260,25262],{"class":127,"line":135},[125,25240,1126],{"class":1125},[125,25242,1526],{"class":141},[125,25244,25245],{"class":965}," useCounterStore ",[125,25247,1532],{"class":131},[125,25249,25250],{"class":1293}," defineStore",[125,25252,1247],{"class":965},[125,25254,145],{"class":131},[125,25256,25257],{"class":170},"counter",[125,25259,145],{"class":131},[125,25261,735],{"class":131},[125,25263,151],{"class":131},[125,25265,25266,25269,25271,25273,25275,25277],{"class":127,"line":16},[125,25267,25268],{"class":1293}," state",[125,25270,148],{"class":131},[125,25272,3895],{"class":131},[125,25274,3898],{"class":141},[125,25276,1597],{"class":965},[125,25278,132],{"class":131},[125,25280,25281,25284,25286,25289],{"class":127,"line":179},[125,25282,25283],{"class":1151}," count",[125,25285,148],{"class":131},[125,25287,25288],{"class":961}," 0",[125,25290,176],{"class":131},[125,25292,25293,25295,25297],{"class":127,"line":200},[125,25294,1830],{"class":131},[125,25296,1349],{"class":965},[125,25298,176],{"class":131},[125,25300,25301,25304,25306],{"class":127,"line":221},[125,25302,25303],{"class":1151}," actions",[125,25305,148],{"class":131},[125,25307,151],{"class":131},[125,25309,25310,25313,25315],{"class":127,"line":242},[125,25311,25312],{"class":1151}," increment",[125,25314,2739],{"class":131},[125,25316,151],{"class":131},[125,25318,25319,25321,25323],{"class":127,"line":263},[125,25320,15701],{"class":131},[125,25322,12370],{"class":965},[125,25324,25325],{"class":131},"++\n",[125,25327,25328],{"class":127,"line":282},[125,25329,20061],{"class":131},[125,25331,25332],{"class":127,"line":288},[125,25333,285],{"class":131},[125,25335,25336,25338],{"class":127,"line":302},[125,25337,1426],{"class":131},[125,25339,1253],{"class":965},[4333,25341],{},[98,25343,25345],{"id":25344},"breaking-changes-solutions","Breaking Changes & Solutions",[110,25347,25349],{"id":25348},"_1-stricter-typescript","1. Stricter TypeScript",[102,25351,25352],{},"Nuxt 4 enables stricter TypeScript by default.",[102,25354,25355,25358],{},[4343,25356,25357],{},"Issue:"," Type errors that were ignored before",[102,25360,25361,25364,25365,148],{},[4343,25362,25363],{},"Solution:"," Fix types or adjust ",[122,25366,25367],{},"tsconfig.json",[115,25369,25371],{"className":1112,"code":25370,"language":184,"meta":120,"style":120},"// tsconfig.json\n{\n \"compilerOptions\": {\n \"strict\": true,\n \"noImplicitAny\": true\n }\n}\n",[122,25372,25373,25377,25381,25394,25408,25421,25425],{"__ignoreMap":120},[125,25374,25375],{"class":127,"line":128},[125,25376,386],{"class":385},[125,25378,25379],{"class":127,"line":135},[125,25380,132],{"class":131},[125,25382,25383,25385,25387,25389,25392],{"class":127,"line":16},[125,25384,138],{"class":131},[125,25386,397],{"class":170},[125,25388,145],{"class":131},[125,25390,25391],{"class":1151},": ",[125,25393,132],{"class":131},[125,25395,25396,25398,25400,25402,25404,25406],{"class":127,"line":179},[125,25397,156],{"class":131},[125,25399,513],{"class":1151},[125,25401,145],{"class":131},[125,25403,148],{"class":131},[125,25405,1230],{"class":1229},[125,25407,176],{"class":131},[125,25409,25410,25412,25415,25417,25419],{"class":127,"line":200},[125,25411,156],{"class":131},[125,25413,25414],{"class":1151},"noImplicitAny",[125,25416,145],{"class":131},[125,25418,148],{"class":131},[125,25420,683],{"class":1229},[125,25422,25423],{"class":127,"line":221},[125,25424,365],{"class":131},[125,25426,25427],{"class":127,"line":242},[125,25428,371],{"class":131},[110,25430,25432],{"id":25431},"_2-nested-routing-changes","2. Nested Routing Changes",[102,25434,25435],{},"Nuxt 4 has stricter nested routing behavior.",[102,25437,25438,25440],{},[4343,25439,25357],{}," Routes not working as expected",[102,25442,25443,25445],{},[4343,25444,25363],{}," Check file structure:",[115,25447,25450],{"className":25448,"code":25449,"language":24453},[24451],"pages/\n├── users/\n│ ├── index.vue → /users\n│ └── [id].vue → /users/:id\n",[122,25451,25449],{"__ignoreMap":120},[110,25453,25455],{"id":25454},"_3-module-api-changes","3. Module API Changes",[102,25457,25458],{},"Some modules changed their APIs.",[102,25460,25461],{},[4343,25462,25463],{},"Example - @nuxt/content v3:",[115,25465,25467],{"className":1112,"code":25466,"language":184,"meta":120,"style":120},"// Old\nconst articles = await queryContent(\"articles\").find()\n\n// New (same API, better types)\nconst articles = await queryCollection(\"articles\").find()\n",[122,25468,25469,25474,25506,25510,25515],{"__ignoreMap":120},[125,25470,25471],{"class":127,"line":128},[125,25472,25473],{"class":385},"// Old\n",[125,25475,25476,25478,25481,25483,25485,25488,25490,25492,25495,25497,25499,25501,25504],{"class":127,"line":135},[125,25477,1883],{"class":141},[125,25479,25480],{"class":965}," articles ",[125,25482,1532],{"class":131},[125,25484,2934],{"class":1125},[125,25486,25487],{"class":1293}," queryContent",[125,25489,1247],{"class":965},[125,25491,145],{"class":131},[125,25493,25494],{"class":170},"articles",[125,25496,145],{"class":131},[125,25498,1349],{"class":965},[125,25500,1290],{"class":131},[125,25502,25503],{"class":1293},"find",[125,25505,1955],{"class":965},[125,25507,25508],{"class":127,"line":16},[125,25509,978],{"emptyLinePlaceholder":977},[125,25511,25512],{"class":127,"line":179},[125,25513,25514],{"class":385},"// New (same API, better types)\n",[125,25516,25517,25519,25521,25523,25525,25528,25530,25532,25534,25536,25538,25540,25542],{"class":127,"line":200},[125,25518,1883],{"class":141},[125,25520,25480],{"class":965},[125,25522,1532],{"class":131},[125,25524,2934],{"class":1125},[125,25526,25527],{"class":1293}," queryCollection",[125,25529,1247],{"class":965},[125,25531,145],{"class":131},[125,25533,25494],{"class":170},[125,25535,145],{"class":131},[125,25537,1349],{"class":965},[125,25539,1290],{"class":131},[125,25541,25503],{"class":1293},[125,25543,1955],{"class":965},[110,25545,25547],{"id":25546},"_4-deprecated-apis","4. Deprecated APIs",[102,25549,25550],{},[4343,25551,25552],{},"Removed:",[4311,25554,25555,25561,25567],{},[4314,25556,25557,25560],{},[122,25558,25559],{},"@nuxt/types"," (use built-in types)",[4314,25562,25563,25566],{},[122,25564,25565],{},"nuxt.config.js"," (use .ts only)",[4314,25568,25569],{},"Some legacy hooks",[102,25571,25572],{},[4343,25573,25574],{},"Check deprecated APIs:",[115,25576,25578],{"className":22580,"code":25577,"language":22582,"meta":120,"style":120},"npx nuxi analyze\n",[122,25579,25580],{"__ignoreMap":120},[125,25581,25582,25584,25586],{"class":127,"line":128},[125,25583,23844],{"class":159},[125,25585,23847],{"class":170},[125,25587,25588],{"class":170}," analyze\n",[4333,25590],{},[98,25592,25594],{"id":25593},"common-issues-troubleshooting","Common Issues & Troubleshooting",[110,25596,25598],{"id":25597},"issue-1-module-x-is-not-compatible-with-nuxt-4","Issue 1: \"Module X is not compatible with Nuxt 4\"",[102,25600,25601],{},[4343,25602,25363],{},[115,25604,25606],{"className":22580,"code":25605,"language":22582,"meta":120,"style":120},"# 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",[122,25607,25608,25613,25620,25624,25629,25638,25642,25647],{"__ignoreMap":120},[125,25609,25610],{"class":127,"line":128},[125,25611,25612],{"class":385},"# Check for updates\n",[125,25614,25615,25617],{"class":127,"line":135},[125,25616,23864],{"class":159},[125,25618,25619],{"class":170}," outdated\n",[125,25621,25622],{"class":127,"line":16},[125,25623,978],{"emptyLinePlaceholder":977},[125,25625,25626],{"class":127,"line":179},[125,25627,25628],{"class":385},"# Update specific module\n",[125,25630,25631,25633,25635],{"class":127,"line":200},[125,25632,23864],{"class":159},[125,25634,23867],{"class":170},[125,25636,25637],{"class":170}," @nuxt/content@latest\n",[125,25639,25640],{"class":127,"line":221},[125,25641,978],{"emptyLinePlaceholder":977},[125,25643,25644],{"class":127,"line":242},[125,25645,25646],{"class":385},"# Or find alternative\n",[125,25648,25649],{"class":127,"line":263},[125,25650,25651],{"class":385},"# Check Nuxt modules directory: https://nuxt.com/modules\n",[110,25653,25655],{"id":25654},"issue-2-typescript-errors-after-migration","Issue 2: TypeScript Errors After Migration",[102,25657,25658],{},[4343,25659,25363],{},[115,25661,25663],{"className":22580,"code":25662,"language":22582,"meta":120,"style":120},"# Regenerate types\nnpx nuxi prepare\n\n# Clear cache\nnpx nuxi cleanup\n\n# Check specific file\nnpx tsc --noEmit --pretty\n",[122,25664,25665,25670,25679,25683,25688,25697,25701,25706],{"__ignoreMap":120},[125,25666,25667],{"class":127,"line":128},[125,25668,25669],{"class":385},"# Regenerate types\n",[125,25671,25672,25674,25676],{"class":127,"line":135},[125,25673,23844],{"class":159},[125,25675,23847],{"class":170},[125,25677,25678],{"class":170}," prepare\n",[125,25680,25681],{"class":127,"line":16},[125,25682,978],{"emptyLinePlaceholder":977},[125,25684,25685],{"class":127,"line":179},[125,25686,25687],{"class":385},"# Clear cache\n",[125,25689,25690,25692,25694],{"class":127,"line":200},[125,25691,23844],{"class":159},[125,25693,23847],{"class":170},[125,25695,25696],{"class":170}," cleanup\n",[125,25698,25699],{"class":127,"line":221},[125,25700,978],{"emptyLinePlaceholder":977},[125,25702,25703],{"class":127,"line":242},[125,25704,25705],{"class":385},"# Check specific file\n",[125,25707,25708,25710,25713,25716],{"class":127,"line":263},[125,25709,23844],{"class":159},[125,25711,25712],{"class":170}," tsc",[125,25714,25715],{"class":170}," --noEmit",[125,25717,25718],{"class":170}," --pretty\n",[110,25720,25722],{"id":25721},"issue-3-build-fails-with-cannot-find-module","Issue 3: Build Fails with \"Cannot find module\"",[102,25724,25725],{},[4343,25726,25363],{},[115,25728,25730],{"className":22580,"code":25729,"language":22582,"meta":120,"style":120},"# Clear node_modules and reinstall\nrm -rf node_modules .nuxt\nnpm install\nnpx nuxi prepare\n",[122,25731,25732,25737,25751,25757],{"__ignoreMap":120},[125,25733,25734],{"class":127,"line":128},[125,25735,25736],{"class":385},"# Clear node_modules and reinstall\n",[125,25738,25739,25742,25745,25748],{"class":127,"line":135},[125,25740,25741],{"class":159},"rm",[125,25743,25744],{"class":170}," -rf",[125,25746,25747],{"class":170}," node_modules",[125,25749,25750],{"class":170}," .nuxt\n",[125,25752,25753,25755],{"class":127,"line":16},[125,25754,23864],{"class":159},[125,25756,24210],{"class":170},[125,25758,25759,25761,25763],{"class":127,"line":179},[125,25760,23844],{"class":159},[125,25762,23847],{"class":170},[125,25764,25678],{"class":170},[110,25766,25768],{"id":25767},"issue-4-hmr-not-working","Issue 4: HMR Not Working",[102,25770,25771],{},[4343,25772,25363],{},[115,25774,25776],{"className":1112,"code":25775,"language":184,"meta":120,"style":120},"// nuxt.config.ts\nexport default defineNuxtConfig({\n vite: {\n server: {\n watch: {\n usePolling: true,\n },\n },\n },\n})\n",[122,25777,25778,25783,25795,25804,25813,25822,25833,25837,25841,25845],{"__ignoreMap":120},[125,25779,25780],{"class":127,"line":128},[125,25781,25782],{"class":385},"// nuxt.config.ts\n",[125,25784,25785,25787,25789,25791,25793],{"class":127,"line":135},[125,25786,1126],{"class":1125},[125,25788,24231],{"class":1125},[125,25790,24234],{"class":1293},[125,25792,1247],{"class":965},[125,25794,132],{"class":131},[125,25796,25797,25800,25802],{"class":127,"line":16},[125,25798,25799],{"class":1151}," vite",[125,25801,148],{"class":131},[125,25803,151],{"class":131},[125,25805,25806,25809,25811],{"class":127,"line":179},[125,25807,25808],{"class":1151}," server",[125,25810,148],{"class":131},[125,25812,151],{"class":131},[125,25814,25815,25818,25820],{"class":127,"line":200},[125,25816,25817],{"class":1151}," watch",[125,25819,148],{"class":131},[125,25821,151],{"class":131},[125,25823,25824,25827,25829,25831],{"class":127,"line":221},[125,25825,25826],{"class":1151}," usePolling",[125,25828,148],{"class":131},[125,25830,1230],{"class":1229},[125,25832,176],{"class":131},[125,25834,25835],{"class":127,"line":242},[125,25836,21882],{"class":131},[125,25838,25839],{"class":127,"line":263},[125,25840,20061],{"class":131},[125,25842,25843],{"class":127,"line":282},[125,25844,285],{"class":131},[125,25846,25847,25849],{"class":127,"line":288},[125,25848,1426],{"class":131},[125,25850,1253],{"class":965},[110,25852,25854],{"id":25853},"issue-5-server-routes-not-working","Issue 5: Server Routes Not Working",[102,25856,25857],{},[4343,25858,25363],{},[4311,25860,25861,25870,25873],{},[4314,25862,25863,25864,6006,25867],{},"Ensure files are in ",[122,25865,25866],{},"server/api/",[122,25868,25869],{},"server/routes/",[4314,25871,25872],{},"Check Nitro configuration",[4314,25874,25875],{},"Restart dev server",[4333,25877],{},[98,25879,25881],{"id":25880},"post-migration-checklist","Post-Migration Checklist",[102,25883,25884],{},"After completing the migration:",[110,25886,25888],{"id":25887},"_1-run-full-test-suite","✅ 1. Run Full Test Suite",[115,25890,25892],{"className":22580,"code":25891,"language":22582,"meta":120,"style":120},"npm run test\nnpm run test:e2e\n",[122,25893,25894,25902],{"__ignoreMap":120},[125,25895,25896,25898,25900],{"class":127,"line":128},[125,25897,23864],{"class":159},[125,25899,23994],{"class":170},[125,25901,24018],{"class":170},[125,25903,25904,25906,25908],{"class":127,"line":135},[125,25905,23864],{"class":159},[125,25907,23994],{"class":170},[125,25909,25910],{"class":170}," test:e2e\n",[110,25912,25914],{"id":25913},"_2-type-check","✅ 2. Type Check",[115,25916,25917],{"className":22580,"code":23985,"language":22582,"meta":120,"style":120},[122,25918,25919],{"__ignoreMap":120},[125,25920,25921,25923,25925],{"class":127,"line":128},[125,25922,23864],{"class":159},[125,25924,23994],{"class":170},[125,25926,23997],{"class":170},[110,25928,25930],{"id":25929},"_3-build-production","✅ 3. Build Production",[115,25932,25934],{"className":22580,"code":25933,"language":22582,"meta":120,"style":120},"npm run build\nnpm run preview\n",[122,25935,25936,25945],{"__ignoreMap":120},[125,25937,25938,25940,25942],{"class":127,"line":128},[125,25939,23864],{"class":159},[125,25941,23994],{"class":170},[125,25943,25944],{"class":170}," build\n",[125,25946,25947,25949,25951],{"class":127,"line":135},[125,25948,23864],{"class":159},[125,25950,23994],{"class":170},[125,25952,25953],{"class":170}," preview\n",[110,25955,25957],{"id":25956},"_4-performance-audit","✅ 4. Performance Audit",[115,25959,25961],{"className":22580,"code":25960,"language":22582,"meta":120,"style":120},"# Run Lighthouse\nnpx lighthouse http://localhost:3000\n",[122,25962,25963,25968],{"__ignoreMap":120},[125,25964,25965],{"class":127,"line":128},[125,25966,25967],{"class":385},"# Run Lighthouse\n",[125,25969,25970,25972,25975],{"class":127,"line":135},[125,25971,23844],{"class":159},[125,25973,25974],{"class":170}," lighthouse",[125,25976,25977],{"class":170}," http://localhost:3000\n",[110,25979,25981],{"id":25980},"_5-monitor-in-production","✅ 5. Monitor in Production",[4311,25983,25984,25987,25990],{},[4314,25985,25986],{},"Set up error tracking (Sentry, LogRocket)",[4314,25988,25989],{},"Monitor Core Web Vitals",[4314,25991,25992],{},"Check analytics for issues",[4333,25994],{},[98,25996,25998],{"id":25997},"migration-timeline","Migration Timeline",[102,26000,26001],{},[4343,26002,26003],{},"Recommended Schedule:",[4311,26005,26006,26012,26018],{},[4314,26007,26008,26011],{},[4343,26009,26010],{},"Week 1",": Pre-migration preparation (updates, backups, compatibility check)",[4314,26013,26014,26017],{},[4343,26015,26016],{},"Week 2",": Run codemod, fix breaking changes, update modules",[4314,26019,26020,26023],{},[4343,26021,26022],{},"Week 3",": Testing, performance optimization, deployment",[102,26025,26026,26029],{},[4343,26027,26028],{},"Don't wait until January 2026!"," Start your migration now to avoid last-minute issues.",[4333,26031],{},[98,26033,26035],{"id":26034},"performance-improvements-after-migration","Performance Improvements After Migration",[102,26037,26038],{},"Real-world results from migrating to Nuxt 4:",[26040,26041,26042,26061],"table",{},[26043,26044,26045],"thead",{},[26046,26047,26048,26052,26055,26058],"tr",{},[26049,26050,26051],"th",{},"Metric",[26049,26053,26054],{},"Nuxt 3",[26049,26056,26057],{},"Nuxt 4",[26049,26059,26060],{},"Improvement",[26062,26063,26064,26081,26097,26113,26129],"tbody",{},[26046,26065,26066,26070,26073,26076],{},[26067,26068,26069],"td",{},"Build Time",[26067,26071,26072],{},"45s",[26067,26074,26075],{},"32s",[26067,26077,26078],{},[4343,26079,26080],{},"29% faster",[26046,26082,26083,26086,26089,26092],{},[26067,26084,26085],{},"HMR Update",[26067,26087,26088],{},"800ms",[26067,26090,26091],{},"350ms",[26067,26093,26094],{},[4343,26095,26096],{},"56% faster",[26046,26098,26099,26102,26105,26108],{},[26067,26100,26101],{},"LCP",[26067,26103,26104],{},"2.1s",[26067,26106,26107],{},"1.6s",[26067,26109,26110],{},[4343,26111,26112],{},"24% faster",[26046,26114,26115,26118,26121,26124],{},[26067,26116,26117],{},"Bundle Size",[26067,26119,26120],{},"185KB",[26067,26122,26123],{},"162KB",[26067,26125,26126],{},[4343,26127,26128],{},"12% smaller",[26046,26130,26131,26134,26137,26140],{},[26067,26132,26133],{},"TTI",[26067,26135,26136],{},"3.2s",[26067,26138,26139],{},"2.4s",[26067,26141,26142],{},[4343,26143,26144],{},"25% faster",[4333,26146],{},[98,26148,26150],{"id":26149},"faq-nuxt-3-to-nuxt-4-migration","FAQ: Nuxt 3 to Nuxt 4 Migration",[110,26152,26154],{"id":26153},"when-is-nuxt-3-end-of-life","When is Nuxt 3 end of life?",[102,26156,26157,26160],{},[4343,26158,26159],{},"Nuxt 3 official support ends January 31, 2026."," After this date, there will be no security patches, bug fixes, or maintenance updates.",[110,26162,26164],{"id":26163},"how-long-does-migration-take","How long does migration take?",[102,26166,26167,26168,26171],{},"For most projects: ",[4343,26169,26170],{},"4-8 hours"," of active work, spread over 2-3 days for testing. Large enterprise applications may take 1-2 weeks.",[110,26173,26175],{"id":26174},"is-nuxt-4-backward-compatible","Is Nuxt 4 backward compatible?",[102,26177,26178,26181],{},[4343,26179,26180],{},"Mostly yes."," Nuxt 4 maintains compatibility with most Nuxt 3 APIs. The codemod tool handles most breaking changes automatically.",[110,26183,26185],{"id":26184},"what-if-my-module-isnt-nuxt-4-compatible","What if my module isn't Nuxt 4 compatible?",[102,26187,26188],{},"Check for:",[4348,26190,26191,26194,26197],{},[4314,26192,26193],{},"Module updates (many released Nuxt 4 versions)",[4314,26195,26196],{},"Alternative modules",[4314,26198,26199],{},"Native Nuxt 4 solutions (e.g., Nitro routes instead of middleware)",[110,26201,26203],{"id":26202},"can-i-rollback-if-migration-fails","Can I rollback if migration fails?",[102,26205,26206,26209],{},[4343,26207,26208],{},"Yes."," That's why we recommend creating a git branch first. You can always checkout your pre-migration code.",[110,26211,26213],{"id":26212},"should-new-projects-start-with-nuxt-4","Should new projects start with Nuxt 4?",[102,26215,26216,26219],{},[4343,26217,26218],{},"Absolutely."," Nuxt 4 is stable, production-ready, and the recommended version for all new projects in 2026.",[110,26221,26223],{"id":26222},"what-about-nuxt-5","What about Nuxt 5?",[102,26225,26226],{},"Nuxt 5 is planned for late 2026 with Nitro v3. Nuxt 4 provides a stable foundation with a clear upgrade path to Nuxt 5.",[4333,26228],{},[98,26230,26232],{"id":26231},"next-steps","Next Steps",[102,26234,26235],{},"Now that you've migrated to Nuxt 4:",[4348,26237,26238,26248,26258],{},[4314,26239,26240,26243,26244],{},[4343,26241,26242],{},"Optimize Performance",": Read our ",[4355,26245,26247],{"href":26246},"/blog/16-nuxt-4-ssr-performance-optimization","Nuxt 4 Performance Optimization Guide",[4314,26249,26250,26253,26254],{},[4343,26251,26252],{},"Explore New Features",": Check out ",[4355,26255,26257],{"href":26256},"/blog/24-nuxt-4-edge-computing-guide","Nuxt UI v4",[4314,26259,26260,26263,26264],{},[4343,26261,26262],{},"Deploy to Edge",": Learn about ",[4355,26265,26266],{"href":26256},"Edge Computing with Nuxt 4",[4333,26268],{},[98,26270,26272],{"id":26271},"need-help","Need Help?",[102,26274,26275,26276,1290],{},"Migration issues? Drop a comment below or reach out on Twitter ",[4355,26277,26280],{"href":26278,"rel":26279},"https://twitter.com/mubaidr",[5233],"@mubaidr",[102,26282,26283],{},[4343,26284,26285],{},"Resources:",[4311,26287,26288,26295,26302,26309],{},[4314,26289,26290],{},[4355,26291,26294],{"href":26292,"rel":26293},"https://nuxt.com/docs/getting-started/upgrade",[5233],"Official Nuxt 4 Migration Guide",[4314,26296,26297],{},[4355,26298,26301],{"href":26299,"rel":26300},"https://nuxt.com/blog/v4",[5233],"Nuxt 4 Release Notes",[4314,26303,26304],{},[4355,26305,26308],{"href":26306,"rel":26307},"https://codemod.com/registry/nuxt-4-migration-recipe",[5233],"Codemod Tool",[4314,26310,26311],{},[4355,26312,26315],{"href":26313,"rel":26314},"https://discord.nuxt.com",[5233],"Nuxt Discord",[4333,26317],{},[102,26319,26320,26323],{},[4343,26321,26322],{},"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!",[4384,26325,26326],{},"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":120,"searchDepth":135,"depth":135,"links":26328},[26329,26330,26331,26334,26341,26351,26357,26364,26371,26372,26373,26382,26383],{"id":23636,"depth":135,"text":23631},{"id":23677,"depth":135,"text":23678},{"id":23718,"depth":135,"text":23719,"children":26332},[26333],{"id":23722,"depth":16,"text":23723},{"id":23818,"depth":135,"text":23819,"children":26335},[26336,26337,26338,26339,26340],{"id":23825,"depth":16,"text":23826},{"id":23910,"depth":16,"text":23911},{"id":23978,"depth":16,"text":23979},{"id":24000,"depth":16,"text":24001},{"id":24021,"depth":16,"text":24022},{"id":24049,"depth":135,"text":24050,"children":26342},[26343,26344,26345,26346,26347,26348,26349,26350],{"id":24053,"depth":16,"text":24054},{"id":24144,"depth":16,"text":24145},{"id":24213,"depth":16,"text":24214},{"id":24434,"depth":16,"text":24435},{"id":24537,"depth":16,"text":24538},{"id":24860,"depth":16,"text":24861},{"id":25024,"depth":16,"text":25025},{"id":25148,"depth":16,"text":25149},{"id":25344,"depth":135,"text":25345,"children":26352},[26353,26354,26355,26356],{"id":25348,"depth":16,"text":25349},{"id":25431,"depth":16,"text":25432},{"id":25454,"depth":16,"text":25455},{"id":25546,"depth":16,"text":25547},{"id":25593,"depth":135,"text":25594,"children":26358},[26359,26360,26361,26362,26363],{"id":25597,"depth":16,"text":25598},{"id":25654,"depth":16,"text":25655},{"id":25721,"depth":16,"text":25722},{"id":25767,"depth":16,"text":25768},{"id":25853,"depth":16,"text":25854},{"id":25880,"depth":135,"text":25881,"children":26365},[26366,26367,26368,26369,26370],{"id":25887,"depth":16,"text":25888},{"id":25913,"depth":16,"text":25914},{"id":25929,"depth":16,"text":25930},{"id":25956,"depth":16,"text":25957},{"id":25980,"depth":16,"text":25981},{"id":25997,"depth":135,"text":25998},{"id":26034,"depth":135,"text":26035},{"id":26149,"depth":135,"text":26150,"children":26374},[26375,26376,26377,26378,26379,26380,26381],{"id":26153,"depth":16,"text":26154},{"id":26163,"depth":16,"text":26164},{"id":26174,"depth":16,"text":26175},{"id":26184,"depth":16,"text":26185},{"id":26202,"depth":16,"text":26203},{"id":26212,"depth":16,"text":26213},{"id":26222,"depth":16,"text":26223},{"id":26231,"depth":135,"text":26232},{"id":26271,"depth":135,"text":26272},"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":26387,"keywords":26388},"15 min read",[26389,26390,26391,26392,26393,26394,26395,26396,26397,26398],"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":23631,"description":26385},"Modern Development","Exploring cutting-edge development practices and tools",{"src":26404,"mime":5167,"alt":26405,"width":5169,"height":5170},"/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",[26408,26409,26410,4432,26411],"Nuxt","Vue","Migration","Web Development","s1UGLxrbneRBuHSmwjworg3f6K2Y8ZzD_eJLKdzGve8",{"id":19276,"title":19277,"abstract":92,"author":93,"authorUrl":92,"body":26414,"date":23024,"dateUpdated":23024,"description":23025,"excerpt":92,"extension":4424,"featured":977,"headline":92,"image":92,"meta":29781,"navigation":977,"ogImage":92,"path":23028,"seo":29782,"series":4345,"seriesDescription":23030,"seriesOrder":16,"socialImage":29783,"stem":23034,"tags":29784,"__hash__":23038},{"type":95,"value":26415,"toc":29744},[26416,26418,26420,26422,26424,26442,26444,26446,26448,26472,26474,26492,26494,26496,26498,26812,26814,27140,27142,27556,27558,27820,27822,27824,28044,28046,28236,28238,28356,28358,28360,28562,28564,28868,28870,29134,29136,29138,29192,29194,29402,29404,29408,29476,29478,29480,29498,29500,29514,29516,29530,29532,29704,29706,29708,29730,29732,29734,29736,29738,29742],[98,26417,19277],{"id":19282},[102,26419,19285],{},[98,26421,19289],{"id":19288},[102,26423,19292],{},[4311,26425,26426,26430,26434,26438],{},[4314,26427,26428,19300],{},[4343,26429,19299],{},[4314,26431,26432,19305],{},[4343,26433,4434],{},[4314,26435,26436,19311],{},[4343,26437,19310],{},[4314,26439,26440,19317],{},[4343,26441,19316],{},[102,26443,19320],{},[98,26445,19324],{"id":19323},[110,26447,19328],{"id":19327},[115,26449,26450],{"className":1112,"code":19331,"language":184,"meta":120,"style":120},[122,26451,26452,26456,26460,26464,26468],{"__ignoreMap":120},[125,26453,26454],{"class":127,"line":128},[125,26455,19338],{"class":385},[125,26457,26458],{"class":127,"line":135},[125,26459,19343],{"class":385},[125,26461,26462],{"class":127,"line":16},[125,26463,19348],{"class":385},[125,26465,26466],{"class":127,"line":179},[125,26467,19353],{"class":385},[125,26469,26470],{"class":127,"line":200},[125,26471,19358],{"class":385},[110,26473,19362],{"id":19361},[4348,26475,26476,26480,26484,26488],{},[4314,26477,26478,19370],{},[4343,26479,19369],{},[4314,26481,26482,19376],{},[4343,26483,19375],{},[4314,26485,26486,19382],{},[4343,26487,19381],{},[4314,26489,26490,19388],{},[4343,26491,19387],{},[98,26493,19392],{"id":19391},[110,26495,19396],{"id":19395},[102,26497,19399],{},[115,26499,26500],{"className":1112,"code":19402,"language":184,"meta":120,"style":120},[122,26501,26502,26506,26536,26558,26576,26580,26604,26636,26668,26694,26726,26732,26736,26740,26754,26768,26772,26776,26794],{"__ignoreMap":120},[125,26503,26504],{"class":127,"line":128},[125,26505,19409],{"class":385},[125,26507,26508,26510,26512,26514,26516,26518,26520,26522,26524,26526,26528,26530,26532,26534],{"class":127,"line":135},[125,26509,1468],{"class":1125},[125,26511,1471],{"class":131},[125,26513,19418],{"class":965},[125,26515,735],{"class":131},[125,26517,19423],{"class":965},[125,26519,735],{"class":131},[125,26521,19428],{"class":965},[125,26523,735],{"class":131},[125,26525,19433],{"class":965},[125,26527,1487],{"class":131},[125,26529,1490],{"class":1125},[125,26531,167],{"class":131},[125,26533,19442],{"class":170},[125,26535,279],{"class":131},[125,26537,26538,26540,26542,26544,26546,26548,26550,26552,26554,26556],{"class":127,"line":16},[125,26539,1468],{"class":1125},[125,26541,1471],{"class":131},[125,26543,19453],{"class":965},[125,26545,735],{"class":131},[125,26547,19458],{"class":965},[125,26549,1487],{"class":131},[125,26551,1490],{"class":1125},[125,26553,167],{"class":131},[125,26555,19467],{"class":170},[125,26557,279],{"class":131},[125,26559,26560,26562,26564,26566,26568,26570,26572,26574],{"class":127,"line":179},[125,26561,1468],{"class":1125},[125,26563,1471],{"class":131},[125,26565,2650],{"class":965},[125,26567,1487],{"class":131},[125,26569,1490],{"class":1125},[125,26571,167],{"class":131},[125,26573,2659],{"class":170},[125,26575,279],{"class":131},[125,26577,26578],{"class":127,"line":200},[125,26579,978],{"emptyLinePlaceholder":977},[125,26581,26582,26584,26586,26588,26590,26592,26594,26596,26598,26600,26602],{"class":127,"line":221},[125,26583,1126],{"class":1125},[125,26585,1526],{"class":141},[125,26587,18984],{"class":965},[125,26589,1532],{"class":131},[125,26591,19418],{"class":1293},[125,26593,1247],{"class":965},[125,26595,145],{"class":131},[125,26597,10781],{"class":170},[125,26599,145],{"class":131},[125,26601,735],{"class":131},[125,26603,151],{"class":131},[125,26605,26606,26608,26610,26612,26614,26616,26618,26620,26622,26624,26626,26628,26630,26632,26634],{"class":127,"line":242},[125,26607,2492],{"class":1151},[125,26609,148],{"class":131},[125,26611,19433],{"class":1293},[125,26613,1247],{"class":965},[125,26615,145],{"class":131},[125,26617,2095],{"class":170},[125,26619,145],{"class":131},[125,26621,1349],{"class":965},[125,26623,1290],{"class":131},[125,26625,19538],{"class":1293},[125,26627,2739],{"class":965},[125,26629,1290],{"class":131},[125,26631,19545],{"class":1293},[125,26633,2739],{"class":965},[125,26635,176],{"class":131},[125,26637,26638,26640,26642,26644,26646,26648,26650,26652,26654,26656,26658,26660,26662,26664,26666],{"class":127,"line":263},[125,26639,2445],{"class":1151},[125,26641,148],{"class":131},[125,26643,19423],{"class":1293},[125,26645,1247],{"class":965},[125,26647,145],{"class":131},[125,26649,2744],{"class":170},[125,26651,145],{"class":131},[125,26653,1349],{"class":965},[125,26655,1290],{"class":131},[125,26657,19572],{"class":1293},[125,26659,2739],{"class":965},[125,26661,1290],{"class":131},[125,26663,19579],{"class":1293},[125,26665,2739],{"class":965},[125,26667,176],{"class":131},[125,26669,26670,26672,26674,26676,26678,26680,26682,26684,26686,26688,26690,26692],{"class":127,"line":282},[125,26671,2455],{"class":1151},[125,26673,148],{"class":131},[125,26675,19423],{"class":1293},[125,26677,1247],{"class":965},[125,26679,145],{"class":131},[125,26681,11754],{"class":170},[125,26683,145],{"class":131},[125,26685,1349],{"class":965},[125,26687,1290],{"class":131},[125,26689,19572],{"class":1293},[125,26691,2739],{"class":965},[125,26693,176],{"class":131},[125,26695,26696,26698,26700,26702,26704,26706,26708,26710,26712,26714,26716,26718,26720,26722,26724],{"class":127,"line":288},[125,26697,2517],{"class":1151},[125,26699,148],{"class":131},[125,26701,19428],{"class":1293},[125,26703,1247],{"class":965},[125,26705,145],{"class":131},[125,26707,19624],{"class":170},[125,26709,145],{"class":131},[125,26711,1349],{"class":965},[125,26713,1290],{"class":131},[125,26715,19633],{"class":1293},[125,26717,2739],{"class":965},[125,26719,1290],{"class":131},[125,26721,19572],{"class":1293},[125,26723,2739],{"class":965},[125,26725,176],{"class":131},[125,26727,26728,26730],{"class":127,"line":302},[125,26729,1426],{"class":131},[125,26731,1253],{"class":965},[125,26733,26734],{"class":127,"line":323},[125,26735,978],{"emptyLinePlaceholder":977},[125,26737,26738],{"class":127,"line":29},[125,26739,19658],{"class":385},[125,26741,26742,26744,26746,26748,26750,26752],{"class":127,"line":362},[125,26743,1126],{"class":1125},[125,26745,1526],{"class":141},[125,26747,19667],{"class":965},[125,26749,1532],{"class":131},[125,26751,19453],{"class":1293},[125,26753,19674],{"class":965},[125,26755,26756,26758,26760,26762,26764,26766],{"class":127,"line":368},[125,26757,1126],{"class":1125},[125,26759,1526],{"class":141},[125,26761,19683],{"class":965},[125,26763,1532],{"class":131},[125,26765,19458],{"class":1293},[125,26767,19674],{"class":965},[125,26769,26770],{"class":127,"line":601},[125,26771,978],{"emptyLinePlaceholder":977},[125,26773,26774],{"class":127,"line":615},[125,26775,19698],{"class":385},[125,26777,26778,26780,26782,26784,26786,26788,26790,26792],{"class":127,"line":629},[125,26779,1126],{"class":1125},[125,26781,19705],{"class":141},[125,26783,2032],{"class":159},[125,26785,1209],{"class":131},[125,26787,19712],{"class":131},[125,26789,17572],{"class":965},[125,26791,1290],{"class":131},[125,26793,19719],{"class":965},[125,26795,26796,26798,26800,26802,26804,26806,26808,26810],{"class":127,"line":643},[125,26797,1126],{"class":1125},[125,26799,19705],{"class":141},[125,26801,19728],{"class":159},[125,26803,1209],{"class":131},[125,26805,19712],{"class":131},[125,26807,17572],{"class":965},[125,26809,1290],{"class":131},[125,26811,19739],{"class":965},[110,26813,19743],{"id":19742},[115,26815,26816],{"className":1112,"code":19746,"language":184,"meta":120,"style":120},[122,26817,26818,26822,26840,26858,26880,26884,26898,26902,26906,26952,26980,26984,26988,27026,27030,27044,27060,27068,27088,27102,27106,27112,27118,27122,27126],{"__ignoreMap":120},[125,26819,26820],{"class":127,"line":128},[125,26821,19753],{"class":385},[125,26823,26824,26826,26828,26830,26832,26834,26836,26838],{"class":127,"line":135},[125,26825,1468],{"class":1125},[125,26827,1471],{"class":131},[125,26829,19762],{"class":965},[125,26831,1487],{"class":131},[125,26833,1490],{"class":1125},[125,26835,167],{"class":131},[125,26837,19771],{"class":170},[125,26839,279],{"class":131},[125,26841,26842,26844,26846,26848,26850,26852,26854,26856],{"class":127,"line":16},[125,26843,1468],{"class":1125},[125,26845,1471],{"class":131},[125,26847,19782],{"class":965},[125,26849,1487],{"class":131},[125,26851,1490],{"class":1125},[125,26853,167],{"class":131},[125,26855,19791],{"class":170},[125,26857,279],{"class":131},[125,26859,26860,26862,26864,26866,26868,26870,26872,26874,26876,26878],{"class":127,"line":179},[125,26861,1468],{"class":1125},[125,26863,1471],{"class":131},[125,26865,19802],{"class":965},[125,26867,735],{"class":131},[125,26869,19807],{"class":965},[125,26871,1487],{"class":131},[125,26873,1490],{"class":1125},[125,26875,167],{"class":131},[125,26877,19816],{"class":170},[125,26879,279],{"class":131},[125,26881,26882],{"class":127,"line":200},[125,26883,978],{"emptyLinePlaceholder":977},[125,26885,26886,26888,26890,26892,26894,26896],{"class":127,"line":221},[125,26887,1883],{"class":141},[125,26889,19829],{"class":965},[125,26891,1532],{"class":131},[125,26893,1950],{"class":131},[125,26895,19762],{"class":1293},[125,26897,1955],{"class":965},[125,26899,26900],{"class":127,"line":242},[125,26901,978],{"emptyLinePlaceholder":977},[125,26903,26904],{"class":127,"line":263},[125,26905,19846],{"class":385},[125,26907,26908,26910,26912,26914,26916,26918,26920,26922,26924,26926,26928,26930,26932,26934,26936,26938,26940,26942,26944,26946,26948,26950],{"class":127,"line":282},[125,26909,19851],{"class":965},[125,26911,1290],{"class":131},[125,26913,19096],{"class":1293},[125,26915,1247],{"class":965},[125,26917,145],{"class":131},[125,26919,17518],{"class":170},[125,26921,145],{"class":131},[125,26923,735],{"class":131},[125,26925,19782],{"class":1293},[125,26927,1247],{"class":965},[125,26929,145],{"class":131},[125,26931,119],{"class":170},[125,26933,145],{"class":131},[125,26935,735],{"class":131},[125,26937,19880],{"class":965},[125,26939,735],{"class":131},[125,26941,4029],{"class":141},[125,26943,1597],{"class":131},[125,26945,19889],{"class":1188},[125,26947,1349],{"class":131},[125,26949,3898],{"class":141},[125,26951,151],{"class":131},[125,26953,26954,26956,26958,26960,26962,26964,26966,26968,26970,26972,26974,26976,26978],{"class":127,"line":288},[125,26955,5018],{"class":141},[125,26957,2263],{"class":965},[125,26959,1209],{"class":131},[125,26961,17064],{"class":965},[125,26963,1290],{"class":131},[125,26965,2861],{"class":965},[125,26967,1290],{"class":131},[125,26969,19914],{"class":1293},[125,26971,1247],{"class":1151},[125,26973,145],{"class":131},[125,26975,119],{"class":170},[125,26977,145],{"class":131},[125,26979,1253],{"class":1151},[125,26981,26982],{"class":127,"line":302},[125,26983,19929],{"class":385},[125,26985,26986],{"class":127,"line":323},[125,26987,978],{"emptyLinePlaceholder":977},[125,26989,26990,26992,26994,26996,26998,27000,27002,27004,27006,27008,27010,27012,27014,27016,27018,27020,27022,27024],{"class":127,"line":29},[125,26991,5018],{"class":141},[125,26993,2929],{"class":965},[125,26995,1209],{"class":131},[125,26997,2934],{"class":1125},[125,26999,19946],{"class":965},[125,27001,1290],{"class":131},[125,27003,19951],{"class":1293},[125,27005,1247],{"class":1151},[125,27007,10781],{"class":965},[125,27009,1349],{"class":1151},[125,27011,1290],{"class":131},[125,27013,19962],{"class":1293},[125,27015,1247],{"class":1151},[125,27017,2182],{"class":965},[125,27019,1349],{"class":1151},[125,27021,1290],{"class":131},[125,27023,19973],{"class":1293},[125,27025,1955],{"class":1151},[125,27027,27028],{"class":127,"line":362},[125,27029,978],{"emptyLinePlaceholder":977},[125,27031,27032,27034,27036,27038,27040,27042],{"class":127,"line":368},[125,27033,4518],{"class":1125},[125,27035,17064],{"class":965},[125,27037,1290],{"class":131},[125,27039,119],{"class":1293},[125,27041,1247],{"class":1151},[125,27043,132],{"class":131},[125,27045,27046,27048,27050,27052,27054,27056,27058],{"class":127,"line":601},[125,27047,19998],{"class":1151},[125,27049,148],{"class":131},[125,27051,2929],{"class":965},[125,27053,3071],{"class":1151},[125,27055,3074],{"class":961},[125,27057,3077],{"class":1151},[125,27059,176],{"class":131},[125,27061,27062,27064,27066],{"class":127,"line":615},[125,27063,20015],{"class":1151},[125,27065,148],{"class":131},[125,27067,151],{"class":131},[125,27069,27070,27072,27074,27076,27078,27080,27082,27084,27086],{"class":127,"line":629},[125,27071,20024],{"class":1151},[125,27073,148],{"class":131},[125,27075,1950],{"class":131},[125,27077,4157],{"class":1293},[125,27079,2739],{"class":1151},[125,27081,1290],{"class":131},[125,27083,20037],{"class":1293},[125,27085,2739],{"class":1151},[125,27087,176],{"class":131},[125,27089,27090,27092,27094,27096,27098,27100],{"class":127,"line":643},[125,27091,20046],{"class":1151},[125,27093,148],{"class":131},[125,27095,167],{"class":131},[125,27097,4932],{"class":170},[125,27099,145],{"class":131},[125,27101,176],{"class":131},[125,27103,27104],{"class":127,"line":657},[125,27105,20061],{"class":131},[125,27107,27108,27110],{"class":127,"line":671},[125,27109,1830],{"class":131},[125,27111,1253],{"class":1151},[125,27113,27114,27116],{"class":127,"line":686},[125,27115,1426],{"class":131},[125,27117,1253],{"class":965},[125,27119,27120],{"class":127,"line":691},[125,27121,978],{"emptyLinePlaceholder":977},[125,27123,27124],{"class":127,"line":714},[125,27125,20082],{"class":385},[125,27127,27128,27130,27132,27134,27136,27138],{"class":127,"line":757},[125,27129,1126],{"class":1125},[125,27131,19705],{"class":141},[125,27133,20091],{"class":159},[125,27135,1209],{"class":131},[125,27137,19712],{"class":131},[125,27139,20098],{"class":965},[110,27141,20102],{"id":20101},[115,27143,27144],{"className":1112,"code":20105,"language":184,"meta":120,"style":120},[122,27145,27146,27150,27170,27190,27194,27198,27210,27214,27254,27284,27288,27306,27332,27336,27340,27352,27356,27360,27364,27376,27408,27450,27468,27490,27504,27520,27544,27552],{"__ignoreMap":120},[125,27147,27148],{"class":127,"line":128},[125,27149,20112],{"class":385},[125,27151,27152,27154,27156,27158,27160,27162,27164,27166,27168],{"class":127,"line":135},[125,27153,1468],{"class":1125},[125,27155,19705],{"class":1125},[125,27157,1471],{"class":131},[125,27159,20091],{"class":965},[125,27161,1487],{"class":131},[125,27163,1490],{"class":1125},[125,27165,167],{"class":131},[125,27167,20131],{"class":170},[125,27169,279],{"class":131},[125,27171,27172,27174,27176,27178,27180,27182,27184,27186,27188],{"class":127,"line":16},[125,27173,1468],{"class":1125},[125,27175,19705],{"class":1125},[125,27177,1471],{"class":131},[125,27179,20144],{"class":965},[125,27181,1487],{"class":131},[125,27183,1490],{"class":1125},[125,27185,167],{"class":131},[125,27187,19816],{"class":170},[125,27189,279],{"class":131},[125,27191,27192],{"class":127,"line":179},[125,27193,978],{"emptyLinePlaceholder":977},[125,27195,27196],{"class":127,"line":200},[125,27197,20163],{"class":385},[125,27199,27200,27202,27204,27206,27208],{"class":127,"line":221},[125,27201,4693],{"class":141},[125,27203,20170],{"class":159},[125,27205,1209],{"class":131},[125,27207,19712],{"class":131},[125,27209,20177],{"class":965},[125,27211,27212],{"class":127,"line":242},[125,27213,978],{"emptyLinePlaceholder":977},[125,27215,27216,27218,27220,27222,27224,27226,27228,27230,27232,27234,27236,27238,27240,27242,27244,27246,27248,27250,27252],{"class":127,"line":263},[125,27217,4960],{"class":141},[125,27219,4963],{"class":141},[125,27221,18991],{"class":1293},[125,27223,2108],{"class":131},[125,27225,2552],{"class":159},[125,27227,4490],{"class":131},[125,27229,20198],{"class":1188},[125,27231,148],{"class":131},[125,27233,1194],{"class":159},[125,27235,735],{"class":131},[125,27237,18140],{"class":1188},[125,27239,2577],{"class":131},[125,27241,20211],{"class":159},[125,27243,2102],{"class":131},[125,27245,2105],{"class":159},[125,27247,2108],{"class":131},[125,27249,2552],{"class":159},[125,27251,2119],{"class":131},[125,27253,151],{"class":131},[125,27255,27256,27258,27260,27262,27264,27266,27268,27270,27272,27274,27276,27278,27280,27282],{"class":127,"line":282},[125,27257,5018],{"class":141},[125,27259,5021],{"class":965},[125,27261,1209],{"class":131},[125,27263,2934],{"class":1125},[125,27265,5028],{"class":1293},[125,27267,1247],{"class":1151},[125,27269,1432],{"class":131},[125,27271,4704],{"class":170},[125,27273,4707],{"class":131},[125,27275,20198],{"class":965},[125,27277,5042],{"class":131},[125,27279,735],{"class":131},[125,27281,18140],{"class":965},[125,27283,1253],{"class":1151},[125,27285,27286],{"class":127,"line":288},[125,27287,978],{"emptyLinePlaceholder":977},[125,27289,27290,27292,27294,27296,27298,27300,27302,27304],{"class":127,"line":302},[125,27291,1594],{"class":1125},[125,27293,1597],{"class":1151},[125,27295,14572],{"class":131},[125,27297,20268],{"class":965},[125,27299,1290],{"class":131},[125,27301,20273],{"class":965},[125,27303,1584],{"class":1151},[125,27305,132],{"class":131},[125,27307,27308,27310,27312,27314,27316,27318,27320,27322,27324,27326,27328,27330],{"class":127,"line":323},[125,27309,20282],{"class":1125},[125,27311,1950],{"class":131},[125,27313,1138],{"class":1293},[125,27315,1247],{"class":1151},[125,27317,1432],{"class":131},[125,27319,20293],{"class":170},[125,27321,4707],{"class":131},[125,27323,20268],{"class":965},[125,27325,1290],{"class":131},[125,27327,1622],{"class":965},[125,27329,5042],{"class":131},[125,27331,1253],{"class":1151},[125,27333,27334],{"class":127,"line":29},[125,27335,365],{"class":131},[125,27337,27338],{"class":127,"line":362},[125,27339,978],{"emptyLinePlaceholder":977},[125,27341,27342,27344,27346,27348,27350],{"class":127,"line":368},[125,27343,4518],{"class":1125},[125,27345,5021],{"class":965},[125,27347,1290],{"class":131},[125,27349,119],{"class":1293},[125,27351,1955],{"class":1151},[125,27353,27354],{"class":127,"line":601},[125,27355,371],{"class":131},[125,27357,27358],{"class":127,"line":615},[125,27359,978],{"emptyLinePlaceholder":977},[125,27361,27362],{"class":127,"line":629},[125,27363,20338],{"class":385},[125,27365,27366,27368,27370,27372,27374],{"class":127,"line":643},[125,27367,1126],{"class":1125},[125,27369,1526],{"class":141},[125,27371,20347],{"class":965},[125,27373,1532],{"class":131},[125,27375,151],{"class":131},[125,27377,27378,27380,27382,27384,27386,27388,27390,27392,27394,27396,27398,27400,27402,27404,27406],{"class":127,"line":657},[125,27379,20356],{"class":1293},[125,27381,148],{"class":131},[125,27383,3895],{"class":131},[125,27385,3898],{"class":141},[125,27387,18991],{"class":1293},[125,27389,2108],{"class":131},[125,27391,20369],{"class":159},[125,27393,10184],{"class":965},[125,27395,2119],{"class":131},[125,27397,1247],{"class":965},[125,27399,145],{"class":131},[125,27401,20380],{"class":170},[125,27403,145],{"class":131},[125,27405,1349],{"class":965},[125,27407,176],{"class":131},[125,27409,27410,27412,27414,27416,27418,27420,27422,27424,27426,27428,27430,27432,27434,27436,27438,27440,27442,27444,27446,27448],{"class":127,"line":671},[125,27411,20391],{"class":1293},[125,27413,148],{"class":131},[125,27415,1597],{"class":131},[125,27417,2095],{"class":1188},[125,27419,148],{"class":131},[125,27421,1194],{"class":159},[125,27423,1349],{"class":131},[125,27425,3898],{"class":141},[125,27427,18991],{"class":1293},[125,27429,2108],{"class":131},[125,27431,20369],{"class":159},[125,27433,2119],{"class":131},[125,27435,1247],{"class":965},[125,27437,1432],{"class":131},[125,27439,5035],{"class":170},[125,27441,4707],{"class":131},[125,27443,2095],{"class":965},[125,27445,5042],{"class":131},[125,27447,1349],{"class":965},[125,27449,176],{"class":131},[125,27451,27452,27454,27456,27458,27460,27462,27464,27466],{"class":127,"line":686},[125,27453,15028],{"class":1293},[125,27455,148],{"class":131},[125,27457,1597],{"class":131},[125,27459,2182],{"class":1188},[125,27461,148],{"class":131},[125,27463,19728],{"class":159},[125,27465,1349],{"class":131},[125,27467,20448],{"class":141},[125,27469,27470,27472,27474,27476,27478,27480,27482,27484,27486,27488],{"class":127,"line":691},[125,27471,20453],{"class":1293},[125,27473,2108],{"class":131},[125,27475,20369],{"class":159},[125,27477,2119],{"class":131},[125,27479,1247],{"class":965},[125,27481,145],{"class":131},[125,27483,20380],{"class":170},[125,27485,145],{"class":131},[125,27487,735],{"class":131},[125,27489,151],{"class":131},[125,27491,27492,27494,27496,27498,27500,27502],{"class":127,"line":714},[125,27493,20476],{"class":1151},[125,27495,148],{"class":131},[125,27497,167],{"class":131},[125,27499,10724],{"class":170},[125,27501,145],{"class":131},[125,27503,176],{"class":131},[125,27505,27506,27508,27510,27512,27514,27516,27518],{"class":127,"line":757},[125,27507,17607],{"class":1151},[125,27509,148],{"class":131},[125,27511,20495],{"class":965},[125,27513,1290],{"class":131},[125,27515,20500],{"class":1293},[125,27517,20503],{"class":965},[125,27519,176],{"class":131},[125,27521,27522,27524,27526,27528,27530,27532,27534,27536,27538,27540,27542],{"class":127,"line":1396},[125,27523,20510],{"class":1151},[125,27525,148],{"class":131},[125,27527,1471],{"class":131},[125,27529,167],{"class":131},[125,27531,20519],{"class":1151},[125,27533,145],{"class":131},[125,27535,148],{"class":131},[125,27537,167],{"class":131},[125,27539,20528],{"class":170},[125,27541,145],{"class":131},[125,27543,2156],{"class":131},[125,27545,27546,27548,27550],{"class":127,"line":1414},[125,27547,1729],{"class":131},[125,27549,1349],{"class":965},[125,27551,176],{"class":131},[125,27553,27554],{"class":127,"line":1442},[125,27555,371],{"class":131},[110,27557,20548],{"id":20547},[115,27559,27560],{"className":1112,"code":20551,"language":184,"meta":120,"style":120},[122,27561,27562,27566,27582,27600,27620,27624,27628,27666,27676,27680,27684,27688,27712,27720,27728,27746,27754,27758,27762,27774,27802,27806,27812],{"__ignoreMap":120},[125,27563,27564],{"class":127,"line":128},[125,27565,20558],{"class":385},[125,27567,27568,27570,27572,27574,27576,27578,27580],{"class":127,"line":135},[125,27569,2108],{"class":131},[125,27571,20565],{"class":965},[125,27573,1532],{"class":131},[125,27575,145],{"class":131},[125,27577,20572],{"class":170},[125,27579,145],{"class":131},[125,27581,3937],{"class":131},[125,27583,27584,27586,27588,27590,27592,27594,27596,27598],{"class":127,"line":16},[125,27585,1468],{"class":1125},[125,27587,1471],{"class":131},[125,27589,20585],{"class":965},[125,27591,1487],{"class":131},[125,27593,1490],{"class":1125},[125,27595,20592],{"class":131},[125,27597,20595],{"class":170},[125,27599,20598],{"class":131},[125,27601,27602,27604,27606,27608,27610,27612,27614,27616,27618],{"class":127,"line":179},[125,27603,1468],{"class":1125},[125,27605,19705],{"class":1125},[125,27607,1471],{"class":131},[125,27609,2032],{"class":965},[125,27611,1487],{"class":131},[125,27613,1490],{"class":1125},[125,27615,20592],{"class":131},[125,27617,19816],{"class":170},[125,27619,20598],{"class":131},[125,27621,27622],{"class":127,"line":200},[125,27623,978],{"emptyLinePlaceholder":977},[125,27625,27626],{"class":127,"line":221},[125,27627,20627],{"class":385},[125,27629,27630,27632,27634,27636,27638,27640,27642,27644,27646,27648,27650,27652,27654,27656,27658,27660,27662,27664],{"class":127,"line":242},[125,27631,1883],{"class":141},[125,27633,1471],{"class":131},[125,27635,2263],{"class":1151},[125,27637,148],{"class":131},[125,27639,17572],{"class":965},[125,27641,735],{"class":131},[125,27643,20644],{"class":965},[125,27645,1426],{"class":131},[125,27647,1209],{"class":131},[125,27649,2934],{"class":1125},[125,27651,20653],{"class":1293},[125,27653,1247],{"class":965},[125,27655,20658],{"class":131},[125,27657,10781],{"class":170},[125,27659,20658],{"class":131},[125,27661,735],{"class":131},[125,27663,3895],{"class":131},[125,27665,20448],{"class":141},[125,27667,27668,27670,27672,27674],{"class":127,"line":263},[125,27669,20673],{"class":965},[125,27671,1290],{"class":131},[125,27673,20678],{"class":1293},[125,27675,1955],{"class":965},[125,27677,27678],{"class":127,"line":282},[125,27679,1253],{"class":965},[125,27681,27682],{"class":127,"line":288},[125,27683,978],{"emptyLinePlaceholder":977},[125,27685,27686],{"class":127,"line":302},[125,27687,20693],{"class":385},[125,27689,27690,27692,27694,27696,27698,27700,27702,27704,27706,27708,27710],{"class":127,"line":323},[125,27691,1883],{"class":141},[125,27693,20700],{"class":965},[125,27695,1532],{"class":131},[125,27697,20705],{"class":1293},[125,27699,4992],{"class":131},[125,27701,2929],{"class":1151},[125,27703,148],{"class":131},[125,27705,2032],{"class":159},[125,27707,20716],{"class":131},[125,27709,1247],{"class":965},[125,27711,132],{"class":131},[125,27713,27714,27716,27718],{"class":127,"line":29},[125,27715,20725],{"class":1151},[125,27717,148],{"class":131},[125,27719,151],{"class":131},[125,27721,27722,27724,27726],{"class":127,"line":362},[125,27723,20734],{"class":1151},[125,27725,148],{"class":131},[125,27727,151],{"class":131},[125,27729,27730,27732,27734,27736,27738,27740,27742,27744],{"class":127,"line":368},[125,27731,20743],{"class":1151},[125,27733,148],{"class":131},[125,27735,20748],{"class":965},[125,27737,1894],{"class":1125},[125,27739,20753],{"class":159},[125,27741,2108],{"class":131},[125,27743,2111],{"class":159},[125,27745,14964],{"class":131},[125,27747,27748,27750,27752],{"class":127,"line":601},[125,27749,20764],{"class":1151},[125,27751,148],{"class":131},[125,27753,683],{"class":1229},[125,27755,27756],{"class":127,"line":615},[125,27757,3133],{"class":131},[125,27759,27760],{"class":127,"line":629},[125,27761,285],{"class":131},[125,27763,27764,27766,27768,27770,27772],{"class":127,"line":643},[125,27765,20781],{"class":1151},[125,27767,20784],{"class":131},[125,27769,2929],{"class":1188},[125,27771,16085],{"class":131},[125,27773,151],{"class":131},[125,27775,27776,27778,27780,27782,27784,27786,27788,27790,27792,27794,27796,27798,27800],{"class":127,"line":657},[125,27777,1614],{"class":1125},[125,27779,3895],{"class":131},[125,27781,3898],{"class":141},[125,27783,20801],{"class":1293},[125,27785,1247],{"class":1151},[125,27787,20658],{"class":131},[125,27789,20808],{"class":170},[125,27791,20658],{"class":131},[125,27793,735],{"class":131},[125,27795,2929],{"class":965},[125,27797,1290],{"class":131},[125,27799,11754],{"class":965},[125,27801,1253],{"class":1151},[125,27803,27804],{"class":127,"line":671},[125,27805,365],{"class":131},[125,27807,27808,27810],{"class":127,"line":686},[125,27809,1426],{"class":131},[125,27811,1253],{"class":965},[125,27813,27814,27816,27818],{"class":127,"line":691},[125,27815,20835],{"class":131},[125,27817,20838],{"class":965},[125,27819,3937],{"class":131},[98,27821,20844],{"id":20843},[110,27823,20848],{"id":20847},[115,27825,27826],{"className":1112,"code":20851,"language":184,"meta":120,"style":120},[122,27827,27828,27832,27850,27854,27858,27892,27904,27914,27930,27952,27968,27990,27998,28004,28008],{"__ignoreMap":120},[125,27829,27830],{"class":127,"line":128},[125,27831,20858],{"class":385},[125,27833,27834,27836,27838,27840,27842,27844,27846,27848],{"class":127,"line":135},[125,27835,1468],{"class":1125},[125,27837,1471],{"class":131},[125,27839,2650],{"class":965},[125,27841,1487],{"class":131},[125,27843,1490],{"class":1125},[125,27845,167],{"class":131},[125,27847,2659],{"class":170},[125,27849,279],{"class":131},[125,27851,27852],{"class":127,"line":16},[125,27853,978],{"emptyLinePlaceholder":977},[125,27855,27856],{"class":127,"line":179},[125,27857,20885],{"class":385},[125,27859,27860,27862,27864,27866,27868,27870,27872,27874,27876,27878,27880,27882,27884,27886,27888,27890],{"class":127,"line":200},[125,27861,1126],{"class":1125},[125,27863,1526],{"class":141},[125,27865,20894],{"class":965},[125,27867,1532],{"class":131},[125,27869,20899],{"class":131},[125,27871,2552],{"class":159},[125,27873,1135],{"class":141},[125,27875,2650],{"class":159},[125,27877,1290],{"class":131},[125,27879,20910],{"class":159},[125,27881,4490],{"class":131},[125,27883,20915],{"class":1188},[125,27885,148],{"class":131},[125,27887,4498],{"class":159},[125,27889,1349],{"class":131},[125,27891,20448],{"class":141},[125,27893,27894,27896,27898,27900,27902],{"class":127,"line":221},[125,27895,20928],{"class":965},[125,27897,1290],{"class":131},[125,27899,2719],{"class":1293},[125,27901,1247],{"class":965},[125,27903,132],{"class":131},[125,27905,27906,27908,27910,27912],{"class":127,"line":242},[125,27907,19998],{"class":1151},[125,27909,148],{"class":131},[125,27911,20945],{"class":965},[125,27913,176],{"class":131},[125,27915,27916,27918,27920,27922,27924,27926,27928],{"class":127,"line":263},[125,27917,20015],{"class":1151},[125,27919,148],{"class":131},[125,27921,2650],{"class":965},[125,27923,1290],{"class":131},[125,27925,2719],{"class":1293},[125,27927,1247],{"class":965},[125,27929,132],{"class":131},[125,27931,27932,27934,27936,27938,27940,27942,27944,27946,27948,27950],{"class":127,"line":282},[125,27933,20024],{"class":1151},[125,27935,148],{"class":131},[125,27937,2650],{"class":965},[125,27939,1290],{"class":131},[125,27941,2736],{"class":1293},[125,27943,2739],{"class":965},[125,27945,1290],{"class":131},[125,27947,20982],{"class":1293},[125,27949,2739],{"class":965},[125,27951,176],{"class":131},[125,27953,27954,27956,27958,27960,27962,27964,27966],{"class":127,"line":288},[125,27955,20046],{"class":1151},[125,27957,148],{"class":131},[125,27959,2650],{"class":965},[125,27961,1290],{"class":131},[125,27963,2736],{"class":1293},[125,27965,2739],{"class":965},[125,27967,176],{"class":131},[125,27969,27970,27972,27974,27976,27978,27980,27982,27984,27986,27988],{"class":127,"line":302},[125,27971,21007],{"class":1151},[125,27973,148],{"class":131},[125,27975,2650],{"class":965},[125,27977,1290],{"class":131},[125,27979,2736],{"class":1293},[125,27981,2739],{"class":965},[125,27983,1290],{"class":131},[125,27985,21022],{"class":1293},[125,27987,2739],{"class":965},[125,27989,176],{"class":131},[125,27991,27992,27994,27996],{"class":127,"line":323},[125,27993,1729],{"class":131},[125,27995,1349],{"class":965},[125,27997,176],{"class":131},[125,27999,28000,28002],{"class":127,"line":29},[125,28001,1830],{"class":131},[125,28003,1253],{"class":965},[125,28005,28006],{"class":127,"line":362},[125,28007,978],{"emptyLinePlaceholder":977},[125,28009,28010,28012,28014,28016,28018,28020,28022,28024,28026,28028,28030,28032,28034,28036,28038,28040,28042],{"class":127,"line":368},[125,28011,1126],{"class":1125},[125,28013,19705],{"class":141},[125,28015,2547],{"class":159},[125,28017,2108],{"class":131},[125,28019,2552],{"class":159},[125,28021,2119],{"class":131},[125,28023,1209],{"class":131},[125,28025,2650],{"class":159},[125,28027,1290],{"class":131},[125,28029,4758],{"class":159},[125,28031,2108],{"class":131},[125,28033,21071],{"class":159},[125,28035,21074],{"class":131},[125,28037,21077],{"class":965},[125,28039,2108],{"class":131},[125,28041,2552],{"class":159},[125,28043,13145],{"class":131},[110,28045,21087],{"id":21086},[115,28047,28048],{"className":1112,"code":21090,"language":184,"meta":120,"style":120},[122,28049,28050,28054,28072,28076,28094,28116,28142,28182,28188,28192,28214],{"__ignoreMap":120},[125,28051,28052],{"class":127,"line":128},[125,28053,21097],{"class":385},[125,28055,28056,28058,28060,28062,28064,28066,28068,28070],{"class":127,"line":135},[125,28057,1468],{"class":1125},[125,28059,1471],{"class":131},[125,28061,2650],{"class":965},[125,28063,1487],{"class":131},[125,28065,1490],{"class":1125},[125,28067,167],{"class":131},[125,28069,2659],{"class":170},[125,28071,279],{"class":131},[125,28073,28074],{"class":127,"line":16},[125,28075,978],{"emptyLinePlaceholder":977},[125,28077,28078,28080,28082,28084,28086,28088,28090,28092],{"class":127,"line":179},[125,28079,1883],{"class":141},[125,28081,21126],{"class":965},[125,28083,1532],{"class":131},[125,28085,2650],{"class":965},[125,28087,1290],{"class":131},[125,28089,2719],{"class":1293},[125,28091,1247],{"class":965},[125,28093,132],{"class":131},[125,28095,28096,28098,28100,28102,28104,28106,28108,28110,28112,28114],{"class":127,"line":200},[125,28097,21143],{"class":1151},[125,28099,148],{"class":131},[125,28101,2650],{"class":965},[125,28103,1290],{"class":131},[125,28105,2736],{"class":1293},[125,28107,2739],{"class":965},[125,28109,1290],{"class":131},[125,28111,21158],{"class":1293},[125,28113,2739],{"class":965},[125,28115,176],{"class":131},[125,28117,28118,28120,28122,28124,28126,28128,28130,28132,28134,28136,28138,28140],{"class":127,"line":221},[125,28119,21167],{"class":1151},[125,28121,148],{"class":131},[125,28123,2650],{"class":965},[125,28125,1290],{"class":131},[125,28127,2736],{"class":1293},[125,28129,2739],{"class":965},[125,28131,1290],{"class":131},[125,28133,2767],{"class":1293},[125,28135,1247],{"class":965},[125,28137,4132],{"class":961},[125,28139,1349],{"class":965},[125,28141,176],{"class":131},[125,28143,28144,28146,28148,28150,28152,28154,28156,28158,28160,28162,28164,28166,28168,28170,28172,28174,28176,28178,28180],{"class":127,"line":242},[125,28145,21194],{"class":1151},[125,28147,148],{"class":131},[125,28149,2650],{"class":965},[125,28151,1290],{"class":131},[125,28153,21203],{"class":1293},[125,28155,21206],{"class":965},[125,28157,145],{"class":131},[125,28159,1699],{"class":170},[125,28161,145],{"class":131},[125,28163,735],{"class":131},[125,28165,167],{"class":131},[125,28167,1984],{"class":170},[125,28169,145],{"class":131},[125,28171,735],{"class":131},[125,28173,167],{"class":131},[125,28175,921],{"class":170},[125,28177,145],{"class":131},[125,28179,21231],{"class":965},[125,28181,176],{"class":131},[125,28183,28184,28186],{"class":127,"line":263},[125,28185,1426],{"class":131},[125,28187,1253],{"class":965},[125,28189,28190],{"class":127,"line":282},[125,28191,978],{"emptyLinePlaceholder":977},[125,28193,28194,28196,28198,28200,28202,28204,28206,28208,28210,28212],{"class":127,"line":288},[125,28195,1126],{"class":1125},[125,28197,1526],{"class":141},[125,28199,21252],{"class":965},[125,28201,1532],{"class":131},[125,28203,21257],{"class":965},[125,28205,1290],{"class":131},[125,28207,2911],{"class":1293},[125,28209,3692],{"class":965},[125,28211,1290],{"class":131},[125,28213,21268],{"class":965},[125,28215,28216,28218,28220,28222,28224,28226,28228,28230,28232,28234],{"class":127,"line":302},[125,28217,1126],{"class":1125},[125,28219,19705],{"class":141},[125,28221,21277],{"class":159},[125,28223,1209],{"class":131},[125,28225,2650],{"class":159},[125,28227,1290],{"class":131},[125,28229,4758],{"class":159},[125,28231,21074],{"class":131},[125,28233,21257],{"class":965},[125,28235,3937],{"class":131},[110,28237,21295],{"id":21294},[115,28239,28240],{"className":1112,"code":21298,"language":184,"meta":120,"style":120},[122,28241,28242,28246,28264,28268,28282,28290,28294,28298,28302,28306,28310,28314,28318,28322,28326,28340,28352],{"__ignoreMap":120},[125,28243,28244],{"class":127,"line":128},[125,28245,21305],{"class":385},[125,28247,28248,28250,28252,28254,28256,28258,28260,28262],{"class":127,"line":135},[125,28249,1468],{"class":1125},[125,28251,1471],{"class":131},[125,28253,21314],{"class":965},[125,28255,1487],{"class":131},[125,28257,1490],{"class":1125},[125,28259,167],{"class":131},[125,28261,21323],{"class":170},[125,28263,279],{"class":131},[125,28265,28266],{"class":127,"line":16},[125,28267,978],{"emptyLinePlaceholder":977},[125,28269,28270,28272,28274,28276,28278,28280],{"class":127,"line":179},[125,28271,1126],{"class":1125},[125,28273,4029],{"class":141},[125,28275,4963],{"class":141},[125,28277,21340],{"class":1293},[125,28279,2739],{"class":131},[125,28281,151],{"class":131},[125,28283,28284,28286,28288],{"class":127,"line":200},[125,28285,21349],{"class":1125},[125,28287,21314],{"class":1293},[125,28289,21354],{"class":131},[125,28291,28292],{"class":127,"line":221},[125,28293,21359],{"class":170},[125,28295,28296],{"class":127,"line":242},[125,28297,21364],{"class":170},[125,28299,28300],{"class":127,"line":263},[125,28301,21369],{"class":170},[125,28303,28304],{"class":127,"line":282},[125,28305,21374],{"class":170},[125,28307,28308],{"class":127,"line":288},[125,28309,21379],{"class":170},[125,28311,28312],{"class":127,"line":302},[125,28313,21384],{"class":170},[125,28315,28316],{"class":127,"line":323},[125,28317,21389],{"class":131},[125,28319,28320],{"class":127,"line":29},[125,28321,371],{"class":131},[125,28323,28324],{"class":127,"line":362},[125,28325,978],{"emptyLinePlaceholder":977},[125,28327,28328,28330,28332,28334,28336,28338],{"class":127,"line":368},[125,28329,1126],{"class":1125},[125,28331,4029],{"class":141},[125,28333,4963],{"class":141},[125,28335,21408],{"class":1293},[125,28337,2739],{"class":131},[125,28339,151],{"class":131},[125,28341,28342,28344,28346,28348,28350],{"class":127,"line":601},[125,28343,21349],{"class":1125},[125,28345,21314],{"class":1293},[125,28347,1432],{"class":131},[125,28349,21423],{"class":170},[125,28351,21354],{"class":131},[125,28353,28354],{"class":127,"line":615},[125,28355,371],{"class":131},[98,28357,21433],{"id":21432},[110,28359,21437],{"id":21436},[115,28361,28362],{"className":1112,"code":21440,"language":184,"meta":120,"style":120},[122,28363,28364,28368,28392,28418,28444,28464,28490,28520,28556],{"__ignoreMap":120},[125,28365,28366],{"class":127,"line":128},[125,28367,21447],{"class":385},[125,28369,28370,28372,28374,28376,28378,28380,28382,28384,28386,28388,28390],{"class":127,"line":135},[125,28371,1126],{"class":1125},[125,28373,1526],{"class":141},[125,28375,12513],{"class":965},[125,28377,1532],{"class":131},[125,28379,19418],{"class":1293},[125,28381,1247],{"class":965},[125,28383,145],{"class":131},[125,28385,21466],{"class":170},[125,28387,145],{"class":131},[125,28389,735],{"class":131},[125,28391,151],{"class":131},[125,28393,28394,28396,28398,28400,28402,28404,28406,28408,28410,28412,28414,28416],{"class":127,"line":16},[125,28395,2492],{"class":1151},[125,28397,148],{"class":131},[125,28399,19433],{"class":1293},[125,28401,1247],{"class":965},[125,28403,145],{"class":131},[125,28405,2095],{"class":170},[125,28407,145],{"class":131},[125,28409,1349],{"class":965},[125,28411,1290],{"class":131},[125,28413,19538],{"class":1293},[125,28415,2739],{"class":965},[125,28417,176],{"class":131},[125,28419,28420,28422,28424,28426,28428,28430,28432,28434,28436,28438,28440,28442],{"class":127,"line":179},[125,28421,2455],{"class":1151},[125,28423,148],{"class":131},[125,28425,19423],{"class":1293},[125,28427,1247],{"class":965},[125,28429,145],{"class":131},[125,28431,11754],{"class":170},[125,28433,145],{"class":131},[125,28435,1349],{"class":965},[125,28437,1290],{"class":131},[125,28439,19572],{"class":1293},[125,28441,2739],{"class":965},[125,28443,176],{"class":131},[125,28445,28446,28448,28450,28452,28454,28456,28458,28460,28462],{"class":127,"line":200},[125,28447,21529],{"class":1151},[125,28449,148],{"class":131},[125,28451,19423],{"class":1293},[125,28453,1247],{"class":965},[125,28455,145],{"class":131},[125,28457,21540],{"class":170},[125,28459,145],{"class":131},[125,28461,1349],{"class":965},[125,28463,176],{"class":131},[125,28465,28466,28468,28470,28472,28474,28476,28478,28480,28482,28484,28486,28488],{"class":127,"line":221},[125,28467,12444],{"class":1151},[125,28469,148],{"class":131},[125,28471,21555],{"class":1293},[125,28473,1247],{"class":965},[125,28475,145],{"class":131},[125,28477,21562],{"class":170},[125,28479,145],{"class":131},[125,28481,1349],{"class":965},[125,28483,1290],{"class":131},[125,28485,19572],{"class":1293},[125,28487,2739],{"class":965},[125,28489,176],{"class":131},[125,28491,28492,28494,28496,28498,28500,28502,28504,28506,28508,28510,28512,28514,28516,28518],{"class":127,"line":242},[125,28493,21579],{"class":1151},[125,28495,148],{"class":131},[125,28497,21584],{"class":1293},[125,28499,1247],{"class":965},[125,28501,145],{"class":131},[125,28503,21591],{"class":170},[125,28505,145],{"class":131},[125,28507,1349],{"class":965},[125,28509,1290],{"class":131},[125,28511,21600],{"class":1293},[125,28513,1247],{"class":965},[125,28515,3074],{"class":961},[125,28517,1349],{"class":965},[125,28519,176],{"class":131},[125,28521,28522,28524,28526,28528,28530,28532,28534,28536,28538,28540,28542,28544,28546,28548,28550,28552,28554],{"class":127,"line":263},[125,28523,21613],{"class":1151},[125,28525,148],{"class":131},[125,28527,19433],{"class":1293},[125,28529,1247],{"class":965},[125,28531,145],{"class":131},[125,28533,21624],{"class":170},[125,28535,145],{"class":131},[125,28537,1349],{"class":965},[125,28539,1290],{"class":131},[125,28541,21633],{"class":1293},[125,28543,1247],{"class":965},[125,28545,2739],{"class":131},[125,28547,3898],{"class":141},[125,28549,21642],{"class":965},[125,28551,1290],{"class":131},[125,28553,21647],{"class":965},[125,28555,176],{"class":131},[125,28557,28558,28560],{"class":127,"line":282},[125,28559,1426],{"class":131},[125,28561,1253],{"class":965},[110,28563,21659],{"id":21658},[115,28565,28566],{"className":1112,"code":21662,"language":184,"meta":120,"style":120},[122,28567,28568,28572,28582,28592,28640,28654,28686,28690,28718,28742,28750,28760,28770,28774,28780,28784,28798,28828,28832,28836,28860,28864],{"__ignoreMap":120},[125,28569,28570],{"class":127,"line":128},[125,28571,21669],{"class":385},[125,28573,28574,28576,28578,28580],{"class":127,"line":135},[125,28575,19851],{"class":965},[125,28577,1290],{"class":131},[125,28579,11816],{"class":1293},[125,28581,1183],{"class":965},[125,28583,28584,28586,28588,28590],{"class":127,"line":16},[125,28585,138],{"class":131},[125,28587,21686],{"class":170},[125,28589,145],{"class":131},[125,28591,176],{"class":131},[125,28593,28594,28596,28598,28600,28602,28604,28606,28608,28610,28612,28614,28616,28618,28620,28622,28624,28626,28628,28630,28632,28634,28636,28638],{"class":127,"line":179},[125,28595,21695],{"class":1293},[125,28597,1247],{"class":965},[125,28599,145],{"class":131},[125,28601,21702],{"class":170},[125,28603,145],{"class":131},[125,28605,735],{"class":131},[125,28607,2650],{"class":965},[125,28609,1290],{"class":131},[125,28611,2719],{"class":1293},[125,28613,1247],{"class":965},[125,28615,3553],{"class":131},[125,28617,2153],{"class":1151},[125,28619,148],{"class":131},[125,28621,2650],{"class":965},[125,28623,1290],{"class":131},[125,28625,2736],{"class":1293},[125,28627,2739],{"class":965},[125,28629,1290],{"class":131},[125,28631,21022],{"class":1293},[125,28633,3968],{"class":965},[125,28635,1426],{"class":131},[125,28637,21739],{"class":965},[125,28639,176],{"class":131},[125,28641,28642,28644,28646,28648,28650,28652],{"class":127,"line":200},[125,28643,2087],{"class":141},[125,28645,1597],{"class":131},[125,28647,19889],{"class":1188},[125,28649,1349],{"class":131},[125,28651,3898],{"class":141},[125,28653,151],{"class":131},[125,28655,28656,28658,28660,28662,28664,28666,28668,28670,28672,28674,28676,28678,28680,28682,28684],{"class":127,"line":221},[125,28657,4040],{"class":141},[125,28659,1471],{"class":131},[125,28661,2153],{"class":965},[125,28663,1487],{"class":131},[125,28665,1209],{"class":131},[125,28667,17064],{"class":965},[125,28669,1290],{"class":131},[125,28671,2861],{"class":965},[125,28673,1290],{"class":131},[125,28675,19914],{"class":1293},[125,28677,1247],{"class":1151},[125,28679,145],{"class":131},[125,28681,21702],{"class":170},[125,28683,145],{"class":131},[125,28685,1253],{"class":1151},[125,28687,28688],{"class":127,"line":242},[125,28689,978],{"emptyLinePlaceholder":977},[125,28691,28692,28694,28696,28698,28700,28702,28704,28706,28708,28710,28712,28714,28716],{"class":127,"line":263},[125,28693,4040],{"class":141},[125,28695,21798],{"class":965},[125,28697,1209],{"class":131},[125,28699,2934],{"class":1125},[125,28701,19946],{"class":965},[125,28703,1290],{"class":131},[125,28705,21809],{"class":965},[125,28707,1290],{"class":131},[125,28709,21466],{"class":965},[125,28711,1290],{"class":131},[125,28713,21818],{"class":1293},[125,28715,1247],{"class":1151},[125,28717,132],{"class":131},[125,28719,28720,28722,28724,28726,28728,28730,28732,28734,28736,28738,28740],{"class":127,"line":282},[125,28721,2146],{"class":1151},[125,28723,148],{"class":131},[125,28725,12580],{"class":1293},[125,28727,1247],{"class":1151},[125,28729,21466],{"class":965},[125,28731,1290],{"class":131},[125,28733,2095],{"class":965},[125,28735,735],{"class":131},[125,28737,2153],{"class":965},[125,28739,1349],{"class":1151},[125,28741,176],{"class":131},[125,28743,28744,28746,28748],{"class":127,"line":288},[125,28745,21851],{"class":1151},[125,28747,148],{"class":131},[125,28749,151],{"class":131},[125,28751,28752,28754,28756,28758],{"class":127,"line":302},[125,28753,21860],{"class":1151},[125,28755,148],{"class":131},[125,28757,1230],{"class":1229},[125,28759,176],{"class":131},[125,28761,28762,28764,28766,28768],{"class":127,"line":323},[125,28763,21871],{"class":1151},[125,28765,148],{"class":131},[125,28767,1230],{"class":1229},[125,28769,176],{"class":131},[125,28771,28772],{"class":127,"line":29},[125,28773,21882],{"class":131},[125,28775,28776,28778],{"class":127,"line":362},[125,28777,1729],{"class":131},[125,28779,1253],{"class":1151},[125,28781,28782],{"class":127,"line":368},[125,28783,978],{"emptyLinePlaceholder":977},[125,28785,28786,28788,28790,28792,28794,28796],{"class":127,"line":601},[125,28787,15679],{"class":1125},[125,28789,1597],{"class":1151},[125,28791,14572],{"class":131},[125,28793,21903],{"class":965},[125,28795,1584],{"class":1151},[125,28797,132],{"class":131},[125,28799,28800,28802,28804,28806,28808,28810,28812,28814,28816,28818,28820,28822,28824,28826],{"class":127,"line":615},[125,28801,21912],{"class":1125},[125,28803,17064],{"class":965},[125,28805,1290],{"class":131},[125,28807,119],{"class":1293},[125,28809,1247],{"class":1151},[125,28811,3553],{"class":131},[125,28813,1665],{"class":1151},[125,28815,148],{"class":131},[125,28817,167],{"class":131},[125,28819,21931],{"class":170},[125,28821,145],{"class":131},[125,28823,21936],{"class":131},[125,28825,1437],{"class":961},[125,28827,1253],{"class":1151},[125,28829,28830],{"class":127,"line":629},[125,28831,3133],{"class":131},[125,28833,28834],{"class":127,"line":643},[125,28835,978],{"emptyLinePlaceholder":977},[125,28837,28838,28840,28842,28844,28846,28848,28850,28852,28854,28856,28858],{"class":127,"line":657},[125,28839,1614],{"class":1125},[125,28841,17064],{"class":965},[125,28843,1290],{"class":131},[125,28845,119],{"class":1293},[125,28847,1247],{"class":1151},[125,28849,3553],{"class":131},[125,28851,2263],{"class":1151},[125,28853,148],{"class":131},[125,28855,21798],{"class":965},[125,28857,1487],{"class":131},[125,28859,1253],{"class":1151},[125,28861,28862],{"class":127,"line":671},[125,28863,285],{"class":131},[125,28865,28866],{"class":127,"line":686},[125,28867,1253],{"class":965},[110,28869,21984],{"id":21983},[115,28871,28872],{"className":21987,"code":21988,"language":21989,"meta":120,"style":120},[122,28873,28874,28878,28898,28918,28922,28934,28942,28948,28952,28968,28990,29004,29018,29044,29048,29056,29060,29068,29086,29102,29118,29126],{"__ignoreMap":120},[125,28875,28876],{"class":127,"line":128},[125,28877,21996],{"class":385},[125,28879,28880,28882,28884,28886,28888,28890,28892,28894,28896],{"class":127,"line":135},[125,28881,2108],{"class":131},[125,28883,20838],{"class":1151},[125,28885,22005],{"class":141},[125,28887,22008],{"class":141},[125,28889,1532],{"class":131},[125,28891,145],{"class":131},[125,28893,20572],{"class":170},[125,28895,145],{"class":131},[125,28897,3937],{"class":131},[125,28899,28900,28902,28904,28906,28908,28910,28912,28914,28916],{"class":127,"line":16},[125,28901,1468],{"class":1125},[125,28903,19705],{"class":1125},[125,28905,1471],{"class":131},[125,28907,12421],{"class":965},[125,28909,1487],{"class":131},[125,28911,1490],{"class":1125},[125,28913,167],{"class":131},[125,28915,19816],{"class":170},[125,28917,279],{"class":131},[125,28919,28920],{"class":127,"line":179},[125,28921,978],{"emptyLinePlaceholder":977},[125,28923,28924,28926,28928,28930,28932],{"class":127,"line":200},[125,28925,1883],{"class":141},[125,28927,22049],{"class":965},[125,28929,1532],{"class":131},[125,28931,22054],{"class":1293},[125,28933,22057],{"class":131},[125,28935,28936,28938,28940],{"class":127,"line":221},[125,28937,22062],{"class":1151},[125,28939,148],{"class":131},[125,28941,22067],{"class":159},[125,28943,28944,28946],{"class":127,"line":242},[125,28945,22072],{"class":131},[125,28947,1955],{"class":965},[125,28949,28950],{"class":127,"line":263},[125,28951,978],{"emptyLinePlaceholder":977},[125,28953,28954,28956,28958,28960,28962,28964,28966],{"class":127,"line":282},[125,28955,1883],{"class":141},[125,28957,22085],{"class":965},[125,28959,1532],{"class":131},[125,28961,22090],{"class":1293},[125,28963,1247],{"class":965},[125,28965,2739],{"class":131},[125,28967,20448],{"class":141},[125,28969,28970,28972,28974,28976,28978,28980,28982,28984,28986,28988],{"class":127,"line":288},[125,28971,22101],{"class":131},[125,28973,22104],{"class":965},[125,28975,1290],{"class":131},[125,28977,22109],{"class":1293},[125,28979,1247],{"class":965},[125,28981,145],{"class":131},[125,28983,22116],{"class":170},[125,28985,145],{"class":131},[125,28987,735],{"class":131},[125,28989,151],{"class":131},[125,28991,28992,28994,28996,28998,29000,29002],{"class":127,"line":302},[125,28993,22127],{"class":1151},[125,28995,148],{"class":131},[125,28997,167],{"class":131},[125,28999,22134],{"class":170},[125,29001,145],{"class":131},[125,29003,176],{"class":131},[125,29005,29006,29008,29010,29012,29014,29016],{"class":127,"line":323},[125,29007,22143],{"class":1151},[125,29009,148],{"class":131},[125,29011,167],{"class":131},[125,29013,41],{"class":170},[125,29015,145],{"class":131},[125,29017,176],{"class":131},[125,29019,29020,29022,29024,29026,29028,29030,29032,29034,29036,29038,29040,29042],{"class":127,"line":29},[125,29021,1830],{"class":131},[125,29023,1349],{"class":965},[125,29025,1290],{"class":131},[125,29027,3511],{"class":1293},[125,29029,1247],{"class":965},[125,29031,22168],{"class":1293},[125,29033,22171],{"class":965},[125,29035,1290],{"class":131},[125,29037,21903],{"class":965},[125,29039,1290],{"class":131},[125,29041,22180],{"class":965},[125,29043,176],{"class":131},[125,29045,29046],{"class":127,"line":362},[125,29047,1253],{"class":965},[125,29049,29050,29052,29054],{"class":127,"line":368},[125,29051,20835],{"class":131},[125,29053,20838],{"class":1151},[125,29055,3937],{"class":131},[125,29057,29058],{"class":127,"line":601},[125,29059,978],{"emptyLinePlaceholder":977},[125,29061,29062,29064,29066],{"class":127,"line":615},[125,29063,2108],{"class":131},[125,29065,22205],{"class":1151},[125,29067,3937],{"class":131},[125,29069,29070,29072,29074,29076,29078,29080,29082,29084],{"class":127,"line":629},[125,29071,22212],{"class":131},[125,29073,20808],{"class":1151},[125,29075,1129],{"class":141},[125,29077,1532],{"class":131},[125,29079,145],{"class":131},[125,29081,22223],{"class":170},[125,29083,145],{"class":131},[125,29085,3937],{"class":131},[125,29087,29088,29090,29092,29094,29096,29098,29100],{"class":127,"line":643},[125,29089,22232],{"class":131},[125,29091,110],{"class":1151},[125,29093,2119],{"class":131},[125,29095,22239],{"class":965},[125,29097,20835],{"class":131},[125,29099,110],{"class":1151},[125,29101,3937],{"class":131},[125,29103,29104,29106,29108,29110,29112,29114,29116],{"class":127,"line":657},[125,29105,22232],{"class":131},[125,29107,102],{"class":1151},[125,29109,2119],{"class":131},[125,29111,22256],{"class":965},[125,29113,20835],{"class":131},[125,29115,102],{"class":1151},[125,29117,3937],{"class":131},[125,29119,29120,29122,29124],{"class":127,"line":671},[125,29121,22267],{"class":131},[125,29123,20808],{"class":1151},[125,29125,3937],{"class":131},[125,29127,29128,29130,29132],{"class":127,"line":686},[125,29129,20835],{"class":131},[125,29131,22205],{"class":1151},[125,29133,3937],{"class":131},[98,29135,22283],{"id":22282},[110,29137,22287],{"id":22286},[115,29139,29140],{"className":1112,"code":22290,"language":184,"meta":120,"style":120},[122,29141,29142,29146,29162,29166,29170],{"__ignoreMap":120},[125,29143,29144],{"class":127,"line":128},[125,29145,22297],{"class":385},[125,29147,29148,29150,29152,29154,29156,29158,29160],{"class":127,"line":135},[125,29149,1883],{"class":141},[125,29151,22304],{"class":965},[125,29153,1532],{"class":131},[125,29155,18147],{"class":965},[125,29157,1290],{"class":131},[125,29159,22313],{"class":965},[125,29161,22316],{"class":385},[125,29163,29164],{"class":127,"line":16},[125,29165,978],{"emptyLinePlaceholder":977},[125,29167,29168],{"class":127,"line":179},[125,29169,22325],{"class":385},[125,29171,29172,29174,29176,29178,29180,29182,29184,29186,29188,29190],{"class":127,"line":200},[125,29173,1883],{"class":141},[125,29175,22304],{"class":965},[125,29177,1532],{"class":131},[125,29179,18147],{"class":965},[125,29181,1290],{"class":131},[125,29183,22313],{"class":965},[125,29185,1894],{"class":1125},[125,29187,1194],{"class":159},[125,29189,11660],{"class":131},[125,29191,2845],{"class":131},[110,29193,22351],{"id":22350},[115,29195,29196],{"className":1112,"code":22354,"language":184,"meta":120,"style":120},[122,29197,29198,29202,29210,29218,29226,29230,29234,29252,29268,29272,29276,29280,29298,29320,29342,29348,29352,29370,29392,29398],{"__ignoreMap":120},[125,29199,29200],{"class":127,"line":128},[125,29201,22361],{"class":385},[125,29203,29204,29206,29208],{"class":127,"line":135},[125,29205,3323],{"class":141},[125,29207,2032],{"class":159},[125,29209,151],{"class":131},[125,29211,29212,29214,29216],{"class":127,"line":16},[125,29213,2492],{"class":1151},[125,29215,148],{"class":131},[125,29217,2450],{"class":159},[125,29219,29220,29222,29224],{"class":127,"line":179},[125,29221,2445],{"class":1151},[125,29223,148],{"class":131},[125,29225,2450],{"class":159},[125,29227,29228],{"class":127,"line":200},[125,29229,371],{"class":131},[125,29231,29232],{"class":127,"line":221},[125,29233,978],{"emptyLinePlaceholder":977},[125,29235,29236,29238,29240,29242,29244,29246,29248,29250],{"class":127,"line":242},[125,29237,4480],{"class":141},[125,29239,2856],{"class":1293},[125,29241,1247],{"class":131},[125,29243,2182],{"class":1188},[125,29245,148],{"class":131},[125,29247,1897],{"class":159},[125,29249,1349],{"class":131},[125,29251,151],{"class":131},[125,29253,29254,29256,29258,29260,29262,29264,29266],{"class":127,"line":263},[125,29255,5018],{"class":141},[125,29257,2929],{"class":965},[125,29259,1209],{"class":131},[125,29261,2263],{"class":965},[125,29263,1900],{"class":1125},[125,29265,2032],{"class":159},[125,29267,22428],{"class":385},[125,29269,29270],{"class":127,"line":282},[125,29271,371],{"class":131},[125,29273,29274],{"class":127,"line":288},[125,29275,978],{"emptyLinePlaceholder":977},[125,29277,29278],{"class":127,"line":302},[125,29279,22441],{"class":385},[125,29281,29282,29284,29286,29288,29290,29292,29294,29296],{"class":127,"line":323},[125,29283,1883],{"class":141},[125,29285,22448],{"class":965},[125,29287,1532],{"class":131},[125,29289,2650],{"class":965},[125,29291,1290],{"class":131},[125,29293,2719],{"class":1293},[125,29295,1247],{"class":965},[125,29297,132],{"class":131},[125,29299,29300,29302,29304,29306,29308,29310,29312,29314,29316,29318],{"class":127,"line":29},[125,29301,2492],{"class":1151},[125,29303,148],{"class":131},[125,29305,2650],{"class":965},[125,29307,1290],{"class":131},[125,29309,2736],{"class":1293},[125,29311,2739],{"class":965},[125,29313,1290],{"class":131},[125,29315,21022],{"class":1293},[125,29317,2739],{"class":965},[125,29319,176],{"class":131},[125,29321,29322,29324,29326,29328,29330,29332,29334,29336,29338,29340],{"class":127,"line":362},[125,29323,2445],{"class":1151},[125,29325,148],{"class":131},[125,29327,2650],{"class":965},[125,29329,1290],{"class":131},[125,29331,2736],{"class":1293},[125,29333,2739],{"class":965},[125,29335,1290],{"class":131},[125,29337,2744],{"class":1293},[125,29339,2739],{"class":965},[125,29341,176],{"class":131},[125,29343,29344,29346],{"class":127,"line":368},[125,29345,1426],{"class":131},[125,29347,1253],{"class":965},[125,29349,29350],{"class":127,"line":601},[125,29351,978],{"emptyLinePlaceholder":977},[125,29353,29354,29356,29358,29360,29362,29364,29366,29368],{"class":127,"line":615},[125,29355,4480],{"class":141},[125,29357,2856],{"class":1293},[125,29359,1247],{"class":131},[125,29361,2182],{"class":1188},[125,29363,148],{"class":131},[125,29365,1897],{"class":159},[125,29367,1349],{"class":131},[125,29369,151],{"class":131},[125,29371,29372,29374,29376,29378,29380,29382,29384,29386,29388,29390],{"class":127,"line":629},[125,29373,5018],{"class":141},[125,29375,2929],{"class":965},[125,29377,1209],{"class":131},[125,29379,22543],{"class":965},[125,29381,1290],{"class":131},[125,29383,2911],{"class":1293},[125,29385,1247],{"class":1151},[125,29387,2182],{"class":965},[125,29389,1584],{"class":1151},[125,29391,22556],{"class":385},[125,29393,29394,29396],{"class":127,"line":643},[125,29395,4518],{"class":1125},[125,29397,22563],{"class":965},[125,29399,29400],{"class":127,"line":657},[125,29401,371],{"class":131},[110,29403,22571],{"id":22570},[102,29405,29406,22577],{},[4343,29407,22576],{},[115,29409,29410],{"className":22580,"code":22581,"language":22582,"meta":120,"style":120},[122,29411,29412,29416,29420,29434,29442,29456,29468,29472],{"__ignoreMap":120},[125,29413,29414],{"class":127,"line":128},[125,29415,22589],{"class":385},[125,29417,29418],{"class":127,"line":135},[125,29419,132],{"class":131},[125,29421,29422,29424,29426,29428,29430,29432],{"class":127,"line":16},[125,29423,22598],{"class":159},[125,29425,148],{"class":1293},[125,29427,167],{"class":131},[125,29429,22605],{"class":170},[125,29431,145],{"class":131},[125,29433,176],{"class":170},[125,29435,29436,29438,29440],{"class":127,"line":179},[125,29437,22614],{"class":159},[125,29439,148],{"class":1293},[125,29441,151],{"class":170},[125,29443,29444,29446,29448,29450,29452,29454],{"class":127,"line":200},[125,29445,22623],{"class":159},[125,29447,148],{"class":1293},[125,29449,167],{"class":131},[125,29451,22630],{"class":170},[125,29453,145],{"class":131},[125,29455,176],{"class":170},[125,29457,29458,29460,29462,29464,29466],{"class":127,"line":221},[125,29459,22639],{"class":159},[125,29461,148],{"class":1293},[125,29463,167],{"class":131},[125,29465,22646],{"class":170},[125,29467,279],{"class":131},[125,29469,29470],{"class":127,"line":242},[125,29471,365],{"class":131},[125,29473,29474],{"class":127,"line":263},[125,29475,371],{"class":965},[98,29477,22660],{"id":22659},[110,29479,22664],{"id":22663},[4311,29481,29482,29486,29490,29494],{},[4314,29483,29484,22672],{},[4343,29485,22671],{},[4314,29487,29488,22678],{},[4343,29489,22677],{},[4314,29491,29492,22684],{},[4343,29493,22683],{},[4314,29495,29496,22690],{},[4343,29497,22689],{},[110,29499,22694],{"id":22693},[4311,29501,29502,29506,29510],{},[4314,29503,29504,22702],{},[4343,29505,22701],{},[4314,29507,29508,22708],{},[4343,29509,22707],{},[4314,29511,29512,22714],{},[4343,29513,22713],{},[110,29515,22718],{"id":22717},[4311,29517,29518,29522,29526],{},[4314,29519,29520,22726],{},[4343,29521,22725],{},[4314,29523,29524,22732],{},[4343,29525,22731],{},[4314,29527,29528,22738],{},[4343,29529,22737],{},[98,29531,22742],{"id":22741},[115,29533,29534],{"className":1112,"code":22745,"language":184,"meta":120,"style":120},[122,29535,29536,29540,29558,29576,29580,29600,29632,29638,29642,29662,29698],{"__ignoreMap":120},[125,29537,29538],{"class":127,"line":128},[125,29539,22752],{"class":385},[125,29541,29542,29544,29546,29548,29550,29552,29554,29556],{"class":127,"line":135},[125,29543,1468],{"class":1125},[125,29545,1471],{"class":131},[125,29547,22761],{"class":965},[125,29549,1487],{"class":131},[125,29551,1490],{"class":1125},[125,29553,167],{"class":131},[125,29555,22770],{"class":170},[125,29557,279],{"class":131},[125,29559,29560,29562,29564,29566,29568,29570,29572,29574],{"class":127,"line":16},[125,29561,1468],{"class":1125},[125,29563,1471],{"class":131},[125,29565,20585],{"class":965},[125,29567,1487],{"class":131},[125,29569,1490],{"class":1125},[125,29571,167],{"class":131},[125,29573,20595],{"class":170},[125,29575,279],{"class":131},[125,29577,29578],{"class":127,"line":179},[125,29579,978],{"emptyLinePlaceholder":977},[125,29581,29582,29584,29586,29588,29590,29592,29594,29596,29598],{"class":127,"line":200},[125,29583,921],{"class":1293},[125,29585,1247],{"class":965},[125,29587,145],{"class":131},[125,29589,22805],{"class":170},[125,29591,145],{"class":131},[125,29593,735],{"class":131},[125,29595,3895],{"class":131},[125,29597,3898],{"class":141},[125,29599,151],{"class":131},[125,29601,29602,29604,29606,29608,29610,29612,29614,29616,29618,29620,29622,29624,29626,29628,29630],{"class":127,"line":221},[125,29603,22820],{"class":1293},[125,29605,1247],{"class":1151},[125,29607,22825],{"class":965},[125,29609,1290],{"class":131},[125,29611,20678],{"class":1293},[125,29613,22832],{"class":1151},[125,29615,1290],{"class":131},[125,29617,22837],{"class":965},[125,29619,1290],{"class":131},[125,29621,22842],{"class":1293},[125,29623,2108],{"class":131},[125,29625,2111],{"class":159},[125,29627,10184],{"class":1151},[125,29629,2119],{"class":131},[125,29631,1955],{"class":1151},[125,29633,29634,29636],{"class":127,"line":242},[125,29635,1426],{"class":131},[125,29637,1253],{"class":965},[125,29639,29640],{"class":127,"line":263},[125,29641,978],{"emptyLinePlaceholder":977},[125,29643,29644,29646,29648,29650,29652,29654,29656,29658,29660],{"class":127,"line":282},[125,29645,921],{"class":1293},[125,29647,1247],{"class":965},[125,29649,145],{"class":131},[125,29651,22873],{"class":170},[125,29653,145],{"class":131},[125,29655,735],{"class":131},[125,29657,3895],{"class":131},[125,29659,3898],{"class":141},[125,29661,151],{"class":131},[125,29663,29664,29666,29668,29670,29672,29674,29676,29678,29680,29682,29684,29686,29688,29690,29692,29694,29696],{"class":127,"line":288},[125,29665,22820],{"class":1293},[125,29667,1247],{"class":1151},[125,29669,22825],{"class":965},[125,29671,1290],{"class":131},[125,29673,2218],{"class":965},[125,29675,1349],{"class":1151},[125,29677,1290],{"class":131},[125,29679,22902],{"class":1293},[125,29681,1247],{"class":1151},[125,29683,3074],{"class":961},[125,29685,1349],{"class":1151},[125,29687,1290],{"class":131},[125,29689,22842],{"class":1293},[125,29691,2108],{"class":131},[125,29693,22917],{"class":159},[125,29695,2119],{"class":131},[125,29697,1955],{"class":1151},[125,29699,29700,29702],{"class":127,"line":302},[125,29701,1426],{"class":131},[125,29703,1253],{"class":965},[98,29705,22931],{"id":22930},[102,29707,22934],{},[4348,29709,29710,29714,29720,29726],{},[4314,29711,29712,22942],{},[4343,29713,22941],{},[4314,29715,29716,22948,29718,22952],{},[4343,29717,22947],{},[122,29719,22951],{},[4314,29721,29722,22948,29724,22961],{},[4343,29723,22957],{},[122,29725,22960],{},[4314,29727,29728,22967],{},[4343,29729,22966],{},[98,29731,4303],{"id":4302},[102,29733,22972],{},[102,29735,22975],{},[4333,29737],{},[102,29739,29740,22983],{},[4343,29741,22982],{},[4384,29743,22986],{},{"title":120,"searchDepth":135,"depth":135,"links":29745},[29746,29747,29748,29752,29758,29763,29768,29773,29778,29779,29780],{"id":19282,"depth":135,"text":19277},{"id":19288,"depth":135,"text":19289},{"id":19323,"depth":135,"text":19324,"children":29749},[29750,29751],{"id":19327,"depth":16,"text":19328},{"id":19361,"depth":16,"text":19362},{"id":19391,"depth":135,"text":19392,"children":29753},[29754,29755,29756,29757],{"id":19395,"depth":16,"text":19396},{"id":19742,"depth":16,"text":19743},{"id":20101,"depth":16,"text":20102},{"id":20547,"depth":16,"text":20548},{"id":20843,"depth":135,"text":20844,"children":29759},[29760,29761,29762],{"id":20847,"depth":16,"text":20848},{"id":21086,"depth":16,"text":21087},{"id":21294,"depth":16,"text":21295},{"id":21432,"depth":135,"text":21433,"children":29764},[29765,29766,29767],{"id":21436,"depth":16,"text":21437},{"id":21658,"depth":16,"text":21659},{"id":21983,"depth":16,"text":21984},{"id":22282,"depth":135,"text":22283,"children":29769},[29770,29771,29772],{"id":22286,"depth":16,"text":22287},{"id":22350,"depth":16,"text":22351},{"id":22570,"depth":16,"text":22571},{"id":22659,"depth":135,"text":22660,"children":29774},[29775,29776,29777],{"id":22663,"depth":16,"text":22664},{"id":22693,"depth":16,"text":22694},{"id":22717,"depth":16,"text":22718},{"id":22741,"depth":135,"text":22742},{"id":22930,"depth":135,"text":22931},{"id":4302,"depth":135,"text":4303},{"readingTime":23027},{"title":19277,"description":23025},{"src":23032,"mime":5167,"alt":23033,"width":5169,"height":5170},[4432,5174,23036,22701,23037],["Reactive",29786],{"$scolor-mode":29787,"$snuxt-seo-utils:routeRules":29789,"$stoasts":29790,"$ssite-config":29791},{"preference":29788,"value":29788,"unknown":977,"forced":19262},"system",{"head":-1,"seoMeta":-1},[],{"_priority":29792,"defaultLocale":29795,"description":29796,"env":1984,"indexable":977,"name":29797,"url":29798},{"env":29793,"indexable":29794,"url":29794,"name":29794,"description":29794,"defaultLocale":29794},-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",29801],{"blog-post-/blog/6-typescript-nodejs-production-guide":-1,"profile-data":-1,"series-TypeScript Mastery":-1,"related-posts-/blog/6-typescript-nodejs-production-guide":-1}]