[{"data":1,"prerenderedAt":829},["ShallowReactive",2],{"navigation_docs":3,"-introduction-quick-start":127,"-introduction-quick-start-surround":824},[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":15,"body":129,"description":818,"extension":819,"links":820,"meta":821,"navigation":314,"path":16,"seo":822,"stem":17,"__hash__":823},"docs\u002F1.introduction\u002F2.quick-start.md",{"type":130,"value":131},"minimark",[132,137,141,232,240,244,251,417,426,430,433,806,814],[133,134,136],"h2",{"id":135},"_1-install","1. Install",[138,139,140],"p",{},"You need two things: the runtime package and the Vite plugin that reads your types.",[142,143,144,183,208],"code-group",{},[145,146,152],"pre",{"className":147,"code":148,"filename":149,"language":150,"meta":151,"style":151},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add ts-runtypes\npnpm add -D runtypes-devtools\n","pnpm","bash","",[153,154,155,170],"code",{"__ignoreMap":151},[156,157,160,163,167],"span",{"class":158,"line":159},"line",1,[156,161,149],{"class":162},"sBMFI",[156,164,166],{"class":165},"sfazB"," add",[156,168,169],{"class":165}," ts-runtypes\n",[156,171,173,175,177,180],{"class":158,"line":172},2,[156,174,149],{"class":162},[156,176,166],{"class":165},[156,178,179],{"class":165}," -D",[156,181,182],{"class":165}," runtypes-devtools\n",[145,184,187],{"className":147,"code":185,"filename":186,"language":150,"meta":151,"style":151},"npm install ts-runtypes\nnpm install -D runtypes-devtools\n","npm",[153,188,189,198],{"__ignoreMap":151},[156,190,191,193,196],{"class":158,"line":159},[156,192,186],{"class":162},[156,194,195],{"class":165}," install",[156,197,169],{"class":165},[156,199,200,202,204,206],{"class":158,"line":172},[156,201,186],{"class":162},[156,203,195],{"class":165},[156,205,179],{"class":165},[156,207,182],{"class":165},[145,209,212],{"className":147,"code":210,"filename":211,"language":150,"meta":151,"style":151},"yarn add ts-runtypes\nyarn add -D runtypes-devtools\n","yarn",[153,213,214,222],{"__ignoreMap":151},[156,215,216,218,220],{"class":158,"line":159},[156,217,211],{"class":162},[156,219,166],{"class":165},[156,221,169],{"class":165},[156,223,224,226,228,230],{"class":158,"line":172},[156,225,211],{"class":162},[156,227,166],{"class":165},[156,229,179],{"class":165},[156,231,182],{"class":165},[233,234,235,236,239],"note",{},"RunTypes is the only thing that ends up in your runtime bundle, and it carries no dependencies. ",[153,237,238],{},"runtypes-devtools"," does its work at build time and ships nothing to production.",[133,241,243],{"id":242},"_2-wire-up-the-vite-plugin","2. Wire up the Vite plugin",[138,245,246,247,250],{},"Add the plugin to your ",[153,248,249],{},"vite.config.ts",". It runs the Go binary that does the type reading.",[145,252,256],{"className":253,"code":254,"language":255,"meta":151,"style":151},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {defineConfig} from 'vite';\nimport runtypes from 'runtypes-devtools\u002Fvite';\n\n\u002F\u002F vite.config.ts. Add the plugin. The resolver binary for your platform is\n\u002F\u002F installed automatically (an optional dependency) and resolved for you.\nexport default defineConfig({\n  plugins: [\n    runtypes({\n      tsconfig: 'tsconfig.json',\n    }),\n  ],\n});\n","ts",[153,257,258,290,309,316,323,329,348,361,371,389,400,408],{"__ignoreMap":151},[156,259,260,264,268,272,275,278,281,284,287],{"class":158,"line":159},[156,261,263],{"class":262},"s7zQu","import",[156,265,267],{"class":266},"sMK4o"," {",[156,269,271],{"class":270},"sTEyZ","defineConfig",[156,273,274],{"class":266},"}",[156,276,277],{"class":262}," from",[156,279,280],{"class":266}," '",[156,282,283],{"class":165},"vite",[156,285,286],{"class":266},"'",[156,288,289],{"class":266},";\n",[156,291,292,294,297,300,302,305,307],{"class":158,"line":172},[156,293,263],{"class":262},[156,295,296],{"class":270}," runtypes ",[156,298,299],{"class":262},"from",[156,301,280],{"class":266},[156,303,304],{"class":165},"runtypes-devtools\u002Fvite",[156,306,286],{"class":266},[156,308,289],{"class":266},[156,310,312],{"class":158,"line":311},3,[156,313,315],{"emptyLinePlaceholder":314},true,"\n",[156,317,319],{"class":158,"line":318},4,[156,320,322],{"class":321},"sHwdD","\u002F\u002F vite.config.ts. Add the plugin. The resolver binary for your platform is\n",[156,324,326],{"class":158,"line":325},5,[156,327,328],{"class":321},"\u002F\u002F installed automatically (an optional dependency) and resolved for you.\n",[156,330,332,335,338,342,345],{"class":158,"line":331},6,[156,333,334],{"class":262},"export",[156,336,337],{"class":262}," default",[156,339,341],{"class":340},"s2Zo4"," defineConfig",[156,343,344],{"class":270},"(",[156,346,347],{"class":266},"{\n",[156,349,351,355,358],{"class":158,"line":350},7,[156,352,354],{"class":353},"swJcz","  plugins",[156,356,357],{"class":266},":",[156,359,360],{"class":270}," [\n",[156,362,364,367,369],{"class":158,"line":363},8,[156,365,366],{"class":340},"    runtypes",[156,368,344],{"class":270},[156,370,347],{"class":266},[156,372,374,377,379,381,384,386],{"class":158,"line":373},9,[156,375,376],{"class":353},"      tsconfig",[156,378,357],{"class":266},[156,380,280],{"class":266},[156,382,383],{"class":165},"tsconfig.json",[156,385,286],{"class":266},[156,387,388],{"class":266},",\n",[156,390,392,395,398],{"class":158,"line":391},10,[156,393,394],{"class":266},"    }",[156,396,397],{"class":270},")",[156,399,388],{"class":266},[156,401,403,406],{"class":158,"line":402},11,[156,404,405],{"class":270},"  ]",[156,407,388],{"class":266},[156,409,411,413,415],{"class":158,"line":410},12,[156,412,274],{"class":266},[156,414,397],{"class":270},[156,416,289],{"class":266},[233,418,419,420,422,423,425],{},"There's no special ",[153,421,383],{}," flag to enable. Point the plugin at your existing ",[153,424,383],{}," and it reads your types directly. (If you're coming from an older reflection library, this is the step you can skip.)",[133,427,429],{"id":428},"_3-write-a-type-and-validate-it","3. Write a type and validate it",[138,431,432],{},"That's the whole setup. Now write a normal TypeScript type and ask for a validator. The build generates it for you.",[145,434,436],{"className":253,"code":435,"language":255,"meta":151,"style":151},"import {createValidate, createGetValidationErrors} from 'ts-runtypes';\n\n\u002F\u002F 1. Write a normal type.\ntype User = {\n  id: number;\n  name: string;\n  email: string;\n  roles: ('admin' | 'user')[];\n};\n\n\u002F\u002F 2. Ask for a validator. The build generates it from `User`.\nconst isUser = createValidate\u003CUser>();\n\n\u002F\u002F 3. Use it. This is a real, specialized function — no runtime reflection.\nconst maybeUser: unknown = JSON.parse('{\"id\":1,\"name\":\"Ada\",\"email\":\"ada@x.io\",\"roles\":[\"admin\"]}');\n\nif (isUser(maybeUser)) {\n  \u002F\u002F maybeUser is narrowed to User here.\n  console.log(maybeUser.name);\n}\n\n\u002F\u002F Want the WHY, not just a yes\u002Fno? Reach for the error reporter.\nconst getUserErrors = createGetValidationErrors\u003CUser>();\ngetUserErrors({id: '1', name: 'Ada'}); \u002F\u002F [{path: ['id'], ...}, ...]\n\nexport {isUser, getUserErrors};\n",[153,437,438,466,470,475,490,502,514,525,557,562,566,571,599,604,610,647,652,668,674,699,705,710,716,738,785,790],{"__ignoreMap":151},[156,439,440,442,444,447,450,453,455,457,459,462,464],{"class":158,"line":159},[156,441,263],{"class":262},[156,443,267],{"class":266},[156,445,446],{"class":270},"createValidate",[156,448,449],{"class":266},",",[156,451,452],{"class":270}," createGetValidationErrors",[156,454,274],{"class":266},[156,456,277],{"class":262},[156,458,280],{"class":266},[156,460,461],{"class":165},"ts-runtypes",[156,463,286],{"class":266},[156,465,289],{"class":266},[156,467,468],{"class":158,"line":172},[156,469,315],{"emptyLinePlaceholder":314},[156,471,472],{"class":158,"line":311},[156,473,474],{"class":321},"\u002F\u002F 1. Write a normal type.\n",[156,476,477,481,484,487],{"class":158,"line":318},[156,478,480],{"class":479},"spNyl","type",[156,482,483],{"class":162}," User",[156,485,486],{"class":266}," =",[156,488,489],{"class":266}," {\n",[156,491,492,495,497,500],{"class":158,"line":325},[156,493,494],{"class":353},"  id",[156,496,357],{"class":266},[156,498,499],{"class":162}," number",[156,501,289],{"class":266},[156,503,504,507,509,512],{"class":158,"line":331},[156,505,506],{"class":353},"  name",[156,508,357],{"class":266},[156,510,511],{"class":162}," string",[156,513,289],{"class":266},[156,515,516,519,521,523],{"class":158,"line":350},[156,517,518],{"class":353},"  email",[156,520,357],{"class":266},[156,522,511],{"class":162},[156,524,289],{"class":266},[156,526,527,530,532,535,537,540,542,545,547,550,552,555],{"class":158,"line":363},[156,528,529],{"class":353},"  roles",[156,531,357],{"class":266},[156,533,534],{"class":270}," (",[156,536,286],{"class":266},[156,538,539],{"class":165},"admin",[156,541,286],{"class":266},[156,543,544],{"class":266}," |",[156,546,280],{"class":266},[156,548,549],{"class":165},"user",[156,551,286],{"class":266},[156,553,554],{"class":270},")[]",[156,556,289],{"class":266},[156,558,559],{"class":158,"line":373},[156,560,561],{"class":266},"};\n",[156,563,564],{"class":158,"line":391},[156,565,315],{"emptyLinePlaceholder":314},[156,567,568],{"class":158,"line":402},[156,569,570],{"class":321},"\u002F\u002F 2. Ask for a validator. The build generates it from `User`.\n",[156,572,573,576,579,582,585,588,591,594,597],{"class":158,"line":410},[156,574,575],{"class":479},"const",[156,577,578],{"class":270}," isUser ",[156,580,581],{"class":266},"=",[156,583,584],{"class":340}," createValidate",[156,586,587],{"class":266},"\u003C",[156,589,590],{"class":162},"User",[156,592,593],{"class":266},">",[156,595,596],{"class":270},"()",[156,598,289],{"class":266},[156,600,602],{"class":158,"line":601},13,[156,603,315],{"emptyLinePlaceholder":314},[156,605,607],{"class":158,"line":606},14,[156,608,609],{"class":321},"\u002F\u002F 3. Use it. This is a real, specialized function — no runtime reflection.\n",[156,611,613,615,618,620,623,625,628,631,634,636,638,641,643,645],{"class":158,"line":612},15,[156,614,575],{"class":479},[156,616,617],{"class":270}," maybeUser",[156,619,357],{"class":266},[156,621,622],{"class":162}," unknown",[156,624,486],{"class":266},[156,626,627],{"class":270}," JSON",[156,629,630],{"class":266},".",[156,632,633],{"class":340},"parse",[156,635,344],{"class":270},[156,637,286],{"class":266},[156,639,640],{"class":165},"{\"id\":1,\"name\":\"Ada\",\"email\":\"ada@x.io\",\"roles\":[\"admin\"]}",[156,642,286],{"class":266},[156,644,397],{"class":270},[156,646,289],{"class":266},[156,648,650],{"class":158,"line":649},16,[156,651,315],{"emptyLinePlaceholder":314},[156,653,655,658,660,663,666],{"class":158,"line":654},17,[156,656,657],{"class":262},"if",[156,659,534],{"class":270},[156,661,662],{"class":340},"isUser",[156,664,665],{"class":270},"(maybeUser)) ",[156,667,347],{"class":266},[156,669,671],{"class":158,"line":670},18,[156,672,673],{"class":321},"  \u002F\u002F maybeUser is narrowed to User here.\n",[156,675,677,680,682,685,687,690,692,695,697],{"class":158,"line":676},19,[156,678,679],{"class":270},"  console",[156,681,630],{"class":266},[156,683,684],{"class":340},"log",[156,686,344],{"class":353},[156,688,689],{"class":270},"maybeUser",[156,691,630],{"class":266},[156,693,694],{"class":270},"name",[156,696,397],{"class":353},[156,698,289],{"class":266},[156,700,702],{"class":158,"line":701},20,[156,703,704],{"class":266},"}\n",[156,706,708],{"class":158,"line":707},21,[156,709,315],{"emptyLinePlaceholder":314},[156,711,713],{"class":158,"line":712},22,[156,714,715],{"class":321},"\u002F\u002F Want the WHY, not just a yes\u002Fno? Reach for the error reporter.\n",[156,717,719,721,724,726,728,730,732,734,736],{"class":158,"line":718},23,[156,720,575],{"class":479},[156,722,723],{"class":270}," getUserErrors ",[156,725,581],{"class":266},[156,727,452],{"class":340},[156,729,587],{"class":266},[156,731,590],{"class":162},[156,733,593],{"class":266},[156,735,596],{"class":270},[156,737,289],{"class":266},[156,739,741,744,746,749,752,754,756,759,761,763,766,768,770,773,775,777,779,782],{"class":158,"line":740},24,[156,742,743],{"class":340},"getUserErrors",[156,745,344],{"class":270},[156,747,748],{"class":266},"{",[156,750,751],{"class":353},"id",[156,753,357],{"class":266},[156,755,280],{"class":266},[156,757,758],{"class":165},"1",[156,760,286],{"class":266},[156,762,449],{"class":266},[156,764,765],{"class":353}," name",[156,767,357],{"class":266},[156,769,280],{"class":266},[156,771,772],{"class":165},"Ada",[156,774,286],{"class":266},[156,776,274],{"class":266},[156,778,397],{"class":270},[156,780,781],{"class":266},";",[156,783,784],{"class":321}," \u002F\u002F [{path: ['id'], ...}, ...]\n",[156,786,788],{"class":158,"line":787},25,[156,789,315],{"emptyLinePlaceholder":314},[156,791,793,795,797,799,801,804],{"class":158,"line":792},26,[156,794,334],{"class":262},[156,796,267],{"class":266},[156,798,662],{"class":270},[156,800,449],{"class":266},[156,802,803],{"class":270}," getUserErrors",[156,805,561],{"class":266},[138,807,808,810,811,813],{},[153,809,662],{}," is a real, specialized function. No schema, no decorators, no reflection at runtime, just a function that knows exactly what a ",[153,812,590],{}," is.",[815,816,817],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}","Install the package + Vite plugin and generate your first validator from a TypeScript type.","md",null,{"toc":18},{"title":15,"description":818},"OpE0Ezt6mLrG9c6S1KBoKxpgLlnoM9pQp25qu-VxhqE",[825,827],{"title":12,"path":7,"stem":13,"description":826,"children":-1},"The design decisions behind RunTypes and why everything happens at build time.",{"title":27,"path":22,"stem":28,"description":828,"children":-1},"Describe a shape as a plain TypeScript type or with schema builders; both compile to the same thing.",1781995977801]