[{"data":1,"prerenderedAt":3572},["ShallowReactive",2],{"navigation_docs":3,"landing":127},[4,19,53,71,95],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":18},"Introduction","i-lucide-rocket","\u002Fintroduction\u002Fabout-ts-runtypes","\u002Fintroduction","1.introduction",[11,14],{"title":12,"path":7,"stem":13},"About RunTypes","1.introduction\u002F1.about-ts-runtypes",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fintroduction\u002Fquick-start","1.introduction\u002F2.quick-start",false,{"title":20,"icon":21,"redirect":22,"path":23,"stem":24,"children":25,"page":18},"Guide","i-lucide-book-open","\u002Fguide\u002Ftypes-vs-schemas","\u002Fguide","2.guide",[26,29,33,37,41,45,49],{"title":27,"path":22,"stem":28},"Types vs Schemas","2.guide\u002F1.types-vs-schemas",{"title":30,"path":31,"stem":32},"Type Formats","\u002Fguide\u002Ftype-formats","2.guide\u002F2.type-formats",{"title":34,"path":35,"stem":36},"Serialization","\u002Fguide\u002Fserialization","2.guide\u002F3.serialization",{"title":38,"path":39,"stem":40},"Mock Data","\u002Fguide\u002Fmocking","2.guide\u002F4.mocking",{"title":42,"path":43,"stem":44},"Validation","\u002Fguide\u002Fvalidation","2.guide\u002F5.validation",{"title":46,"path":47,"stem":48},"Reflection","\u002Fguide\u002Fmarkers-and-reflection","2.guide\u002F6.markers-and-reflection",{"title":50,"path":51,"stem":52},"Pure Functions","\u002Fguide\u002Fpure-functions","2.guide\u002F7.pure-functions",{"title":54,"icon":55,"redirect":56,"path":57,"stem":58,"children":59,"page":18},"AI Integration","i-lucide-sparkles","\u002Fai-integration\u002Fworkflow-and-commands","\u002Fai-integration","3.ai-integration",[60,63,67],{"title":61,"path":56,"stem":62},"AI Workflow","3.ai-integration\u002F1.workflow-and-commands",{"title":64,"path":65,"stem":66},"FriendlyType","\u002Fai-integration\u002Ffriendly-type","3.ai-integration\u002F2.friendly-type",{"title":68,"path":69,"stem":70},"MockData","\u002Fai-integration\u002Fmock-data","3.ai-integration\u002F3.mock-data",{"title":72,"icon":73,"redirect":74,"path":75,"stem":76,"children":77,"page":18},"Test Suites","i-lucide-terminal","\u002Fsuites\u002Fvalidation","\u002Fsuites","6.suites",[78,80,83,87,91],{"title":42,"path":74,"stem":79},"6.suites\u002F1.validation",{"title":34,"path":81,"stem":82},"\u002Fsuites\u002Fserialization","6.suites\u002F2.serialization",{"title":84,"path":85,"stem":86},"Formats Validation","\u002Fsuites\u002Fformat-validation","6.suites\u002F3.format-validation",{"title":88,"path":89,"stem":90},"Formats Serialization","\u002Fsuites\u002Fformat-serialization","6.suites\u002F4.format-serialization",{"title":92,"path":93,"stem":94},"Fuzzing","\u002Fsuites\u002Ffuzzing","6.suites\u002F5.fuzzing",{"title":96,"icon":97,"redirect":98,"path":99,"stem":100,"children":101,"page":18},"Benchmarks","i-lucide-gauge","\u002Fbenchmarks\u002Fvalidation","\u002Fbenchmarks","7.benchmarks",[102,104,108,112,116,119,123],{"title":42,"path":98,"stem":103},"7.benchmarks\u002F1.validation",{"title":105,"path":106,"stem":107},"Validation Formats","\u002Fbenchmarks\u002Fvalidation-formats","7.benchmarks\u002F2.validation-formats",{"title":109,"path":110,"stem":111},"Validation Errors","\u002Fbenchmarks\u002Fgetvalidationerrors","7.benchmarks\u002F3.getvalidationerrors",{"title":113,"path":114,"stem":115},"Validation Error Formats","\u002Fbenchmarks\u002Fgetvalidationerrors-formats","7.benchmarks\u002F4.getvalidationerrors-formats",{"title":34,"path":117,"stem":118},"\u002Fbenchmarks\u002Fserialization","7.benchmarks\u002F5.serialization",{"title":120,"path":121,"stem":122},"Serialization Formats","\u002Fbenchmarks\u002Fserialization-formats","7.benchmarks\u002F6.serialization-formats",{"title":124,"path":125,"stem":126},"Compile Time","\u002Fbenchmarks\u002Fcompiletime","7.benchmarks\u002F7.compiletime",{"id":128,"title":129,"body":130,"description":129,"extension":3563,"meta":3564,"navigation":279,"path":3566,"seo":3567,"stem":3570,"__hash__":3571},"landing\u002Findex.md","",{"type":131,"value":132,"toc":3561},"minimark",[133,136,142,191,841,1359,2043,2292,3148,3205,3551,3557],[134,135],"home-page-body",{},[137,138],"gradient-bg",{":angle":139,":opacity":140,"blur":141},"70","0.2","150px",[143,144,147,173],"u-page-hero",{"className":145},[146],"home-hero",[148,149,150],"template",{"v-slot:header":129},[151,152,157],"typed-title",{":titles":153,"enhancedWord":154,"leading":155,"strikeWord":156},"[\"And the reflection gap\",\"And writing types twice\",\"And your validation layer\",\"And handwritten serialization\",\"Say hello to RunTypes®\"]","Enhanced","We fixed TypeScript","fixed",[148,158,159,160,164,165,168,169,172],{"v-slot:description":129},"TypeScript decided it is ",[161,162,163],"strong",{},"\"Just a Linter\""," and erase your types.\n",[166,167],"br",{},"We respectfully ",[161,170,171],{},"put them back in the runtime"," in a way that's reliable and makes sense.",[148,174,175,184],{"v-slot:links":129},[176,177,183],"u-button",{"color":178,"icon":179,"size":180,"to":7,"className":181},"primary","icon-park-outline:book-one","xl",[182],"btn-docs","Read the Docs",[176,185,190],{"color":186,"icon":187,"size":180,"to":188,"variant":189},"neutral","simple-icons-github","https:\u002F\u002Fgithub.com\u002Fmionkit\u002Fts-runtypes","outline","Give us a Star",[192,193,196,199,206],"u-page-section",{"className":194},[195],"home-features",[148,197,198],{"v-slot:title":129},"Two ways to describe a shape, One source of truth.",[148,200,201],{"v-slot:root":129},[137,202],{":angle":139,":opacity":203,"blur":204,"top":205},"0.15","140px","10rem",[148,207,208,221],{"v-slot:body":129},[209,210,211,212,215,216,220],"p",{},"Write a plain TypeScript type (fastest, zero ceremony) ",[161,213,214],{},"or"," reach for the ",[217,218,219],"code",{},"RT.*"," schema builders if you like the Zod \u002F TypeBox feel. Both compile to the exact same validator — pick whichever you fancy, mix them in the same file.",[222,223,226,551],"div",{"className":224},[225],"rt-define-cols",[227,228,229],"code-group",{},[230,231,236],"pre",{"className":232,"code":233,"filename":234,"language":235,"meta":129,"style":129},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {createValidate} from 'ts-runtypes';\n\n\u002F\u002F Your TypeScript type is the single source of truth — nothing else to write.\ntype User = {\n  id: number;\n  name: string;\n  email: string;\n  roles: ('admin' | 'user')[];\n};\n\n\u002F\u002F A specialized validator, generated from the type at build time.\nconst isUser = createValidate\u003CUser>();\n\nisUser({id: 1, name: 'Ada', email: 'ada@example.com', roles: ['admin']}); \u002F\u002F true\nisUser({id: '1', name: 'Ada'}); \u002F\u002F false\n","Type definition","ts",[217,237,238,274,281,288,305,320,333,345,378,384,389,395,425,430,510],{"__ignoreMap":129},[239,240,243,247,251,255,258,261,264,268,271],"span",{"class":241,"line":242},"line",1,[239,244,246],{"class":245},"s7zQu","import",[239,248,250],{"class":249},"sMK4o"," {",[239,252,254],{"class":253},"sTEyZ","createValidate",[239,256,257],{"class":249},"}",[239,259,260],{"class":245}," from",[239,262,263],{"class":249}," '",[239,265,267],{"class":266},"sfazB","ts-runtypes",[239,269,270],{"class":249},"'",[239,272,273],{"class":249},";\n",[239,275,277],{"class":241,"line":276},2,[239,278,280],{"emptyLinePlaceholder":279},true,"\n",[239,282,284],{"class":241,"line":283},3,[239,285,287],{"class":286},"sHwdD","\u002F\u002F Your TypeScript type is the single source of truth — nothing else to write.\n",[239,289,291,295,299,302],{"class":241,"line":290},4,[239,292,294],{"class":293},"spNyl","type",[239,296,298],{"class":297},"sBMFI"," User",[239,300,301],{"class":249}," =",[239,303,304],{"class":249}," {\n",[239,306,308,312,315,318],{"class":241,"line":307},5,[239,309,311],{"class":310},"swJcz","  id",[239,313,314],{"class":249},":",[239,316,317],{"class":297}," number",[239,319,273],{"class":249},[239,321,323,326,328,331],{"class":241,"line":322},6,[239,324,325],{"class":310},"  name",[239,327,314],{"class":249},[239,329,330],{"class":297}," string",[239,332,273],{"class":249},[239,334,336,339,341,343],{"class":241,"line":335},7,[239,337,338],{"class":310},"  email",[239,340,314],{"class":249},[239,342,330],{"class":297},[239,344,273],{"class":249},[239,346,348,351,353,356,358,361,363,366,368,371,373,376],{"class":241,"line":347},8,[239,349,350],{"class":310},"  roles",[239,352,314],{"class":249},[239,354,355],{"class":253}," (",[239,357,270],{"class":249},[239,359,360],{"class":266},"admin",[239,362,270],{"class":249},[239,364,365],{"class":249}," |",[239,367,263],{"class":249},[239,369,370],{"class":266},"user",[239,372,270],{"class":249},[239,374,375],{"class":253},")[]",[239,377,273],{"class":249},[239,379,381],{"class":241,"line":380},9,[239,382,383],{"class":249},"};\n",[239,385,387],{"class":241,"line":386},10,[239,388,280],{"emptyLinePlaceholder":279},[239,390,392],{"class":241,"line":391},11,[239,393,394],{"class":286},"\u002F\u002F A specialized validator, generated from the type at build time.\n",[239,396,398,401,404,407,411,414,417,420,423],{"class":241,"line":397},12,[239,399,400],{"class":293},"const",[239,402,403],{"class":253}," isUser ",[239,405,406],{"class":249},"=",[239,408,410],{"class":409},"s2Zo4"," createValidate",[239,412,413],{"class":249},"\u003C",[239,415,416],{"class":297},"User",[239,418,419],{"class":249},">",[239,421,422],{"class":253},"()",[239,424,273],{"class":249},[239,426,428],{"class":241,"line":427},13,[239,429,280],{"emptyLinePlaceholder":279},[239,431,433,436,439,442,445,447,451,454,457,459,461,464,466,468,471,473,475,478,480,482,485,487,490,492,494,496,499,501,504,507],{"class":241,"line":432},14,[239,434,435],{"class":409},"isUser",[239,437,438],{"class":253},"(",[239,440,441],{"class":249},"{",[239,443,444],{"class":310},"id",[239,446,314],{"class":249},[239,448,450],{"class":449},"sbssI"," 1",[239,452,453],{"class":249},",",[239,455,456],{"class":310}," name",[239,458,314],{"class":249},[239,460,263],{"class":249},[239,462,463],{"class":266},"Ada",[239,465,270],{"class":249},[239,467,453],{"class":249},[239,469,470],{"class":310}," email",[239,472,314],{"class":249},[239,474,263],{"class":249},[239,476,477],{"class":266},"ada@example.com",[239,479,270],{"class":249},[239,481,453],{"class":249},[239,483,484],{"class":310}," roles",[239,486,314],{"class":249},[239,488,489],{"class":253}," [",[239,491,270],{"class":249},[239,493,360],{"class":266},[239,495,270],{"class":249},[239,497,498],{"class":253},"]",[239,500,257],{"class":249},[239,502,503],{"class":253},")",[239,505,506],{"class":249},";",[239,508,509],{"class":286}," \u002F\u002F true\n",[239,511,513,515,517,519,521,523,525,528,530,532,534,536,538,540,542,544,546,548],{"class":241,"line":512},15,[239,514,435],{"class":409},[239,516,438],{"class":253},[239,518,441],{"class":249},[239,520,444],{"class":310},[239,522,314],{"class":249},[239,524,263],{"class":249},[239,526,527],{"class":266},"1",[239,529,270],{"class":249},[239,531,453],{"class":249},[239,533,456],{"class":310},[239,535,314],{"class":249},[239,537,263],{"class":249},[239,539,463],{"class":266},[239,541,270],{"class":249},[239,543,257],{"class":249},[239,545,503],{"class":253},[239,547,506],{"class":249},[239,549,550],{"class":286}," \u002F\u002F false\n",[227,552,553],{},[230,554,557],{"className":232,"code":555,"filename":556,"language":235,"meta":129,"style":129},"import * as TF from 'ts-runtypes\u002Fformats';\nimport {createValidate, type Static} from 'ts-runtypes';\nimport * as RT from 'ts-runtypes\u002Fschema';\n\n\u002F\u002F Prefer schemas? Describe the same shape with the RT.* builders (Zod \u002F TypeBox style).\nconst userSchema = RT.object({\n  id: TF.number(),\n  name: TF.string(),\n  email: TF.email(),\n  roles: RT.array(RT.union([RT.literal('admin'), RT.literal('user')])),\n});\n\n\u002F\u002F Same validator, same result — your call.\nconst isUser = createValidate(userSchema);\n\n\u002F\u002F Recover the TypeScript type from the schema whenever you need it.\ntype User = Static\u003Ctypeof userSchema>;\n","Schema",[217,558,559,584,612,634,638,643,666,685,702,719,779,787,791,796,811,815,821],{"__ignoreMap":129},[239,560,561,563,566,569,572,575,577,580,582],{"class":241,"line":242},[239,562,246],{"class":245},[239,564,565],{"class":249}," *",[239,567,568],{"class":245}," as",[239,570,571],{"class":253}," TF ",[239,573,574],{"class":245},"from",[239,576,263],{"class":249},[239,578,579],{"class":266},"ts-runtypes\u002Fformats",[239,581,270],{"class":249},[239,583,273],{"class":249},[239,585,586,588,590,592,594,597,600,602,604,606,608,610],{"class":241,"line":276},[239,587,246],{"class":245},[239,589,250],{"class":249},[239,591,254],{"class":253},[239,593,453],{"class":249},[239,595,596],{"class":245}," type",[239,598,599],{"class":253}," Static",[239,601,257],{"class":249},[239,603,260],{"class":245},[239,605,263],{"class":249},[239,607,267],{"class":266},[239,609,270],{"class":249},[239,611,273],{"class":249},[239,613,614,616,618,620,623,625,627,630,632],{"class":241,"line":283},[239,615,246],{"class":245},[239,617,565],{"class":249},[239,619,568],{"class":245},[239,621,622],{"class":253}," RT ",[239,624,574],{"class":245},[239,626,263],{"class":249},[239,628,629],{"class":266},"ts-runtypes\u002Fschema",[239,631,270],{"class":249},[239,633,273],{"class":249},[239,635,636],{"class":241,"line":290},[239,637,280],{"emptyLinePlaceholder":279},[239,639,640],{"class":241,"line":307},[239,641,642],{"class":286},"\u002F\u002F Prefer schemas? Describe the same shape with the RT.* builders (Zod \u002F TypeBox style).\n",[239,644,645,647,650,652,655,658,661,663],{"class":241,"line":322},[239,646,400],{"class":293},[239,648,649],{"class":253}," userSchema ",[239,651,406],{"class":249},[239,653,654],{"class":253}," RT",[239,656,657],{"class":249},".",[239,659,660],{"class":409},"object",[239,662,438],{"class":253},[239,664,665],{"class":249},"{\n",[239,667,668,670,672,675,677,680,682],{"class":241,"line":335},[239,669,311],{"class":310},[239,671,314],{"class":249},[239,673,674],{"class":253}," TF",[239,676,657],{"class":249},[239,678,679],{"class":409},"number",[239,681,422],{"class":253},[239,683,684],{"class":249},",\n",[239,686,687,689,691,693,695,698,700],{"class":241,"line":347},[239,688,325],{"class":310},[239,690,314],{"class":249},[239,692,674],{"class":253},[239,694,657],{"class":249},[239,696,697],{"class":409},"string",[239,699,422],{"class":253},[239,701,684],{"class":249},[239,703,704,706,708,710,712,715,717],{"class":241,"line":380},[239,705,338],{"class":310},[239,707,314],{"class":249},[239,709,674],{"class":253},[239,711,657],{"class":249},[239,713,714],{"class":409},"email",[239,716,422],{"class":253},[239,718,684],{"class":249},[239,720,721,723,725,727,729,732,735,737,740,743,745,748,750,752,754,756,758,760,762,764,766,768,770,772,774,777],{"class":241,"line":386},[239,722,350],{"class":310},[239,724,314],{"class":249},[239,726,654],{"class":253},[239,728,657],{"class":249},[239,730,731],{"class":409},"array",[239,733,734],{"class":253},"(RT",[239,736,657],{"class":249},[239,738,739],{"class":409},"union",[239,741,742],{"class":253},"([RT",[239,744,657],{"class":249},[239,746,747],{"class":409},"literal",[239,749,438],{"class":253},[239,751,270],{"class":249},[239,753,360],{"class":266},[239,755,270],{"class":249},[239,757,503],{"class":253},[239,759,453],{"class":249},[239,761,654],{"class":253},[239,763,657],{"class":249},[239,765,747],{"class":409},[239,767,438],{"class":253},[239,769,270],{"class":249},[239,771,370],{"class":266},[239,773,270],{"class":249},[239,775,776],{"class":253},")]))",[239,778,684],{"class":249},[239,780,781,783,785],{"class":241,"line":391},[239,782,257],{"class":249},[239,784,503],{"class":253},[239,786,273],{"class":249},[239,788,789],{"class":241,"line":397},[239,790,280],{"emptyLinePlaceholder":279},[239,792,793],{"class":241,"line":427},[239,794,795],{"class":286},"\u002F\u002F Same validator, same result — your call.\n",[239,797,798,800,802,804,806,809],{"class":241,"line":432},[239,799,400],{"class":293},[239,801,403],{"class":253},[239,803,406],{"class":249},[239,805,410],{"class":409},[239,807,808],{"class":253},"(userSchema)",[239,810,273],{"class":249},[239,812,813],{"class":241,"line":512},[239,814,280],{"emptyLinePlaceholder":279},[239,816,818],{"class":241,"line":817},16,[239,819,820],{"class":286},"\u002F\u002F Recover the TypeScript type from the schema whenever you need it.\n",[239,822,824,826,828,830,832,835,838],{"class":241,"line":823},17,[239,825,294],{"class":293},[239,827,298],{"class":297},[239,829,301],{"class":249},[239,831,599],{"class":297},[239,833,834],{"class":249},"\u003Ctypeof",[239,836,837],{"class":253}," userSchema",[239,839,840],{"class":249},">;\n",[192,842,843,846],{},[148,844,845],{"v-slot:title":129},"Formats baked into your types",[148,847,848],{"v-slot:body":129},[222,849,852,908,1140],{"className":850},[851],"rt-formats-cols",[853,854,857,862,883,886],"card",{"className":855},[856],"rt-feature-card",[858,859,861],"h3",{"id":860},"typeformats","TypeFormats®",[209,863,864,865,867,869,870,869,873,869,876,869,879,882],{},"Ensure type safety with formats like:",[166,866],{},[217,868,714],{},", ",[217,871,872],{},"uuidv4",[217,874,875],{},"ipv4",[217,877,878],{},"int32",[217,880,881],{},"positive"," and more.",[209,884,885],{},"The validator checks its exact shape, not just its kind. No regex to wire up, no separate schema to keep in sync.",[222,887,890,895],{"className":888},[889],"rt-formats-tile",[891,892,894],"h4",{"id":893},"temporal-support","Temporal Support",[209,896,897,898,869,901,869,904,907],{},"Full TC39 Temporal — ",[217,899,900],{},"PlainDate",[217,902,903],{},"ZonedDateTime",[217,905,906],{},"Duration","… validated and serialized like any built-in.",[227,909,910],{},[230,911,913],{"className":232,"code":912,"filename":234,"language":235,"meta":129,"style":129},"import type * as TF from 'ts-runtypes\u002Fformats';\nimport {createValidate} from 'ts-runtypes';\n\n\u002F\u002F A format brands a string or number — the validator checks its exact\n\u002F\u002F shape, not just \"is it a string\".\ntype Account = {\n  id: TF.UUIDv4;\n  email: TF.Email;\n  ip: TF.IPv4;\n  logins: TF.PositiveInt;\n};\n\nconst isAccount = createValidate\u003CAccount>();\nisAccount({id: 'nope', email: 'ada@x.com', ip: '10.0.0.1', logins: 3}); \u002F\u002F false — id isn't a uuid\n",[217,914,915,937,957,961,966,971,982,997,1012,1028,1044,1048,1052,1074],{"__ignoreMap":129},[239,916,917,919,921,923,925,927,929,931,933,935],{"class":241,"line":242},[239,918,246],{"class":245},[239,920,596],{"class":245},[239,922,565],{"class":249},[239,924,568],{"class":245},[239,926,571],{"class":253},[239,928,574],{"class":245},[239,930,263],{"class":249},[239,932,579],{"class":266},[239,934,270],{"class":249},[239,936,273],{"class":249},[239,938,939,941,943,945,947,949,951,953,955],{"class":241,"line":276},[239,940,246],{"class":245},[239,942,250],{"class":249},[239,944,254],{"class":253},[239,946,257],{"class":249},[239,948,260],{"class":245},[239,950,263],{"class":249},[239,952,267],{"class":266},[239,954,270],{"class":249},[239,956,273],{"class":249},[239,958,959],{"class":241,"line":283},[239,960,280],{"emptyLinePlaceholder":279},[239,962,963],{"class":241,"line":290},[239,964,965],{"class":286},"\u002F\u002F A format brands a string or number — the validator checks its exact\n",[239,967,968],{"class":241,"line":307},[239,969,970],{"class":286},"\u002F\u002F shape, not just \"is it a string\".\n",[239,972,973,975,978,980],{"class":241,"line":322},[239,974,294],{"class":293},[239,976,977],{"class":297}," Account",[239,979,301],{"class":249},[239,981,304],{"class":249},[239,983,984,986,988,990,992,995],{"class":241,"line":335},[239,985,311],{"class":310},[239,987,314],{"class":249},[239,989,674],{"class":297},[239,991,657],{"class":249},[239,993,994],{"class":297},"UUIDv4",[239,996,273],{"class":249},[239,998,999,1001,1003,1005,1007,1010],{"class":241,"line":347},[239,1000,338],{"class":310},[239,1002,314],{"class":249},[239,1004,674],{"class":297},[239,1006,657],{"class":249},[239,1008,1009],{"class":297},"Email",[239,1011,273],{"class":249},[239,1013,1014,1017,1019,1021,1023,1026],{"class":241,"line":380},[239,1015,1016],{"class":310},"  ip",[239,1018,314],{"class":249},[239,1020,674],{"class":297},[239,1022,657],{"class":249},[239,1024,1025],{"class":297},"IPv4",[239,1027,273],{"class":249},[239,1029,1030,1033,1035,1037,1039,1042],{"class":241,"line":386},[239,1031,1032],{"class":310},"  logins",[239,1034,314],{"class":249},[239,1036,674],{"class":297},[239,1038,657],{"class":249},[239,1040,1041],{"class":297},"PositiveInt",[239,1043,273],{"class":249},[239,1045,1046],{"class":241,"line":391},[239,1047,383],{"class":249},[239,1049,1050],{"class":241,"line":397},[239,1051,280],{"emptyLinePlaceholder":279},[239,1053,1054,1056,1059,1061,1063,1065,1068,1070,1072],{"class":241,"line":427},[239,1055,400],{"class":293},[239,1057,1058],{"class":253}," isAccount ",[239,1060,406],{"class":249},[239,1062,410],{"class":409},[239,1064,413],{"class":249},[239,1066,1067],{"class":297},"Account",[239,1069,419],{"class":249},[239,1071,422],{"class":253},[239,1073,273],{"class":249},[239,1075,1076,1079,1081,1083,1085,1087,1089,1092,1094,1096,1098,1100,1102,1105,1107,1109,1112,1114,1116,1119,1121,1123,1126,1128,1131,1133,1135,1137],{"class":241,"line":432},[239,1077,1078],{"class":409},"isAccount",[239,1080,438],{"class":253},[239,1082,441],{"class":249},[239,1084,444],{"class":310},[239,1086,314],{"class":249},[239,1088,263],{"class":249},[239,1090,1091],{"class":266},"nope",[239,1093,270],{"class":249},[239,1095,453],{"class":249},[239,1097,470],{"class":310},[239,1099,314],{"class":249},[239,1101,263],{"class":249},[239,1103,1104],{"class":266},"ada@x.com",[239,1106,270],{"class":249},[239,1108,453],{"class":249},[239,1110,1111],{"class":310}," ip",[239,1113,314],{"class":249},[239,1115,263],{"class":249},[239,1117,1118],{"class":266},"10.0.0.1",[239,1120,270],{"class":249},[239,1122,453],{"class":249},[239,1124,1125],{"class":310}," logins",[239,1127,314],{"class":249},[239,1129,1130],{"class":449}," 3",[239,1132,257],{"class":249},[239,1134,503],{"class":253},[239,1136,506],{"class":249},[239,1138,1139],{"class":286}," \u002F\u002F false — id isn't a uuid\n",[227,1141,1142],{},[230,1143,1145],{"className":232,"code":1144,"filename":556,"language":235,"meta":129,"style":129},"import * as TF from 'ts-runtypes\u002Fformats';\nimport {createValidate, type Static} from 'ts-runtypes';\nimport * as RT from 'ts-runtypes\u002Fschema';\n\n\u002F\u002F The same formats, schema-first — the RT.* builders.\nconst account = RT.object({\n  id: TF.uuidv4(),\n  email: TF.email(),\n  ip: TF.ipv4(),\n  logins: TF.positiveInt(),\n});\n\n\u002F\u002F Recover the TypeScript type from the schema.\ntype Account = Static\u003Ctypeof account>;\n\nconst isAccount = createValidate(account);\n",[217,1146,1147,1167,1193,1213,1217,1222,1241,1257,1273,1289,1306,1314,1318,1323,1340,1344],{"__ignoreMap":129},[239,1148,1149,1151,1153,1155,1157,1159,1161,1163,1165],{"class":241,"line":242},[239,1150,246],{"class":245},[239,1152,565],{"class":249},[239,1154,568],{"class":245},[239,1156,571],{"class":253},[239,1158,574],{"class":245},[239,1160,263],{"class":249},[239,1162,579],{"class":266},[239,1164,270],{"class":249},[239,1166,273],{"class":249},[239,1168,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191],{"class":241,"line":276},[239,1170,246],{"class":245},[239,1172,250],{"class":249},[239,1174,254],{"class":253},[239,1176,453],{"class":249},[239,1178,596],{"class":245},[239,1180,599],{"class":253},[239,1182,257],{"class":249},[239,1184,260],{"class":245},[239,1186,263],{"class":249},[239,1188,267],{"class":266},[239,1190,270],{"class":249},[239,1192,273],{"class":249},[239,1194,1195,1197,1199,1201,1203,1205,1207,1209,1211],{"class":241,"line":283},[239,1196,246],{"class":245},[239,1198,565],{"class":249},[239,1200,568],{"class":245},[239,1202,622],{"class":253},[239,1204,574],{"class":245},[239,1206,263],{"class":249},[239,1208,629],{"class":266},[239,1210,270],{"class":249},[239,1212,273],{"class":249},[239,1214,1215],{"class":241,"line":290},[239,1216,280],{"emptyLinePlaceholder":279},[239,1218,1219],{"class":241,"line":307},[239,1220,1221],{"class":286},"\u002F\u002F The same formats, schema-first — the RT.* builders.\n",[239,1223,1224,1226,1229,1231,1233,1235,1237,1239],{"class":241,"line":322},[239,1225,400],{"class":293},[239,1227,1228],{"class":253}," account ",[239,1230,406],{"class":249},[239,1232,654],{"class":253},[239,1234,657],{"class":249},[239,1236,660],{"class":409},[239,1238,438],{"class":253},[239,1240,665],{"class":249},[239,1242,1243,1245,1247,1249,1251,1253,1255],{"class":241,"line":335},[239,1244,311],{"class":310},[239,1246,314],{"class":249},[239,1248,674],{"class":253},[239,1250,657],{"class":249},[239,1252,872],{"class":409},[239,1254,422],{"class":253},[239,1256,684],{"class":249},[239,1258,1259,1261,1263,1265,1267,1269,1271],{"class":241,"line":347},[239,1260,338],{"class":310},[239,1262,314],{"class":249},[239,1264,674],{"class":253},[239,1266,657],{"class":249},[239,1268,714],{"class":409},[239,1270,422],{"class":253},[239,1272,684],{"class":249},[239,1274,1275,1277,1279,1281,1283,1285,1287],{"class":241,"line":380},[239,1276,1016],{"class":310},[239,1278,314],{"class":249},[239,1280,674],{"class":253},[239,1282,657],{"class":249},[239,1284,875],{"class":409},[239,1286,422],{"class":253},[239,1288,684],{"class":249},[239,1290,1291,1293,1295,1297,1299,1302,1304],{"class":241,"line":386},[239,1292,1032],{"class":310},[239,1294,314],{"class":249},[239,1296,674],{"class":253},[239,1298,657],{"class":249},[239,1300,1301],{"class":409},"positiveInt",[239,1303,422],{"class":253},[239,1305,684],{"class":249},[239,1307,1308,1310,1312],{"class":241,"line":391},[239,1309,257],{"class":249},[239,1311,503],{"class":253},[239,1313,273],{"class":249},[239,1315,1316],{"class":241,"line":397},[239,1317,280],{"emptyLinePlaceholder":279},[239,1319,1320],{"class":241,"line":427},[239,1321,1322],{"class":286},"\u002F\u002F Recover the TypeScript type from the schema.\n",[239,1324,1325,1327,1329,1331,1333,1335,1338],{"class":241,"line":432},[239,1326,294],{"class":293},[239,1328,977],{"class":297},[239,1330,301],{"class":249},[239,1332,599],{"class":297},[239,1334,834],{"class":249},[239,1336,1337],{"class":253}," account",[239,1339,840],{"class":249},[239,1341,1342],{"class":241,"line":512},[239,1343,280],{"emptyLinePlaceholder":279},[239,1345,1346,1348,1350,1352,1354,1357],{"class":241,"line":817},[239,1347,400],{"class":293},[239,1349,1058],{"class":253},[239,1351,406],{"class":249},[239,1353,410],{"class":409},[239,1355,1356],{"class":253},"(account)",[239,1358,273],{"class":249},[192,1360,1361,1364],{},[148,1362,1363],{"v-slot:title":129},"One object, Every function.",[148,1365,1366,1558,1922],{"v-slot:body":129},[853,1367,1370],{"className":1368},[1369],"rt-standard-card",[222,1371,1374,1391],{"className":1372},[1373],"rt-standard-split",[222,1375,1378,1382,1385],{"className":1376},[856,1377],"rt-standard-prose",[858,1379,1381],{"id":1380},"the-whole-toolbelt-in-one-box","The whole toolbelt, in one box",[209,1383,1384],{},"Stop gluing five libraries together. RunTypes shares a single type graph across everything it generates, so the validator and the serializer always agree on what your type means.",[209,1386,1387],{},[1388,1389,1390],"a",{"href":35},"One type in, every function out →",[230,1392,1394],{"className":232,"code":1393,"language":235,"meta":129,"style":129},"\u002F\u002F One real-world type — the single source of truth for everything below.\ntype Order = {\n  id: TF.UUIDv4;\n  customer: {name: string; email: TF.Email};\n  items: {sku: string; qty: number; price: number}[];\n  total: number;\n  placedAt: Date;\n  status: 'pending' | 'paid' | 'shipped';\n};\n",[217,1395,1396,1401,1412,1426,1456,1497,1508,1520,1554],{"__ignoreMap":129},[239,1397,1398],{"class":241,"line":242},[239,1399,1400],{"class":286},"\u002F\u002F One real-world type — the single source of truth for everything below.\n",[239,1402,1403,1405,1408,1410],{"class":241,"line":276},[239,1404,294],{"class":293},[239,1406,1407],{"class":297}," Order",[239,1409,301],{"class":249},[239,1411,304],{"class":249},[239,1413,1414,1416,1418,1420,1422,1424],{"class":241,"line":283},[239,1415,311],{"class":310},[239,1417,314],{"class":249},[239,1419,674],{"class":297},[239,1421,657],{"class":249},[239,1423,994],{"class":297},[239,1425,273],{"class":249},[239,1427,1428,1431,1433,1435,1438,1440,1442,1444,1446,1448,1450,1452,1454],{"class":241,"line":290},[239,1429,1430],{"class":310},"  customer",[239,1432,314],{"class":249},[239,1434,250],{"class":249},[239,1436,1437],{"class":310},"name",[239,1439,314],{"class":249},[239,1441,330],{"class":297},[239,1443,506],{"class":249},[239,1445,470],{"class":310},[239,1447,314],{"class":249},[239,1449,674],{"class":297},[239,1451,657],{"class":249},[239,1453,1009],{"class":297},[239,1455,383],{"class":249},[239,1457,1458,1461,1463,1465,1468,1470,1472,1474,1477,1479,1481,1483,1486,1488,1490,1492,1495],{"class":241,"line":307},[239,1459,1460],{"class":310},"  items",[239,1462,314],{"class":249},[239,1464,250],{"class":249},[239,1466,1467],{"class":310},"sku",[239,1469,314],{"class":249},[239,1471,330],{"class":297},[239,1473,506],{"class":249},[239,1475,1476],{"class":310}," qty",[239,1478,314],{"class":249},[239,1480,317],{"class":297},[239,1482,506],{"class":249},[239,1484,1485],{"class":310}," price",[239,1487,314],{"class":249},[239,1489,317],{"class":297},[239,1491,257],{"class":249},[239,1493,1494],{"class":253},"[]",[239,1496,273],{"class":249},[239,1498,1499,1502,1504,1506],{"class":241,"line":322},[239,1500,1501],{"class":310},"  total",[239,1503,314],{"class":249},[239,1505,317],{"class":297},[239,1507,273],{"class":249},[239,1509,1510,1513,1515,1518],{"class":241,"line":335},[239,1511,1512],{"class":310},"  placedAt",[239,1514,314],{"class":249},[239,1516,1517],{"class":297}," Date",[239,1519,273],{"class":249},[239,1521,1522,1525,1527,1529,1532,1534,1536,1538,1541,1543,1545,1547,1550,1552],{"class":241,"line":347},[239,1523,1524],{"class":310},"  status",[239,1526,314],{"class":249},[239,1528,263],{"class":249},[239,1530,1531],{"class":266},"pending",[239,1533,270],{"class":249},[239,1535,365],{"class":249},[239,1537,263],{"class":249},[239,1539,1540],{"class":266},"paid",[239,1542,270],{"class":249},[239,1544,365],{"class":249},[239,1546,263],{"class":249},[239,1548,1549],{"class":266},"shipped",[239,1551,270],{"class":249},[239,1553,273],{"class":249},[239,1555,1556],{"class":241,"line":380},[239,1557,383],{"class":249},[222,1559,1562,1671,1770,1869],{"className":1560},[1561],"rt-object-fns",[222,1563,1566,1570],{"className":1564},[1565],"rt-object-fn",[858,1567,1569],{"id":1568},"validate","Validate",[230,1571,1573],{"className":232,"code":1572,"language":235,"meta":129,"style":129},"const isOrder = createValidate\u003COrder>();\nisOrder(order); \u002F\u002F true\n\nconst orderErrors = createGetValidationErrors\u003COrder>();\norderErrors({...order, total: 'free'}); \u002F\u002F [{path: ['total'], expected: 'number'}]\n",[217,1574,1575,1597,1609,1613,1635],{"__ignoreMap":129},[239,1576,1577,1579,1582,1584,1586,1588,1591,1593,1595],{"class":241,"line":242},[239,1578,400],{"class":293},[239,1580,1581],{"class":253}," isOrder ",[239,1583,406],{"class":249},[239,1585,410],{"class":409},[239,1587,413],{"class":249},[239,1589,1590],{"class":297},"Order",[239,1592,419],{"class":249},[239,1594,422],{"class":253},[239,1596,273],{"class":249},[239,1598,1599,1602,1605,1607],{"class":241,"line":276},[239,1600,1601],{"class":409},"isOrder",[239,1603,1604],{"class":253},"(order)",[239,1606,506],{"class":249},[239,1608,509],{"class":286},[239,1610,1611],{"class":241,"line":283},[239,1612,280],{"emptyLinePlaceholder":279},[239,1614,1615,1617,1620,1622,1625,1627,1629,1631,1633],{"class":241,"line":290},[239,1616,400],{"class":293},[239,1618,1619],{"class":253}," orderErrors ",[239,1621,406],{"class":249},[239,1623,1624],{"class":409}," createGetValidationErrors",[239,1626,413],{"class":249},[239,1628,1590],{"class":297},[239,1630,419],{"class":249},[239,1632,422],{"class":253},[239,1634,273],{"class":249},[239,1636,1637,1640,1642,1645,1648,1650,1653,1655,1657,1660,1662,1664,1666,1668],{"class":241,"line":307},[239,1638,1639],{"class":409},"orderErrors",[239,1641,438],{"class":253},[239,1643,1644],{"class":249},"{...",[239,1646,1647],{"class":253},"order",[239,1649,453],{"class":249},[239,1651,1652],{"class":310}," total",[239,1654,314],{"class":249},[239,1656,263],{"class":249},[239,1658,1659],{"class":266},"free",[239,1661,270],{"class":249},[239,1663,257],{"class":249},[239,1665,503],{"class":253},[239,1667,506],{"class":249},[239,1669,1670],{"class":286}," \u002F\u002F [{path: ['total'], expected: 'number'}]\n",[222,1672,1674,1678],{"className":1673},[1565],[858,1675,1677],{"id":1676},"json","JSON",[230,1679,1681],{"className":232,"code":1680,"language":235,"meta":129,"style":129},"const toJson = createJsonEncoder\u003COrder>();\nconst fromJson = createJsonDecoder\u003COrder>();\n\nconst wire = toJson(order); \u002F\u002F Date -> string, ready for the network\nconst back = fromJson(wire); \u002F\u002F string -> Date again, typed as DataOnly\u003COrder>\n",[217,1682,1683,1705,1727,1731,1750],{"__ignoreMap":129},[239,1684,1685,1687,1690,1692,1695,1697,1699,1701,1703],{"class":241,"line":242},[239,1686,400],{"class":293},[239,1688,1689],{"class":253}," toJson ",[239,1691,406],{"class":249},[239,1693,1694],{"class":409}," createJsonEncoder",[239,1696,413],{"class":249},[239,1698,1590],{"class":297},[239,1700,419],{"class":249},[239,1702,422],{"class":253},[239,1704,273],{"class":249},[239,1706,1707,1709,1712,1714,1717,1719,1721,1723,1725],{"class":241,"line":276},[239,1708,400],{"class":293},[239,1710,1711],{"class":253}," fromJson ",[239,1713,406],{"class":249},[239,1715,1716],{"class":409}," createJsonDecoder",[239,1718,413],{"class":249},[239,1720,1590],{"class":297},[239,1722,419],{"class":249},[239,1724,422],{"class":253},[239,1726,273],{"class":249},[239,1728,1729],{"class":241,"line":283},[239,1730,280],{"emptyLinePlaceholder":279},[239,1732,1733,1735,1738,1740,1743,1745,1747],{"class":241,"line":290},[239,1734,400],{"class":293},[239,1736,1737],{"class":253}," wire ",[239,1739,406],{"class":249},[239,1741,1742],{"class":409}," toJson",[239,1744,1604],{"class":253},[239,1746,506],{"class":249},[239,1748,1749],{"class":286}," \u002F\u002F Date -> string, ready for the network\n",[239,1751,1752,1754,1757,1759,1762,1765,1767],{"class":241,"line":307},[239,1753,400],{"class":293},[239,1755,1756],{"class":253}," back ",[239,1758,406],{"class":249},[239,1760,1761],{"class":409}," fromJson",[239,1763,1764],{"class":253},"(wire)",[239,1766,506],{"class":249},[239,1768,1769],{"class":286}," \u002F\u002F string -> Date again, typed as DataOnly\u003COrder>\n",[222,1771,1773,1777],{"className":1772},[1565],[858,1774,1776],{"id":1775},"binary","Binary",[230,1778,1780],{"className":232,"code":1779,"language":235,"meta":129,"style":129},"const toBytes = createBinaryEncoder\u003COrder>();\nconst fromBytes = createBinaryDecoder\u003COrder>();\n\nconst bytes = toBytes(order); \u002F\u002F a compact binary buffer — smaller than JSON\nconst order2 = fromBytes(bytes); \u002F\u002F back to a typed object\n",[217,1781,1782,1804,1826,1830,1849],{"__ignoreMap":129},[239,1783,1784,1786,1789,1791,1794,1796,1798,1800,1802],{"class":241,"line":242},[239,1785,400],{"class":293},[239,1787,1788],{"class":253}," toBytes ",[239,1790,406],{"class":249},[239,1792,1793],{"class":409}," createBinaryEncoder",[239,1795,413],{"class":249},[239,1797,1590],{"class":297},[239,1799,419],{"class":249},[239,1801,422],{"class":253},[239,1803,273],{"class":249},[239,1805,1806,1808,1811,1813,1816,1818,1820,1822,1824],{"class":241,"line":276},[239,1807,400],{"class":293},[239,1809,1810],{"class":253}," fromBytes ",[239,1812,406],{"class":249},[239,1814,1815],{"class":409}," createBinaryDecoder",[239,1817,413],{"class":249},[239,1819,1590],{"class":297},[239,1821,419],{"class":249},[239,1823,422],{"class":253},[239,1825,273],{"class":249},[239,1827,1828],{"class":241,"line":283},[239,1829,280],{"emptyLinePlaceholder":279},[239,1831,1832,1834,1837,1839,1842,1844,1846],{"class":241,"line":290},[239,1833,400],{"class":293},[239,1835,1836],{"class":253}," bytes ",[239,1838,406],{"class":249},[239,1840,1841],{"class":409}," toBytes",[239,1843,1604],{"class":253},[239,1845,506],{"class":249},[239,1847,1848],{"class":286}," \u002F\u002F a compact binary buffer — smaller than JSON\n",[239,1850,1851,1853,1856,1858,1861,1864,1866],{"class":241,"line":307},[239,1852,400],{"class":293},[239,1854,1855],{"class":253}," order2 ",[239,1857,406],{"class":249},[239,1859,1860],{"class":409}," fromBytes",[239,1862,1863],{"class":253},"(bytes)",[239,1865,506],{"class":249},[239,1867,1868],{"class":286}," \u002F\u002F back to a typed object\n",[222,1870,1872,1876],{"className":1871},[1565],[858,1873,1875],{"id":1874},"mock","Mock",[230,1877,1879],{"className":232,"code":1878,"language":235,"meta":129,"style":129},"const mockOrder = createMockType\u003COrder>();\nconst fake = mockOrder(); \u002F\u002F a valid, randomized Order for your tests\n",[217,1880,1881,1903],{"__ignoreMap":129},[239,1882,1883,1885,1888,1890,1893,1895,1897,1899,1901],{"class":241,"line":242},[239,1884,400],{"class":293},[239,1886,1887],{"class":253}," mockOrder ",[239,1889,406],{"class":249},[239,1891,1892],{"class":409}," createMockType",[239,1894,413],{"class":249},[239,1896,1590],{"class":297},[239,1898,419],{"class":249},[239,1900,422],{"class":253},[239,1902,273],{"class":249},[239,1904,1905,1907,1910,1912,1915,1917,1919],{"class":241,"line":276},[239,1906,400],{"class":293},[239,1908,1909],{"class":253}," fake ",[239,1911,406],{"class":249},[239,1913,1914],{"class":409}," mockOrder",[239,1916,422],{"class":253},[239,1918,506],{"class":249},[239,1920,1921],{"class":286}," \u002F\u002F a valid, randomized Order for your tests\n",[853,1923,1925],{"className":1924},[1369],[222,1926,1928,2017],{"className":1927},[1373],[230,1929,1931],{"className":232,"code":1930,"language":235,"meta":129,"style":129},"const orderSchema = createStandardSchema\u003COrder>();\n\n\u002F\u002F a Standard Schema v1 object — hand it to any tool that speaks the spec\norderSchema['~standard'].validate(order); \u002F\u002F {value: order}\norderSchema['~standard'].validate({}); \u002F\u002F {issues: [{message, path}, …]}\n",[217,1932,1933,1955,1959,1964,1989],{"__ignoreMap":129},[239,1934,1935,1937,1940,1942,1945,1947,1949,1951,1953],{"class":241,"line":242},[239,1936,400],{"class":293},[239,1938,1939],{"class":253}," orderSchema ",[239,1941,406],{"class":249},[239,1943,1944],{"class":409}," createStandardSchema",[239,1946,413],{"class":249},[239,1948,1590],{"class":297},[239,1950,419],{"class":249},[239,1952,422],{"class":253},[239,1954,273],{"class":249},[239,1956,1957],{"class":241,"line":276},[239,1958,280],{"emptyLinePlaceholder":279},[239,1960,1961],{"class":241,"line":283},[239,1962,1963],{"class":286},"\u002F\u002F a Standard Schema v1 object — hand it to any tool that speaks the spec\n",[239,1965,1966,1969,1971,1974,1976,1978,1980,1982,1984,1986],{"class":241,"line":290},[239,1967,1968],{"class":253},"orderSchema[",[239,1970,270],{"class":249},[239,1972,1973],{"class":266},"~standard",[239,1975,270],{"class":249},[239,1977,498],{"class":253},[239,1979,657],{"class":249},[239,1981,1568],{"class":409},[239,1983,1604],{"class":253},[239,1985,506],{"class":249},[239,1987,1988],{"class":286}," \u002F\u002F {value: order}\n",[239,1990,1991,1993,1995,1997,1999,2001,2003,2005,2007,2010,2012,2014],{"class":241,"line":307},[239,1992,1968],{"class":253},[239,1994,270],{"class":249},[239,1996,1973],{"class":266},[239,1998,270],{"class":249},[239,2000,498],{"class":253},[239,2002,657],{"class":249},[239,2004,1568],{"class":409},[239,2006,438],{"class":253},[239,2008,2009],{"class":249},"{}",[239,2011,503],{"class":253},[239,2013,506],{"class":249},[239,2015,2016],{"class":286}," \u002F\u002F {issues: [{message, path}, …]}\n",[222,2018,2020,2024,2037],{"className":2019},[856,1377],[858,2021,2023],{"id":2022},"speaks-standard-schema","Speaks Standard Schema",[209,2025,2026,2027,2033,2034,2036],{},"The same type becomes a ",[1388,2028,2032],{"href":2029,"rel":2030},"https:\u002F\u002Fgithub.com\u002Fstandard-schema\u002Fstandard-schema",[2031],"nofollow","Standard Schema",", the shared ",[217,2035,1973],{}," contract that tRPC, TanStack Form and Router, Hono and many more accept directly. One call, no adapter to write.",[209,2038,2039],{},[1388,2040,2042],{"href":2041},"\u002Fguide\u002Fvalidation#standard-schema","One spec, every framework →",[192,2044,2045,2048],{},[148,2046,2047],{"v-slot:title":129},"The reflection TypeScript never shipped",[148,2049,2050],{"v-slot:body":129},[222,2051,2054,2275],{"className":2052},[2053],"rt-feature-row",[230,2055,2057],{"className":232,"code":2056,"language":235,"meta":129,"style":129},"import {getRunType, RunTypeKind} from 'ts-runtypes';\n\n\u002F\u002F One real type — the single source of truth.\ntype Order = {\n  id: string;\n  total: number;\n  items: {sku: string; qty: number}[];\n};\n\n\u002F\u002F Recover the actual RunType node — the traversable type graph TypeScript erased.\nconst orderRT = getRunType\u003COrder>();\n\n\u002F\u002F Walk it like any tree: its kind, property names, nested children…\nconsole.log(orderRT.kind === RunTypeKind.objectLiteral); \u002F\u002F true\nconsole.log(orderRT.children?.map((prop) => prop.name)); \u002F\u002F ['id', 'total', 'items']\n",[217,2058,2059,2085,2089,2094,2104,2114,2124,2152,2156,2160,2165,2187,2191,2196,2228],{"__ignoreMap":129},[239,2060,2061,2063,2065,2068,2070,2073,2075,2077,2079,2081,2083],{"class":241,"line":242},[239,2062,246],{"class":245},[239,2064,250],{"class":249},[239,2066,2067],{"class":253},"getRunType",[239,2069,453],{"class":249},[239,2071,2072],{"class":253}," RunTypeKind",[239,2074,257],{"class":249},[239,2076,260],{"class":245},[239,2078,263],{"class":249},[239,2080,267],{"class":266},[239,2082,270],{"class":249},[239,2084,273],{"class":249},[239,2086,2087],{"class":241,"line":276},[239,2088,280],{"emptyLinePlaceholder":279},[239,2090,2091],{"class":241,"line":283},[239,2092,2093],{"class":286},"\u002F\u002F One real type — the single source of truth.\n",[239,2095,2096,2098,2100,2102],{"class":241,"line":290},[239,2097,294],{"class":293},[239,2099,1407],{"class":297},[239,2101,301],{"class":249},[239,2103,304],{"class":249},[239,2105,2106,2108,2110,2112],{"class":241,"line":307},[239,2107,311],{"class":310},[239,2109,314],{"class":249},[239,2111,330],{"class":297},[239,2113,273],{"class":249},[239,2115,2116,2118,2120,2122],{"class":241,"line":322},[239,2117,1501],{"class":310},[239,2119,314],{"class":249},[239,2121,317],{"class":297},[239,2123,273],{"class":249},[239,2125,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146,2148,2150],{"class":241,"line":335},[239,2127,1460],{"class":310},[239,2129,314],{"class":249},[239,2131,250],{"class":249},[239,2133,1467],{"class":310},[239,2135,314],{"class":249},[239,2137,330],{"class":297},[239,2139,506],{"class":249},[239,2141,1476],{"class":310},[239,2143,314],{"class":249},[239,2145,317],{"class":297},[239,2147,257],{"class":249},[239,2149,1494],{"class":253},[239,2151,273],{"class":249},[239,2153,2154],{"class":241,"line":347},[239,2155,383],{"class":249},[239,2157,2158],{"class":241,"line":380},[239,2159,280],{"emptyLinePlaceholder":279},[239,2161,2162],{"class":241,"line":386},[239,2163,2164],{"class":286},"\u002F\u002F Recover the actual RunType node — the traversable type graph TypeScript erased.\n",[239,2166,2167,2169,2172,2174,2177,2179,2181,2183,2185],{"class":241,"line":391},[239,2168,400],{"class":293},[239,2170,2171],{"class":253}," orderRT ",[239,2173,406],{"class":249},[239,2175,2176],{"class":409}," getRunType",[239,2178,413],{"class":249},[239,2180,1590],{"class":297},[239,2182,419],{"class":249},[239,2184,422],{"class":253},[239,2186,273],{"class":249},[239,2188,2189],{"class":241,"line":397},[239,2190,280],{"emptyLinePlaceholder":279},[239,2192,2193],{"class":241,"line":427},[239,2194,2195],{"class":286},"\u002F\u002F Walk it like any tree: its kind, property names, nested children…\n",[239,2197,2198,2201,2203,2206,2209,2211,2214,2217,2219,2221,2224,2226],{"class":241,"line":432},[239,2199,2200],{"class":253},"console",[239,2202,657],{"class":249},[239,2204,2205],{"class":409},"log",[239,2207,2208],{"class":253},"(orderRT",[239,2210,657],{"class":249},[239,2212,2213],{"class":253},"kind ",[239,2215,2216],{"class":249},"===",[239,2218,2072],{"class":253},[239,2220,657],{"class":249},[239,2222,2223],{"class":253},"objectLiteral)",[239,2225,506],{"class":249},[239,2227,509],{"class":286},[239,2229,2230,2232,2234,2236,2238,2240,2243,2246,2249,2251,2253,2257,2259,2262,2265,2267,2270,2272],{"class":241,"line":512},[239,2231,2200],{"class":253},[239,2233,657],{"class":249},[239,2235,2205],{"class":409},[239,2237,2208],{"class":253},[239,2239,657],{"class":249},[239,2241,2242],{"class":253},"children",[239,2244,2245],{"class":249},"?.",[239,2247,2248],{"class":409},"map",[239,2250,438],{"class":253},[239,2252,438],{"class":249},[239,2254,2256],{"class":2255},"sHdIc","prop",[239,2258,503],{"class":249},[239,2260,2261],{"class":293}," =>",[239,2263,2264],{"class":253}," prop",[239,2266,657],{"class":249},[239,2268,2269],{"class":253},"name))",[239,2271,506],{"class":249},[239,2273,2274],{"class":286}," \u002F\u002F ['id', 'total', 'items']\n",[853,2276,2278,2282,2285,2287],{"className":2277},[856],[858,2279,2281],{"id":2280},"recover-the-type-graph","Recover the type graph",[209,2283,2284],{},"Get back a traversable RunType node — the same graph the library walks internally: kind, property names, nested children, format annotations and more. Bring a type or infer it from a runtime value, then read it however you need — to drive codegen, build forms, or power your own tooling.",[166,2286],{},[209,2288,2289],{},[1388,2290,2291],{"href":47},"Reflection you can actually walk →",[192,2293,2296,2304],{"className":2294},[2295],"ai-section",[148,2297,2298,2303],{"v-slot:title":129},[2299,2300],"u-icon",{"className":2301,"name":55},[2302],"ai-title-icon"," AI Agents meets Deterministic",[148,2305,2306,2322,2333,2387,3141],{"v-slot:body":129},[2307,2308,2312,2317],"card-group",{"className":2309},[2310,2311],"sm:grid-cols-2","ai-artifacts",[853,2313,2316],{"icon":2314,"title":2315,"to":65},"i-lucide-message-square-text","AI-generated human-readable labels & errors","Friendly field labels and error messages for your forms and UI — written for people, kept in sync with your type.",[853,2318,2321],{"icon":2319,"title":2320,"to":69},"i-lucide-dices","AI-generated real-world mock data","Believable sample data — real names, emails, addresses — for your tests and demos, with every value valid for its field.",[222,2323,2326,2330],{"className":2324},[2325],"ai-steps-head",[858,2327,2329],{"id":2328},"the-compiler-writes-the-code-your-agent-fills-the-blanks","The compiler writes the code, your agent fills the blanks",[209,2331,2332],{},"Some values the compiler can't invent — a clear field label, a friendly error message, a believable sample name. So it does the hard part: it scaffolds a real, type-accurate source file, your agent fills in the blanks, and the compiler keeps it all in sync.",[222,2334,2337,2355,2371],{"className":2335},[2336],"ai-steps",[222,2338,2341,2352],{"className":2339},[2340],"ai-step",[209,2342,2343,2347],{},[239,2344,527],{"className":2345},[2346],"ai-step-num",[239,2348,2351],{"className":2349},[2350],"ai-step-title","The compiler scaffolds",[209,2353,2354],{},"From your type it writes a real source file — every field in place, correctly typed, with each blank marked.",[222,2356,2358,2368],{"className":2357},[2340],[209,2359,2360,2364],{},[239,2361,2363],{"className":2362},[2346],"2",[239,2365,2367],{"className":2366},[2350],"The AI agent fills the gaps",[209,2369,2370],{},"Guided by the type, the agent writes the labels, messages and sample values into the blanks.",[222,2372,2374,2384],{"className":2373},[2340],[209,2375,2376,2380],{},[239,2377,2379],{"className":2378},[2346],"3",[239,2381,2383],{"className":2382},[2350],"The compiler checks & keeps in sync",[209,2385,2386],{},"It checks every value against the type and updates the file as your type changes — your edits kept.",[227,2388,2389,2530,2836],{},[230,2390,2393],{"className":232,"code":2391,"filename":2392,"language":235,"meta":129,"style":129},"import type * as TF from 'ts-runtypes\u002Fformats';\n\n\u002F\u002F models\u002Fuser.ts\nexport interface User {\n  name: TF.String\u003C{ minLength: 2; maxLength: 60 }>;\n  age: TF.Number\u003C{ min: 0; max: 120 }>;\n  email: TF.Email;\n}\n","Your type",[217,2394,2395,2417,2421,2426,2438,2475,2511,2525],{"__ignoreMap":129},[239,2396,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415],{"class":241,"line":242},[239,2398,246],{"class":245},[239,2400,596],{"class":245},[239,2402,565],{"class":249},[239,2404,568],{"class":245},[239,2406,571],{"class":253},[239,2408,574],{"class":245},[239,2410,263],{"class":249},[239,2412,579],{"class":266},[239,2414,270],{"class":249},[239,2416,273],{"class":249},[239,2418,2419],{"class":241,"line":276},[239,2420,280],{"emptyLinePlaceholder":279},[239,2422,2423],{"class":241,"line":283},[239,2424,2425],{"class":286},"\u002F\u002F models\u002Fuser.ts\n",[239,2427,2428,2431,2434,2436],{"class":241,"line":290},[239,2429,2430],{"class":245},"export",[239,2432,2433],{"class":293}," interface",[239,2435,298],{"class":297},[239,2437,304],{"class":249},[239,2439,2440,2442,2444,2446,2448,2451,2454,2457,2459,2462,2464,2467,2469,2472],{"class":241,"line":307},[239,2441,325],{"class":310},[239,2443,314],{"class":249},[239,2445,674],{"class":297},[239,2447,657],{"class":249},[239,2449,2450],{"class":297},"String",[239,2452,2453],{"class":249},"\u003C{",[239,2455,2456],{"class":310}," minLength",[239,2458,314],{"class":249},[239,2460,2461],{"class":449}," 2",[239,2463,506],{"class":249},[239,2465,2466],{"class":310}," maxLength",[239,2468,314],{"class":249},[239,2470,2471],{"class":449}," 60",[239,2473,2474],{"class":249}," }>;\n",[239,2476,2477,2480,2482,2484,2486,2489,2491,2494,2496,2499,2501,2504,2506,2509],{"class":241,"line":322},[239,2478,2479],{"class":310},"  age",[239,2481,314],{"class":249},[239,2483,674],{"class":297},[239,2485,657],{"class":249},[239,2487,2488],{"class":297},"Number",[239,2490,2453],{"class":249},[239,2492,2493],{"class":310}," min",[239,2495,314],{"class":249},[239,2497,2498],{"class":449}," 0",[239,2500,506],{"class":249},[239,2502,2503],{"class":310}," max",[239,2505,314],{"class":249},[239,2507,2508],{"class":449}," 120",[239,2510,2474],{"class":249},[239,2512,2513,2515,2517,2519,2521,2523],{"class":241,"line":335},[239,2514,338],{"class":310},[239,2516,314],{"class":249},[239,2518,674],{"class":297},[239,2520,657],{"class":249},[239,2522,1009],{"class":297},[239,2524,273],{"class":249},[239,2526,2527],{"class":241,"line":347},[239,2528,2529],{"class":249},"}\n",[230,2531,2534],{"className":232,"code":2532,"filename":2533,"language":235,"meta":129,"style":129},"import type { FriendlyType } from 'ts-runtypes';\nimport type { User } from '.\u002Fuser';\n\n\u002F\u002F scaffolded by `gen`: every field in place, each blank marked @todo\nexport const userFriendly: FriendlyType\u003CUser> = {\n  $label: '', \u002F\u002F @todo\n  name: {\n    $label: '', \u002F\u002F @todo\n    $errors: {\n      type: '',      \u002F\u002F @todo\n      minLength: '', \u002F\u002F @todo\n      maxLength: '', \u002F\u002F @todo\n    },\n  },\n  age: {\n    $label: '', \u002F\u002F @todo\n    $errors: {\n      type: '', \u002F\u002F @todo\n      min: '',  \u002F\u002F @todo\n      max: '',  \u002F\u002F @todo\n    },\n  },\n  email: { $label: '', $errors: { pattern: '' } },          \u002F\u002F @todo\n};\n","Generated by the compiler",[217,2535,2536,2560,2583,2587,2592,2616,2631,2639,2652,2661,2675,2688,2701,2706,2711,2719,2731,2739,2752,2767,2781,2786,2791,2831],{"__ignoreMap":129},[239,2537,2538,2540,2542,2544,2547,2550,2552,2554,2556,2558],{"class":241,"line":242},[239,2539,246],{"class":245},[239,2541,596],{"class":245},[239,2543,250],{"class":249},[239,2545,2546],{"class":253}," FriendlyType",[239,2548,2549],{"class":249}," }",[239,2551,260],{"class":245},[239,2553,263],{"class":249},[239,2555,267],{"class":266},[239,2557,270],{"class":249},[239,2559,273],{"class":249},[239,2561,2562,2564,2566,2568,2570,2572,2574,2576,2579,2581],{"class":241,"line":276},[239,2563,246],{"class":245},[239,2565,596],{"class":245},[239,2567,250],{"class":249},[239,2569,298],{"class":253},[239,2571,2549],{"class":249},[239,2573,260],{"class":245},[239,2575,263],{"class":249},[239,2577,2578],{"class":266},".\u002Fuser",[239,2580,270],{"class":249},[239,2582,273],{"class":249},[239,2584,2585],{"class":241,"line":283},[239,2586,280],{"emptyLinePlaceholder":279},[239,2588,2589],{"class":241,"line":290},[239,2590,2591],{"class":286},"\u002F\u002F scaffolded by `gen`: every field in place, each blank marked @todo\n",[239,2593,2594,2596,2599,2602,2604,2606,2608,2610,2612,2614],{"class":241,"line":307},[239,2595,2430],{"class":245},[239,2597,2598],{"class":293}," const",[239,2600,2601],{"class":253}," userFriendly",[239,2603,314],{"class":249},[239,2605,2546],{"class":297},[239,2607,413],{"class":249},[239,2609,416],{"class":297},[239,2611,419],{"class":249},[239,2613,301],{"class":249},[239,2615,304],{"class":249},[239,2617,2618,2621,2623,2626,2628],{"class":241,"line":322},[239,2619,2620],{"class":310},"  $label",[239,2622,314],{"class":249},[239,2624,2625],{"class":249}," ''",[239,2627,453],{"class":249},[239,2629,2630],{"class":286}," \u002F\u002F @todo\n",[239,2632,2633,2635,2637],{"class":241,"line":335},[239,2634,325],{"class":310},[239,2636,314],{"class":249},[239,2638,304],{"class":249},[239,2640,2641,2644,2646,2648,2650],{"class":241,"line":347},[239,2642,2643],{"class":310},"    $label",[239,2645,314],{"class":249},[239,2647,2625],{"class":249},[239,2649,453],{"class":249},[239,2651,2630],{"class":286},[239,2653,2654,2657,2659],{"class":241,"line":380},[239,2655,2656],{"class":310},"    $errors",[239,2658,314],{"class":249},[239,2660,304],{"class":249},[239,2662,2663,2666,2668,2670,2672],{"class":241,"line":386},[239,2664,2665],{"class":310},"      type",[239,2667,314],{"class":249},[239,2669,2625],{"class":249},[239,2671,453],{"class":249},[239,2673,2674],{"class":286},"      \u002F\u002F @todo\n",[239,2676,2677,2680,2682,2684,2686],{"class":241,"line":391},[239,2678,2679],{"class":310},"      minLength",[239,2681,314],{"class":249},[239,2683,2625],{"class":249},[239,2685,453],{"class":249},[239,2687,2630],{"class":286},[239,2689,2690,2693,2695,2697,2699],{"class":241,"line":397},[239,2691,2692],{"class":310},"      maxLength",[239,2694,314],{"class":249},[239,2696,2625],{"class":249},[239,2698,453],{"class":249},[239,2700,2630],{"class":286},[239,2702,2703],{"class":241,"line":427},[239,2704,2705],{"class":249},"    },\n",[239,2707,2708],{"class":241,"line":432},[239,2709,2710],{"class":249},"  },\n",[239,2712,2713,2715,2717],{"class":241,"line":512},[239,2714,2479],{"class":310},[239,2716,314],{"class":249},[239,2718,304],{"class":249},[239,2720,2721,2723,2725,2727,2729],{"class":241,"line":817},[239,2722,2643],{"class":310},[239,2724,314],{"class":249},[239,2726,2625],{"class":249},[239,2728,453],{"class":249},[239,2730,2630],{"class":286},[239,2732,2733,2735,2737],{"class":241,"line":823},[239,2734,2656],{"class":310},[239,2736,314],{"class":249},[239,2738,304],{"class":249},[239,2740,2742,2744,2746,2748,2750],{"class":241,"line":2741},18,[239,2743,2665],{"class":310},[239,2745,314],{"class":249},[239,2747,2625],{"class":249},[239,2749,453],{"class":249},[239,2751,2630],{"class":286},[239,2753,2755,2758,2760,2762,2764],{"class":241,"line":2754},19,[239,2756,2757],{"class":310},"      min",[239,2759,314],{"class":249},[239,2761,2625],{"class":249},[239,2763,453],{"class":249},[239,2765,2766],{"class":286},"  \u002F\u002F @todo\n",[239,2768,2770,2773,2775,2777,2779],{"class":241,"line":2769},20,[239,2771,2772],{"class":310},"      max",[239,2774,314],{"class":249},[239,2776,2625],{"class":249},[239,2778,453],{"class":249},[239,2780,2766],{"class":286},[239,2782,2784],{"class":241,"line":2783},21,[239,2785,2705],{"class":249},[239,2787,2789],{"class":241,"line":2788},22,[239,2790,2710],{"class":249},[239,2792,2794,2796,2798,2800,2803,2805,2807,2809,2812,2814,2816,2819,2821,2823,2825,2828],{"class":241,"line":2793},23,[239,2795,338],{"class":310},[239,2797,314],{"class":249},[239,2799,250],{"class":249},[239,2801,2802],{"class":310}," $label",[239,2804,314],{"class":249},[239,2806,2625],{"class":249},[239,2808,453],{"class":249},[239,2810,2811],{"class":310}," $errors",[239,2813,314],{"class":249},[239,2815,250],{"class":249},[239,2817,2818],{"class":310}," pattern",[239,2820,314],{"class":249},[239,2822,2625],{"class":249},[239,2824,2549],{"class":249},[239,2826,2827],{"class":249}," },",[239,2829,2830],{"class":286},"          \u002F\u002F @todo\n",[239,2832,2834],{"class":241,"line":2833},24,[239,2835,383],{"class":249},[230,2837,2840],{"className":232,"code":2838,"filename":2839,"language":235,"meta":129,"style":129},"import type { FriendlyType } from 'ts-runtypes';\nimport type { User } from '.\u002Fuser';\n\nexport const userFriendly: FriendlyType\u003CUser> = {\n  $label: 'User account',\n  name: {\n    $label: 'Full name',\n    $errors: {\n      type: '$[label] must be a valid name',\n      minLength: '$[label] needs at least $[val] characters',\n      maxLength: '$[label] allows at most $[val] characters',\n    },\n  },\n  age: {\n    $label: 'Age',\n    $errors: {\n      type: '$[label] must be a number',\n      min: '$[label] must be at least $[val]',\n      max: '$[label] must be no more than $[val]',\n    },\n  },\n  email: { $label: 'Email', $errors: { pattern: 'Enter a valid email address' } },\n};\n","Filled by the agent",[217,2841,2842,2864,2886,2890,2912,2927,2935,2950,2958,2973,2988,3003,3007,3011,3019,3034,3042,3057,3072,3087,3091,3095,3137],{"__ignoreMap":129},[239,2843,2844,2846,2848,2850,2852,2854,2856,2858,2860,2862],{"class":241,"line":242},[239,2845,246],{"class":245},[239,2847,596],{"class":245},[239,2849,250],{"class":249},[239,2851,2546],{"class":253},[239,2853,2549],{"class":249},[239,2855,260],{"class":245},[239,2857,263],{"class":249},[239,2859,267],{"class":266},[239,2861,270],{"class":249},[239,2863,273],{"class":249},[239,2865,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884],{"class":241,"line":276},[239,2867,246],{"class":245},[239,2869,596],{"class":245},[239,2871,250],{"class":249},[239,2873,298],{"class":253},[239,2875,2549],{"class":249},[239,2877,260],{"class":245},[239,2879,263],{"class":249},[239,2881,2578],{"class":266},[239,2883,270],{"class":249},[239,2885,273],{"class":249},[239,2887,2888],{"class":241,"line":283},[239,2889,280],{"emptyLinePlaceholder":279},[239,2891,2892,2894,2896,2898,2900,2902,2904,2906,2908,2910],{"class":241,"line":290},[239,2893,2430],{"class":245},[239,2895,2598],{"class":293},[239,2897,2601],{"class":253},[239,2899,314],{"class":249},[239,2901,2546],{"class":297},[239,2903,413],{"class":249},[239,2905,416],{"class":297},[239,2907,419],{"class":249},[239,2909,301],{"class":249},[239,2911,304],{"class":249},[239,2913,2914,2916,2918,2920,2923,2925],{"class":241,"line":307},[239,2915,2620],{"class":310},[239,2917,314],{"class":249},[239,2919,263],{"class":249},[239,2921,2922],{"class":266},"User account",[239,2924,270],{"class":249},[239,2926,684],{"class":249},[239,2928,2929,2931,2933],{"class":241,"line":322},[239,2930,325],{"class":310},[239,2932,314],{"class":249},[239,2934,304],{"class":249},[239,2936,2937,2939,2941,2943,2946,2948],{"class":241,"line":335},[239,2938,2643],{"class":310},[239,2940,314],{"class":249},[239,2942,263],{"class":249},[239,2944,2945],{"class":266},"Full name",[239,2947,270],{"class":249},[239,2949,684],{"class":249},[239,2951,2952,2954,2956],{"class":241,"line":347},[239,2953,2656],{"class":310},[239,2955,314],{"class":249},[239,2957,304],{"class":249},[239,2959,2960,2962,2964,2966,2969,2971],{"class":241,"line":380},[239,2961,2665],{"class":310},[239,2963,314],{"class":249},[239,2965,263],{"class":249},[239,2967,2968],{"class":266},"$[label] must be a valid name",[239,2970,270],{"class":249},[239,2972,684],{"class":249},[239,2974,2975,2977,2979,2981,2984,2986],{"class":241,"line":386},[239,2976,2679],{"class":310},[239,2978,314],{"class":249},[239,2980,263],{"class":249},[239,2982,2983],{"class":266},"$[label] needs at least $[val] characters",[239,2985,270],{"class":249},[239,2987,684],{"class":249},[239,2989,2990,2992,2994,2996,2999,3001],{"class":241,"line":391},[239,2991,2692],{"class":310},[239,2993,314],{"class":249},[239,2995,263],{"class":249},[239,2997,2998],{"class":266},"$[label] allows at most $[val] characters",[239,3000,270],{"class":249},[239,3002,684],{"class":249},[239,3004,3005],{"class":241,"line":397},[239,3006,2705],{"class":249},[239,3008,3009],{"class":241,"line":427},[239,3010,2710],{"class":249},[239,3012,3013,3015,3017],{"class":241,"line":432},[239,3014,2479],{"class":310},[239,3016,314],{"class":249},[239,3018,304],{"class":249},[239,3020,3021,3023,3025,3027,3030,3032],{"class":241,"line":512},[239,3022,2643],{"class":310},[239,3024,314],{"class":249},[239,3026,263],{"class":249},[239,3028,3029],{"class":266},"Age",[239,3031,270],{"class":249},[239,3033,684],{"class":249},[239,3035,3036,3038,3040],{"class":241,"line":817},[239,3037,2656],{"class":310},[239,3039,314],{"class":249},[239,3041,304],{"class":249},[239,3043,3044,3046,3048,3050,3053,3055],{"class":241,"line":823},[239,3045,2665],{"class":310},[239,3047,314],{"class":249},[239,3049,263],{"class":249},[239,3051,3052],{"class":266},"$[label] must be a number",[239,3054,270],{"class":249},[239,3056,684],{"class":249},[239,3058,3059,3061,3063,3065,3068,3070],{"class":241,"line":2741},[239,3060,2757],{"class":310},[239,3062,314],{"class":249},[239,3064,263],{"class":249},[239,3066,3067],{"class":266},"$[label] must be at least $[val]",[239,3069,270],{"class":249},[239,3071,684],{"class":249},[239,3073,3074,3076,3078,3080,3083,3085],{"class":241,"line":2754},[239,3075,2772],{"class":310},[239,3077,314],{"class":249},[239,3079,263],{"class":249},[239,3081,3082],{"class":266},"$[label] must be no more than $[val]",[239,3084,270],{"class":249},[239,3086,684],{"class":249},[239,3088,3089],{"class":241,"line":2769},[239,3090,2705],{"class":249},[239,3092,3093],{"class":241,"line":2783},[239,3094,2710],{"class":249},[239,3096,3097,3099,3101,3103,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127,3130,3132,3134],{"class":241,"line":2788},[239,3098,338],{"class":310},[239,3100,314],{"class":249},[239,3102,250],{"class":249},[239,3104,2802],{"class":310},[239,3106,314],{"class":249},[239,3108,263],{"class":249},[239,3110,1009],{"class":266},[239,3112,270],{"class":249},[239,3114,453],{"class":249},[239,3116,2811],{"class":310},[239,3118,314],{"class":249},[239,3120,250],{"class":249},[239,3122,2818],{"class":310},[239,3124,314],{"class":249},[239,3126,263],{"class":249},[239,3128,3129],{"class":266},"Enter a valid email address",[239,3131,270],{"class":249},[239,3133,2549],{"class":249},[239,3135,3136],{"class":249}," },\n",[239,3138,3139],{"class":241,"line":2793},[239,3140,383],{"class":249},[222,3142,3145],{"className":3143},[3144],"ai-explore",[1388,3146,3147],{"href":56},"Explore AI integration →",[192,3149,3150,3153],{},[148,3151,3152],{"v-slot:title":129},"Performance is nothing without control",[148,3154,3155],{"v-slot:body":129},[222,3156,3159,3185],{"className":3157},[2053,3158],"rt-feature-row--top",[853,3160,3162,3166,3172,3178],{"className":3161},[856],[858,3163,3165],{"id":3164},"toe-to-toe-with-the-fastest","Toe to Toe with the fastest",[209,3167,3168,3169,3171],{},"Our performance matches the fastest validators (AJV, TypeBox, Typia)",[166,3170],{},"\nEven in their faster JIT mode, but without any JIT compilation cost.",[3173,3174],"perf-bars",{":bars":3175,"caption":3176,"footnote":3177},"[{\"name\":\"ts-runtypes\",\"score\":40.6,\"label\":\"40.6M\",\"highlight\":true},{\"name\":\"typia\",\"score\":39.7,\"label\":\"39.7M\"},{\"name\":\"typebox-Jit\",\"score\":38.2,\"label\":\"38.2M\"},{\"name\":\"ajv-Jit\",\"score\":36.9,\"label\":\"36.9M\"},{\"name\":\"zod\",\"score\":7.9,\"label\":\"7.9M\",\"muted\":true}]","Validation throughput — is-valid check (ops\u002Fsec, higher is better)","Zod has no fast is-valid path — it validates by parsing to errors, so its bar is the error-reporting result.",[222,3179,3182],{"className":3180},[3181],"rt-card-footer",[1388,3183,3184],{"href":98},"See the full head-to-head →",[853,3186,3188,3192,3196,3199],{"className":3187},[856],[858,3189,3191],{"id":3190},"tested-to-the-highest-standard","Tested to the highest standard",[3193,3194],"stat-tiles",{":tiles":3195},"[{\"value\":\"7,073\",\"label\":\"front-end tests\",\"sub\":\"Vitest — marker + plugin\",\"hue\":145},{\"value\":\"1,007\",\"label\":\"Go tests\",\"sub\":\"go test .\u002Finternal\",\"hue\":198},{\"value\":\"∞\",\"label\":\"Fuzzy Testing\",\"sub\":\"Random inputs and randomly-generated types, checked against invariants — every finding replayable from a seed.\",\"hue\":280,\"wide\":true,\"to\":\"\u002Fsuites\u002Ffuzzing\"}]",[209,3197,3198],{},"Every transform, cache shape and generated function is covered — on top of an extensive structured suite spanning validation, JSON, binary, mocks and reflection.",[222,3200,3202],{"className":3201},[3181],[1388,3203,3204],{"href":74},"Correctness, pinned down →",[192,3206,3207,3210],{},[148,3208,3209],{"v-slot:title":129},"Tree-shaken to the bone",[148,3211,3212],{"v-slot:body":129},[222,3213,3216,3234,3411],{"className":3214},[3215],"rt-treeshake-cols",[853,3217,3219,3223,3226,3228],{"className":3218},[856],[858,3220,3222],{"id":3221},"ship-only-what-you-call","Ship only what you call",[209,3224,3225],{},"Caches are demand-driven and every entry is its own module, so bundlers split and tree-shake natively. A file that only reflects an id ships zero validation code — and the Vite plugin adds zero runtime dependencies.",[166,3227],{},[209,3229,3230],{},[1388,3231,3233],{"href":3232},"\u002Fintroduction\u002Fabout-ts-runtypes#build-time-not-run-time","Build-time, not run-time →",[227,3235,3236,3310],{},[230,3237,3240],{"className":232,"code":3238,"filename":3239,"language":235,"meta":129,"style":129},"type Order = {\n  id: string;\n  name: number;\n  email: string;\n};\n\nconst isUser = createValidate\u003CUser>();\n","Source Code",[217,3241,3242,3252,3262,3272,3282,3286,3290],{"__ignoreMap":129},[239,3243,3244,3246,3248,3250],{"class":241,"line":242},[239,3245,294],{"class":293},[239,3247,1407],{"class":297},[239,3249,301],{"class":249},[239,3251,304],{"class":249},[239,3253,3254,3256,3258,3260],{"class":241,"line":276},[239,3255,311],{"class":310},[239,3257,314],{"class":249},[239,3259,330],{"class":297},[239,3261,273],{"class":249},[239,3263,3264,3266,3268,3270],{"class":241,"line":283},[239,3265,325],{"class":310},[239,3267,314],{"class":249},[239,3269,317],{"class":297},[239,3271,273],{"class":249},[239,3273,3274,3276,3278,3280],{"class":241,"line":290},[239,3275,338],{"class":310},[239,3277,314],{"class":249},[239,3279,330],{"class":297},[239,3281,273],{"class":249},[239,3283,3284],{"class":241,"line":307},[239,3285,383],{"class":249},[239,3287,3288],{"class":241,"line":322},[239,3289,280],{"emptyLinePlaceholder":279},[239,3291,3292,3294,3296,3298,3300,3302,3304,3306,3308],{"class":241,"line":335},[239,3293,400],{"class":293},[239,3295,403],{"class":253},[239,3297,406],{"class":249},[239,3299,410],{"class":409},[239,3301,413],{"class":249},[239,3303,416],{"class":297},[239,3305,419],{"class":249},[239,3307,422],{"class":253},[239,3309,273],{"class":249},[230,3311,3314],{"className":232,"code":3312,"filename":3313,"language":235,"meta":129,"style":129},"import {__rt_a1b_Xk7} from 'virtual:rt\u002Fa1b_Xk7.js';\n\ntype Order = {\n  id: string;\n  name: number;\n  email: string;\n};\n\nconst isUser = createValidate\u003CUser>(__rt_a1b_Xk7);\n","Transformed",[217,3315,3316,3338,3342,3352,3362,3372,3382,3386,3390],{"__ignoreMap":129},[239,3317,3318,3320,3322,3325,3327,3329,3331,3334,3336],{"class":241,"line":242},[239,3319,246],{"class":245},[239,3321,250],{"class":249},[239,3323,3324],{"class":253},"__rt_a1b_Xk7",[239,3326,257],{"class":249},[239,3328,260],{"class":245},[239,3330,263],{"class":249},[239,3332,3333],{"class":266},"virtual:rt\u002Fa1b_Xk7.js",[239,3335,270],{"class":249},[239,3337,273],{"class":249},[239,3339,3340],{"class":241,"line":276},[239,3341,280],{"emptyLinePlaceholder":279},[239,3343,3344,3346,3348,3350],{"class":241,"line":283},[239,3345,294],{"class":293},[239,3347,1407],{"class":297},[239,3349,301],{"class":249},[239,3351,304],{"class":249},[239,3353,3354,3356,3358,3360],{"class":241,"line":290},[239,3355,311],{"class":310},[239,3357,314],{"class":249},[239,3359,330],{"class":297},[239,3361,273],{"class":249},[239,3363,3364,3366,3368,3370],{"class":241,"line":307},[239,3365,325],{"class":310},[239,3367,314],{"class":249},[239,3369,317],{"class":297},[239,3371,273],{"class":249},[239,3373,3374,3376,3378,3380],{"class":241,"line":322},[239,3375,338],{"class":310},[239,3377,314],{"class":249},[239,3379,330],{"class":297},[239,3381,273],{"class":249},[239,3383,3384],{"class":241,"line":335},[239,3385,383],{"class":249},[239,3387,3388],{"class":241,"line":347},[239,3389,280],{"emptyLinePlaceholder":279},[239,3391,3392,3394,3396,3398,3400,3402,3404,3406,3409],{"class":241,"line":380},[239,3393,400],{"class":293},[239,3395,403],{"class":253},[239,3397,406],{"class":249},[239,3399,410],{"class":409},[239,3401,413],{"class":249},[239,3403,416],{"class":297},[239,3405,419],{"class":249},[239,3407,3408],{"class":253},"(__rt_a1b_Xk7)",[239,3410,273],{"class":249},[227,3412,3413],{},[230,3414,3419],{"className":3415,"code":3416,"filename":3417,"language":3418,"meta":129,"style":129},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F shown as a function for clarity — the real emit is a positional\n\u002F\u002F tuple: faster to initialise, fewer bytes on the wire\nexport function __rt_a1b_Xk7(value) {\n  return typeof value === \"object\" && value !== null &&\n  typeof value.id === \"number\" &&\n  typeof value.name === \"string\" &&\n  typeof value.email === \"string\";\n}\n","Generated Module a1b_Xk7","js",[217,3420,3421,3426,3431,3450,3486,3507,3527,3547],{"__ignoreMap":129},[239,3422,3423],{"class":241,"line":242},[239,3424,3425],{"class":286},"\u002F\u002F shown as a function for clarity — the real emit is a positional\n",[239,3427,3428],{"class":241,"line":276},[239,3429,3430],{"class":286},"\u002F\u002F tuple: faster to initialise, fewer bytes on the wire\n",[239,3432,3433,3435,3438,3441,3443,3446,3448],{"class":241,"line":283},[239,3434,2430],{"class":245},[239,3436,3437],{"class":293}," function",[239,3439,3440],{"class":409}," __rt_a1b_Xk7",[239,3442,438],{"class":249},[239,3444,3445],{"class":2255},"value",[239,3447,503],{"class":249},[239,3449,304],{"class":249},[239,3451,3452,3455,3458,3461,3464,3467,3469,3472,3475,3477,3480,3483],{"class":241,"line":290},[239,3453,3454],{"class":245},"  return",[239,3456,3457],{"class":249}," typeof",[239,3459,3460],{"class":253}," value",[239,3462,3463],{"class":249}," ===",[239,3465,3466],{"class":249}," \"",[239,3468,660],{"class":266},[239,3470,3471],{"class":249},"\"",[239,3473,3474],{"class":249}," &&",[239,3476,3460],{"class":253},[239,3478,3479],{"class":249}," !==",[239,3481,3482],{"class":249}," null",[239,3484,3485],{"class":249}," &&\n",[239,3487,3488,3491,3493,3495,3497,3499,3501,3503,3505],{"class":241,"line":307},[239,3489,3490],{"class":249},"  typeof",[239,3492,3460],{"class":253},[239,3494,657],{"class":249},[239,3496,444],{"class":253},[239,3498,3463],{"class":249},[239,3500,3466],{"class":249},[239,3502,679],{"class":266},[239,3504,3471],{"class":249},[239,3506,3485],{"class":249},[239,3508,3509,3511,3513,3515,3517,3519,3521,3523,3525],{"class":241,"line":322},[239,3510,3490],{"class":249},[239,3512,3460],{"class":253},[239,3514,657],{"class":249},[239,3516,1437],{"class":253},[239,3518,3463],{"class":249},[239,3520,3466],{"class":249},[239,3522,697],{"class":266},[239,3524,3471],{"class":249},[239,3526,3485],{"class":249},[239,3528,3529,3531,3533,3535,3537,3539,3541,3543,3545],{"class":241,"line":335},[239,3530,3490],{"class":249},[239,3532,3460],{"class":253},[239,3534,657],{"class":249},[239,3536,714],{"class":253},[239,3538,3463],{"class":249},[239,3540,3466],{"class":249},[239,3542,697],{"class":266},[239,3544,3471],{"class":249},[239,3546,273],{"class":249},[239,3548,3549],{"class":241,"line":347},[239,3550,2529],{"class":249},[209,3552,3553],{},[239,3554,3556],{"style":3555},"padding-bottom: 6rem;"," ",[3558,3559,3560],"style",{},"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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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}",{"title":129,"searchDepth":276,"depth":276,"links":3562},[],"md",{"pageClass":3565},"home-page","\u002F",{"title":3568,"description":3569},"RunTypes — TypeScript types that show up at runtime","Validation, JSON + binary serialization, mock data and reflection — generated straight from your TypeScript types. No schemas, no drift.","index","gwq7E4uTFlcLNQZBX4VRavk3reCNx1GdodqurWNaJ0I",1781995976769]