[{"data":1,"prerenderedAt":1174},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Ftypescript-nuxt-4-getting-started-guide":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":313,"author":314,"authorType":315,"body":316,"category":325,"date":1157,"description":1158,"extension":1159,"image":1160,"lang":1161,"meta":1162,"navigation":22,"ogImage":1163,"path":1164,"readTime":1165,"seo":1166,"stem":1167,"tags":1168,"translations":1169,"updated":1168,"__hash__":1173},"blog\u002Fblog\u002Ftypescript-nuxt-4-getting-started-guide.md","Getting Started with TypeScript in Nuxt 4: A Complete Guide for SaaS","Adilson Noveli","Person",{"type":317,"value":318,"toc":1151},"minimark",[319,327,334,337,342,345,378,380,384,387,699,971,1121,1123,1127,1130,1132,1136,1139,1147],[320,321,322,326],"p",{},[323,324,325],"strong",{},"TypeScript"," has become an indispensable requirement in modern software development, especially when building critical SaaS applications where runtime errors cost customers and reputation.",[320,328,329,330,333],{},"In the ",[323,331,332],{},"Nuxfire"," ecosystem, TypeScript is not just a linter or a superficial type check: it is the fundamental foundation that connects the PostgreSQL database to the Vue 3 client, through the tRPC API layer and the SST v4 infrastructure.",[335,336],"hr",{},[338,339,341],"h2",{"id":340},"why-is-strict-typing-critical-in-saas","Why Is Strict Typing Critical in SaaS?",[320,343,344],{},"Building scalable software requires predictability. When multiple developers (or AI assistants like Cursor and Claude Code) collaborate on the same code, strict typing guarantees:",[346,347,348,355,366,372],"ol",{},[349,350,351,354],"li",{},[323,352,353],{},"Fearless Refactoring",": Rename database fields or change function signatures and the compiler points to exactly which screens need adjusting.",[349,356,357,360,361,365],{},[323,358,359],{},"Elimination of Entire Classes of Bugs",": ",[362,363,364],"code",{},"undefined is not a function"," and accesses to nonexistent properties are caught before the commit.",[349,367,368,371],{},[323,369,370],{},"Smart IDE Autocompletion",": Multiplied productivity with instant suggestions for parameters, return values and utility types.",[349,373,374,377],{},[323,375,376],{},"Perfect Alignment with AI Tools",": LLMs produce substantially better code when guided by strict interface definitions.",[335,379],{},[338,381,383],{"id":382},"the-end-to-end-typing-flow-in-nuxfire","The End-to-End Typing Flow in Nuxfire",[320,385,386],{},"Nuxfire's architecture implements a complete type inference pipeline across 3 layers:",[388,389,394],"pre",{"className":390,"code":391,"language":392,"meta":393,"style":393},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u002F\u002F 1. Database Schema (Drizzle ORM)\nexport const users = pgTable(\"users\", {\n  id: text(\"id\").primaryKey(),\n  email: text(\"email\").notNull().unique(),\n  role: text(\"role\", { enum: [\"owner\", \"admin\", \"member\"] }).notNull(),\n  createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n});\n\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\n","typescript","",[362,395,396,405,449,486,523,597,634,644,650,676],{"__ignoreMap":393},[397,398,401],"span",{"class":399,"line":400},"line",1,[397,402,404],{"class":403},"ss7Ak","\u002F\u002F 1. Database Schema (Drizzle ORM)\n",[397,406,408,412,416,420,424,428,432,436,440,442,446],{"class":399,"line":407},2,[397,409,411],{"class":410},"sRxSC","export",[397,413,415],{"class":414},"srJo8"," const",[397,417,419],{"class":418},"s91G_"," users",[397,421,423],{"class":422},"sGXK2"," =",[397,425,427],{"class":426},"sD0ED"," pgTable",[397,429,431],{"class":430},"ss--_","(",[397,433,435],{"class":434},"siCPE","\"",[397,437,439],{"class":438},"sLACW","users",[397,441,435],{"class":434},[397,443,445],{"class":444},"swvn1",",",[397,447,448],{"class":444}," {\n",[397,450,452,456,459,462,464,466,469,471,474,477,480,483],{"class":399,"line":451},3,[397,453,455],{"class":454},"squCx","  id",[397,457,458],{"class":444},":",[397,460,461],{"class":426}," text",[397,463,431],{"class":430},[397,465,435],{"class":434},[397,467,468],{"class":438},"id",[397,470,435],{"class":434},[397,472,473],{"class":430},")",[397,475,476],{"class":444},".",[397,478,479],{"class":426},"primaryKey",[397,481,482],{"class":430},"()",[397,484,485],{"class":444},",\n",[397,487,489,492,494,496,498,500,503,505,507,509,512,514,516,519,521],{"class":399,"line":488},4,[397,490,491],{"class":454},"  email",[397,493,458],{"class":444},[397,495,461],{"class":426},[397,497,431],{"class":430},[397,499,435],{"class":434},[397,501,502],{"class":438},"email",[397,504,435],{"class":434},[397,506,473],{"class":430},[397,508,476],{"class":444},[397,510,511],{"class":426},"notNull",[397,513,482],{"class":430},[397,515,476],{"class":444},[397,517,518],{"class":426},"unique",[397,520,482],{"class":430},[397,522,485],{"class":444},[397,524,526,529,531,533,535,537,540,542,544,547,550,552,555,557,560,562,564,567,570,572,574,576,579,581,584,587,589,591,593,595],{"class":399,"line":525},5,[397,527,528],{"class":454},"  role",[397,530,458],{"class":444},[397,532,461],{"class":426},[397,534,431],{"class":430},[397,536,435],{"class":434},[397,538,539],{"class":438},"role",[397,541,435],{"class":434},[397,543,445],{"class":444},[397,545,546],{"class":444}," {",[397,548,549],{"class":454}," enum",[397,551,458],{"class":444},[397,553,554],{"class":430}," [",[397,556,435],{"class":434},[397,558,559],{"class":438},"owner",[397,561,435],{"class":434},[397,563,445],{"class":444},[397,565,566],{"class":434}," \"",[397,568,569],{"class":438},"admin",[397,571,435],{"class":434},[397,573,445],{"class":444},[397,575,566],{"class":434},[397,577,578],{"class":438},"member",[397,580,435],{"class":434},[397,582,583],{"class":430},"] ",[397,585,586],{"class":444},"}",[397,588,473],{"class":430},[397,590,476],{"class":444},[397,592,511],{"class":426},[397,594,482],{"class":430},[397,596,485],{"class":444},[397,598,600,603,605,608,610,612,615,617,619,621,624,626,628,630,632],{"class":399,"line":599},6,[397,601,602],{"class":454},"  createdAt",[397,604,458],{"class":444},[397,606,607],{"class":426}," timestamp",[397,609,431],{"class":430},[397,611,435],{"class":434},[397,613,614],{"class":438},"created_at",[397,616,435],{"class":434},[397,618,473],{"class":430},[397,620,476],{"class":444},[397,622,623],{"class":426},"defaultNow",[397,625,482],{"class":430},[397,627,476],{"class":444},[397,629,511],{"class":426},[397,631,482],{"class":430},[397,633,485],{"class":444},[397,635,637,639,641],{"class":399,"line":636},7,[397,638,586],{"class":444},[397,640,473],{"class":430},[397,642,643],{"class":444},";\n",[397,645,647],{"class":399,"line":646},8,[397,648,649],{"emptyLinePlaceholder":22},"\n",[397,651,653,655,658,662,664,667,669,671,674],{"class":399,"line":652},9,[397,654,411],{"class":410},[397,656,657],{"class":414}," type",[397,659,661],{"class":660},"sKvfc"," User",[397,663,423],{"class":422},[397,665,666],{"class":422}," typeof",[397,668,419],{"class":430},[397,670,476],{"class":444},[397,672,673],{"class":430},"$inferSelect",[397,675,643],{"class":444},[397,677,679,681,683,686,688,690,692,694,697],{"class":399,"line":678},10,[397,680,411],{"class":410},[397,682,657],{"class":414},[397,684,685],{"class":660}," NewUser",[397,687,423],{"class":422},[397,689,666],{"class":422},[397,691,419],{"class":430},[397,693,476],{"class":444},[397,695,696],{"class":430},"$inferInsert",[397,698,643],{"class":444},[388,700,702],{"className":390,"code":701,"language":392,"meta":393,"style":393},"\u002F\u002F 2. Typed API Procedure (tRPC v11)\nexport const usersRouter = router({\n  getProfile: protectedProcedure\n    .input(z.object({ userId: z.string() }))\n    .query(async ({ ctx, input }) => {\n      const user = await ctx.db.query.users.findFirst({\n        where: eq(users.id, input.userId),\n      });\n      if (!user) throw new TRPCError({ code: \"NOT_FOUND\" });\n      return user; \u002F\u002F Type inferred automatically!\n    }),\n});\n",[362,703,704,709,728,738,780,813,850,881,890,939,952,962],{"__ignoreMap":393},[397,705,706],{"class":399,"line":400},[397,707,708],{"class":403},"\u002F\u002F 2. Typed API Procedure (tRPC v11)\n",[397,710,711,713,715,718,720,723,725],{"class":399,"line":407},[397,712,411],{"class":410},[397,714,415],{"class":414},[397,716,717],{"class":418}," usersRouter",[397,719,423],{"class":422},[397,721,722],{"class":426}," router",[397,724,431],{"class":430},[397,726,727],{"class":444},"{\n",[397,729,730,733,735],{"class":399,"line":451},[397,731,732],{"class":454},"  getProfile",[397,734,458],{"class":444},[397,736,737],{"class":430}," protectedProcedure\n",[397,739,740,743,746,749,751,754,756,759,762,764,767,769,772,775,777],{"class":399,"line":488},[397,741,742],{"class":444},"    .",[397,744,745],{"class":426},"input",[397,747,748],{"class":430},"(z",[397,750,476],{"class":444},[397,752,753],{"class":426},"object",[397,755,431],{"class":430},[397,757,758],{"class":444},"{",[397,760,761],{"class":454}," userId",[397,763,458],{"class":444},[397,765,766],{"class":430}," z",[397,768,476],{"class":444},[397,770,771],{"class":426},"string",[397,773,774],{"class":430},"() ",[397,776,586],{"class":444},[397,778,779],{"class":430},"))\n",[397,781,782,784,787,789,793,796,800,802,805,808,811],{"class":399,"line":525},[397,783,742],{"class":444},[397,785,786],{"class":426},"query",[397,788,431],{"class":430},[397,790,792],{"class":791},"sTNss","async",[397,794,795],{"class":444}," ({",[397,797,799],{"class":798},"sQgqH"," ctx",[397,801,445],{"class":444},[397,803,804],{"class":798}," input",[397,806,807],{"class":444}," })",[397,809,810],{"class":414}," =>",[397,812,448],{"class":444},[397,814,815,818,821,823,826,828,830,833,835,837,839,841,843,846,848],{"class":399,"line":599},[397,816,817],{"class":414},"      const",[397,819,820],{"class":418}," user",[397,822,423],{"class":422},[397,824,825],{"class":410}," await",[397,827,799],{"class":430},[397,829,476],{"class":444},[397,831,832],{"class":430},"db",[397,834,476],{"class":444},[397,836,786],{"class":430},[397,838,476],{"class":444},[397,840,439],{"class":430},[397,842,476],{"class":444},[397,844,845],{"class":426},"findFirst",[397,847,431],{"class":454},[397,849,727],{"class":444},[397,851,852,855,857,860,862,864,866,868,870,872,874,877,879],{"class":399,"line":636},[397,853,854],{"class":454},"        where",[397,856,458],{"class":444},[397,858,859],{"class":426}," eq",[397,861,431],{"class":454},[397,863,439],{"class":430},[397,865,476],{"class":444},[397,867,468],{"class":430},[397,869,445],{"class":444},[397,871,804],{"class":430},[397,873,476],{"class":444},[397,875,876],{"class":430},"userId",[397,878,473],{"class":454},[397,880,485],{"class":444},[397,882,883,886,888],{"class":399,"line":646},[397,884,885],{"class":444},"      }",[397,887,473],{"class":454},[397,889,643],{"class":444},[397,891,892,895,898,901,904,907,910,913,916,918,920,923,925,927,930,932,935,937],{"class":399,"line":652},[397,893,894],{"class":410},"      if",[397,896,897],{"class":454}," (",[397,899,900],{"class":422},"!",[397,902,903],{"class":430},"user",[397,905,906],{"class":454},") ",[397,908,909],{"class":410},"throw",[397,911,912],{"class":422}," new",[397,914,915],{"class":426}," TRPCError",[397,917,431],{"class":454},[397,919,758],{"class":444},[397,921,922],{"class":454}," code",[397,924,458],{"class":444},[397,926,566],{"class":434},[397,928,929],{"class":438},"NOT_FOUND",[397,931,435],{"class":434},[397,933,934],{"class":444}," }",[397,936,473],{"class":454},[397,938,643],{"class":444},[397,940,941,944,946,949],{"class":399,"line":678},[397,942,943],{"class":410},"      return",[397,945,820],{"class":430},[397,947,948],{"class":444},";",[397,950,951],{"class":403}," \u002F\u002F Type inferred automatically!\n",[397,953,955,958,960],{"class":399,"line":954},11,[397,956,957],{"class":444},"    }",[397,959,473],{"class":430},[397,961,485],{"class":444},[397,963,965,967,969],{"class":399,"line":964},12,[397,966,586],{"class":444},[397,968,473],{"class":430},[397,970,643],{"class":444},[388,972,976],{"className":973,"code":974,"language":975,"meta":393,"style":393},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u003C!-- 3. Consumption in the Vue \u002F Nuxt Frontend with Zero Code Generation -->\n\u003Cscript setup lang=\"ts\">\nconst { $trpc } = useNuxtApp();\nconst { data: profile, status } = await $trpc.users.getProfile.useQuery({\n  userId: \"usr_123\",\n});\n\n\u002F\u002F profile.value.email has full inference and autocompletion!\n\u003C\u002Fscript>\n","vue",[362,977,978,983,1012,1033,1079,1095,1103,1107,1112],{"__ignoreMap":393},[397,979,980],{"class":399,"line":400},[397,981,982],{"class":403},"\u003C!-- 3. Consumption in the Vue \u002F Nuxt Frontend with Zero Code Generation -->\n",[397,984,985,988,992,996,999,1002,1004,1007,1009],{"class":399,"line":407},[397,986,987],{"class":444},"\u003C",[397,989,991],{"class":990},"sHsBP","script",[397,993,995],{"class":994},"s_lYk"," setup",[397,997,998],{"class":994}," lang",[397,1000,1001],{"class":444},"=",[397,1003,435],{"class":434},[397,1005,1006],{"class":438},"ts",[397,1008,435],{"class":434},[397,1010,1011],{"class":444},">\n",[397,1013,1014,1017,1019,1022,1024,1026,1029,1031],{"class":399,"line":451},[397,1015,1016],{"class":414},"const",[397,1018,546],{"class":444},[397,1020,1021],{"class":418}," $trpc",[397,1023,934],{"class":444},[397,1025,423],{"class":422},[397,1027,1028],{"class":426}," useNuxtApp",[397,1030,482],{"class":430},[397,1032,643],{"class":444},[397,1034,1035,1037,1039,1043,1045,1048,1050,1053,1055,1057,1059,1061,1063,1065,1067,1070,1072,1075,1077],{"class":399,"line":488},[397,1036,1016],{"class":414},[397,1038,546],{"class":444},[397,1040,1042],{"class":1041},"sIDdj"," data",[397,1044,458],{"class":444},[397,1046,1047],{"class":418}," profile",[397,1049,445],{"class":444},[397,1051,1052],{"class":418}," status",[397,1054,934],{"class":444},[397,1056,423],{"class":422},[397,1058,825],{"class":410},[397,1060,1021],{"class":430},[397,1062,476],{"class":444},[397,1064,439],{"class":430},[397,1066,476],{"class":444},[397,1068,1069],{"class":430},"getProfile",[397,1071,476],{"class":444},[397,1073,1074],{"class":426},"useQuery",[397,1076,431],{"class":430},[397,1078,727],{"class":444},[397,1080,1081,1084,1086,1088,1091,1093],{"class":399,"line":525},[397,1082,1083],{"class":454},"  userId",[397,1085,458],{"class":444},[397,1087,566],{"class":434},[397,1089,1090],{"class":438},"usr_123",[397,1092,435],{"class":434},[397,1094,485],{"class":444},[397,1096,1097,1099,1101],{"class":399,"line":599},[397,1098,586],{"class":444},[397,1100,473],{"class":430},[397,1102,643],{"class":444},[397,1104,1105],{"class":399,"line":636},[397,1106,649],{"emptyLinePlaceholder":22},[397,1108,1109],{"class":399,"line":646},[397,1110,1111],{"class":403},"\u002F\u002F profile.value.email has full inference and autocompletion!\n",[397,1113,1114,1117,1119],{"class":399,"line":652},[397,1115,1116],{"class":444},"\u003C\u002F",[397,1118,991],{"class":990},[397,1120,1011],{"class":444},[335,1122],{},[338,1124,1126],{"id":1125},"practical-benefits-for-vibe-coding-and-ai","Practical Benefits for Vibe Coding and AI",[320,1128,1129],{},"When developing with Cursor, GitHub Copilot or Claude Code, type definitions work as the most powerful \"context prompt\" possible. The AI agent does not need to guess the shape of HTTP responses or invent table names: the TypeScript types guide the generation of the right code on the first attempt.",[335,1131],{},[338,1133,1135],{"id":1134},"conclusion","Conclusion",[320,1137,1138],{},"Adopting TypeScript from day zero in your SaaS saves weeks of debugging and makes sustainable growth of the codebase possible.",[320,1140,1141,1142,1146],{},"If you want to skip the manual setup of TypeScript, tRPC, Drizzle and Nuxt Layers and start directly with a production-ready, enterprise-grade architecture, get to know ",[1143,1144,332],"a",{"href":1145},"\u002F#pricing"," and get immediate access to the complete source code.",[1148,1149,1150],"style",{},"html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}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 .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sQgqH, html code.shiki .sQgqH{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sHsBP, html code.shiki .sHsBP{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#F92672}html pre.shiki code .s_lYk, html code.shiki .s_lYk{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sIDdj, html code.shiki .sIDdj{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2}",{"title":393,"searchDepth":407,"depth":407,"links":1152},[1153,1154,1155,1156],{"id":340,"depth":407,"text":341},{"id":382,"depth":407,"text":383},{"id":1125,"depth":407,"text":1126},{"id":1134,"depth":407,"text":1135},"2026-09-15","Learn TypeScript best practices with end-to-end strict typing, tRPC and Drizzle ORM in Nuxt 4 to speed up the development of your SaaS.","md","\u002Fimages\u002Fblog\u002Ftypescript-end-to-end-typesafety-en.svg","en",{},"\u002Fimages\u002Fblog\u002Ftypescript-end-to-end-typesafety-en.png","\u002Fblog\u002Ftypescript-nuxt-4-getting-started-guide","5 min",{"title":313,"description":1158},"blog\u002Ftypescript-nuxt-4-getting-started-guide",null,{"en":1170,"pt-br":1171,"es":1172},"typescript-nuxt-4-getting-started-guide","getting-started-with-typescript","primeros-pasos-typescript-nuxt-4","X5aDikjV9vQDvRidRVuh40le9Jd5y_UeaE6Is6FbCX4",1790707503477]