[{"data":1,"prerenderedAt":700},["ShallowReactive",2],{"navigation_docs":3,"-guide-mocking":127,"-guide-mocking-surround":695},[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":38,"body":129,"description":689,"extension":690,"links":691,"meta":692,"navigation":202,"path":39,"seo":693,"stem":40,"__hash__":694},"docs\u002F2.guide\u002F4.mocking.md",{"type":130,"value":131},"minimark",[132,137,298,302,309,313,320,499,502,592,596,612,679,685],[133,134,136],"h2",{"id":135},"make-some-fake-data","Make some fake data",[138,139,144],"pre",{"className":140,"code":141,"language":142,"meta":143,"style":143},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F packages\u002Fexamples\u002Fsrc\u002Fguide\u002Fmocking-basics.ts\n\u002F\u002F createMockType -> a function that invents a fresh, valid User every call.\nconst mockUser = createMockType\u003CUser>();\n\nconst a = mockUser(); \u002F\u002F {id: 91, name: 'qZ...', roles: ['user'], active: true}\nconst b = mockUser(); \u002F\u002F a different one each time\n\n\u002F\u002F Whatever it produces passes the validator for the same type — by construction.\nconst isUser = createValidate\u003CUser>();\nisUser(mockUser()); \u002F\u002F true\n","ts","",[145,146,147,156,162,197,204,225,244,249,255,278],"code",{"__ignoreMap":143},[148,149,152],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"sHwdD","\u002F\u002F packages\u002Fexamples\u002Fsrc\u002Fguide\u002Fmocking-basics.ts\n",[148,157,159],{"class":150,"line":158},2,[148,160,161],{"class":154},"\u002F\u002F createMockType -> a function that invents a fresh, valid User every call.\n",[148,163,165,169,173,177,181,184,188,191,194],{"class":150,"line":164},3,[148,166,168],{"class":167},"spNyl","const",[148,170,172],{"class":171},"sTEyZ"," mockUser ",[148,174,176],{"class":175},"sMK4o","=",[148,178,180],{"class":179},"s2Zo4"," createMockType",[148,182,183],{"class":175},"\u003C",[148,185,187],{"class":186},"sBMFI","User",[148,189,190],{"class":175},">",[148,192,193],{"class":171},"()",[148,195,196],{"class":175},";\n",[148,198,200],{"class":150,"line":199},4,[148,201,203],{"emptyLinePlaceholder":202},true,"\n",[148,205,207,209,212,214,217,219,222],{"class":150,"line":206},5,[148,208,168],{"class":167},[148,210,211],{"class":171}," a ",[148,213,176],{"class":175},[148,215,216],{"class":179}," mockUser",[148,218,193],{"class":171},[148,220,221],{"class":175},";",[148,223,224],{"class":154}," \u002F\u002F {id: 91, name: 'qZ...', roles: ['user'], active: true}\n",[148,226,228,230,233,235,237,239,241],{"class":150,"line":227},6,[148,229,168],{"class":167},[148,231,232],{"class":171}," b ",[148,234,176],{"class":175},[148,236,216],{"class":179},[148,238,193],{"class":171},[148,240,221],{"class":175},[148,242,243],{"class":154}," \u002F\u002F a different one each time\n",[148,245,247],{"class":150,"line":246},7,[148,248,203],{"emptyLinePlaceholder":202},[148,250,252],{"class":150,"line":251},8,[148,253,254],{"class":154},"\u002F\u002F Whatever it produces passes the validator for the same type — by construction.\n",[148,256,258,260,263,265,268,270,272,274,276],{"class":150,"line":257},9,[148,259,168],{"class":167},[148,261,262],{"class":171}," isUser ",[148,264,176],{"class":175},[148,266,267],{"class":179}," createValidate",[148,269,183],{"class":175},[148,271,187],{"class":186},[148,273,190],{"class":175},[148,275,193],{"class":171},[148,277,196],{"class":175},[148,279,281,284,287,290,293,295],{"class":150,"line":280},10,[148,282,283],{"class":179},"isUser",[148,285,286],{"class":171},"(",[148,288,289],{"class":179},"mockUser",[148,291,292],{"class":171},"())",[148,294,221],{"class":175},[148,296,297],{"class":154}," \u002F\u002F true\n",[299,300,301],"p",{},"Call the generator as many times as you like. You get fresh, valid data every time. Change the type and the mocks follow along, with no fixture to update.",[303,304,305,308],"note",{},[145,306,307],{},"createMockType"," needs the Vite plugin running to read your type. It throws a clear error if the plugin isn't active. It's a build-time tool, so reach for it in tests and seed scripts, not shipped runtime code.",[133,310,312],{"id":311},"steer-it-with-options","Steer it with options",[299,314,315,316,319],{},"Pass a ",[145,317,318],{},"mock"," options bag to nudge the generated values: number ranges, string lengths, how often optionals show up, and more. Options merge in order: built-in defaults, then factory options, then per-call options.",[138,321,323],{"className":140,"code":322,"language":142,"meta":143,"style":143},"\u002F\u002F packages\u002Fexamples\u002Fsrc\u002Fguide\u002Fmocking-options.ts\n\u002F\u002F Options can be set at the factory (apply to every call) or per call.\n\u002F\u002F They merge: defaults \u003C factory \u003C call.\nconst mockAccount = createMockType\u003CAccount>({\n  mock: {\n    minNumber: 0,\n    maxNumber: 1000, \u002F\u002F numbers land in [0, 1000]\n    stringLength: 8, \u002F\u002F every generated string is 8 chars\n    optionalProbability: 1, \u002F\u002F always include optional props like `tags`\n  },\n});\n\nconst rich = mockAccount({mock: {minNumber: 1_000_000}}); \u002F\u002F override just for this call\n",[145,324,325,330,335,340,363,375,389,405,420,435,440,451,456],{"__ignoreMap":143},[148,326,327],{"class":150,"line":151},[148,328,329],{"class":154},"\u002F\u002F packages\u002Fexamples\u002Fsrc\u002Fguide\u002Fmocking-options.ts\n",[148,331,332],{"class":150,"line":158},[148,333,334],{"class":154},"\u002F\u002F Options can be set at the factory (apply to every call) or per call.\n",[148,336,337],{"class":150,"line":164},[148,338,339],{"class":154},"\u002F\u002F They merge: defaults \u003C factory \u003C call.\n",[148,341,342,344,347,349,351,353,356,358,360],{"class":150,"line":199},[148,343,168],{"class":167},[148,345,346],{"class":171}," mockAccount ",[148,348,176],{"class":175},[148,350,180],{"class":179},[148,352,183],{"class":175},[148,354,355],{"class":186},"Account",[148,357,190],{"class":175},[148,359,286],{"class":171},[148,361,362],{"class":175},"{\n",[148,364,365,369,372],{"class":150,"line":206},[148,366,368],{"class":367},"swJcz","  mock",[148,370,371],{"class":175},":",[148,373,374],{"class":175}," {\n",[148,376,377,380,382,386],{"class":150,"line":227},[148,378,379],{"class":367},"    minNumber",[148,381,371],{"class":175},[148,383,385],{"class":384},"sbssI"," 0",[148,387,388],{"class":175},",\n",[148,390,391,394,396,399,402],{"class":150,"line":246},[148,392,393],{"class":367},"    maxNumber",[148,395,371],{"class":175},[148,397,398],{"class":384}," 1000",[148,400,401],{"class":175},",",[148,403,404],{"class":154}," \u002F\u002F numbers land in [0, 1000]\n",[148,406,407,410,412,415,417],{"class":150,"line":251},[148,408,409],{"class":367},"    stringLength",[148,411,371],{"class":175},[148,413,414],{"class":384}," 8",[148,416,401],{"class":175},[148,418,419],{"class":154}," \u002F\u002F every generated string is 8 chars\n",[148,421,422,425,427,430,432],{"class":150,"line":257},[148,423,424],{"class":367},"    optionalProbability",[148,426,371],{"class":175},[148,428,429],{"class":384}," 1",[148,431,401],{"class":175},[148,433,434],{"class":154}," \u002F\u002F always include optional props like `tags`\n",[148,436,437],{"class":150,"line":280},[148,438,439],{"class":175},"  },\n",[148,441,443,446,449],{"class":150,"line":442},11,[148,444,445],{"class":175},"}",[148,447,448],{"class":171},")",[148,450,196],{"class":175},[148,452,454],{"class":150,"line":453},12,[148,455,203],{"emptyLinePlaceholder":202},[148,457,459,461,464,466,469,471,474,476,478,481,484,486,489,492,494,496],{"class":150,"line":458},13,[148,460,168],{"class":167},[148,462,463],{"class":171}," rich ",[148,465,176],{"class":175},[148,467,468],{"class":179}," mockAccount",[148,470,286],{"class":171},[148,472,473],{"class":175},"{",[148,475,318],{"class":367},[148,477,371],{"class":175},[148,479,480],{"class":175}," {",[148,482,483],{"class":367},"minNumber",[148,485,371],{"class":175},[148,487,488],{"class":384}," 1_000_000",[148,490,491],{"class":175},"}}",[148,493,448],{"class":171},[148,495,221],{"class":175},[148,497,498],{"class":154}," \u002F\u002F override just for this call\n",[299,500,501],{},"A few of the knobs you'll reach for most:",[503,504,505,518],"table",{},[506,507,508],"thead",{},[509,510,511,515],"tr",{},[512,513,514],"th",{},"Option",[512,516,517],{},"What it does",[519,520,521,535,548,569,579],"tbody",{},[509,522,523,532],{},[524,525,526,528,529],"td",{},[145,527,483],{}," \u002F ",[145,530,531],{},"maxNumber",[524,533,534],{},"Bounds for generated numbers and bigints.",[509,536,537,545],{},[524,538,539,528,542],{},[145,540,541],{},"stringLength",[145,543,544],{},"maxRandomStringLength",[524,546,547],{},"Force or cap generated string length.",[509,549,550,558],{},[524,551,552,528,555],{},[145,553,554],{},"arrayLength",[145,556,557],{},"maxRandomItemsLength",[524,559,560,561,564,565,568],{},"Force or cap array, ",[145,562,563],{},"Map"," and ",[145,566,567],{},"Set"," sizes.",[509,570,571,576],{},[524,572,573],{},[145,574,575],{},"optionalProbability",[524,577,578],{},"Chance from 0 to 1 that an optional property is included.",[509,580,581,589],{},[524,582,583,528,586],{},[145,584,585],{},"unionIndex",[145,587,588],{},"enumIndex",[524,590,591],{},"Pin a union member or enum branch instead of picking at random.",[133,593,595],{"id":594},"format-aware-mocks","Format-aware mocks",[299,597,598,599,603,604,607,608,611],{},"If your type uses ",[600,601,602],"a",{"href":31},"type formats",", the mock respects them. An ",[145,605,606],{},"email"," field gets a real-looking address, and a ",[145,609,610],{},"uuidv4"," field gets a real-looking UUID, not just random characters.",[138,613,615],{"className":140,"code":614,"language":142,"meta":143,"style":143},"\u002F\u002F packages\u002Fexamples\u002Fsrc\u002Fguide\u002Fmocking-formats.ts\nconst mockContact = createMockType\u003CContact>();\n\nconst fake = mockContact();\n\u002F\u002F id is a real-looking UUID, email is a real-looking address —\n\u002F\u002F not just random strings. The mock is format-aware.\n\u002F\u002F {id: '3f2504e0-4f89-...', email: 'name@example.com', name: '...'}\n",[145,616,617,622,644,648,664,669,674],{"__ignoreMap":143},[148,618,619],{"class":150,"line":151},[148,620,621],{"class":154},"\u002F\u002F packages\u002Fexamples\u002Fsrc\u002Fguide\u002Fmocking-formats.ts\n",[148,623,624,626,629,631,633,635,638,640,642],{"class":150,"line":158},[148,625,168],{"class":167},[148,627,628],{"class":171}," mockContact ",[148,630,176],{"class":175},[148,632,180],{"class":179},[148,634,183],{"class":175},[148,636,637],{"class":186},"Contact",[148,639,190],{"class":175},[148,641,193],{"class":171},[148,643,196],{"class":175},[148,645,646],{"class":150,"line":164},[148,647,203],{"emptyLinePlaceholder":202},[148,649,650,652,655,657,660,662],{"class":150,"line":199},[148,651,168],{"class":167},[148,653,654],{"class":171}," fake ",[148,656,176],{"class":175},[148,658,659],{"class":179}," mockContact",[148,661,193],{"class":171},[148,663,196],{"class":175},[148,665,666],{"class":150,"line":206},[148,667,668],{"class":154},"\u002F\u002F id is a real-looking UUID, email is a real-looking address —\n",[148,670,671],{"class":150,"line":227},[148,672,673],{"class":154},"\u002F\u002F not just random strings. The mock is format-aware.\n",[148,675,676],{"class":150,"line":246},[148,677,678],{"class":154},"\u002F\u002F {id: '3f2504e0-4f89-...', email: 'name@example.com', name: '...'}\n",[299,680,681,682,684],{},"This means a mocked value passes not just the structural validator but the format checks too. The full list of formats and how each one mocks lives in ",[600,683,30],{"href":31},".",[686,687,688],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}","Generate valid, type-shaped fake data for tests and fixtures.","md",null,{"toc":18},{"title":38,"description":689},"41pwTedGzIMgSU9v8yd3dFl-Z_CkNnbxSO3MkaSEU3Y",[696,698],{"title":34,"path":35,"stem":36,"description":697,"children":-1},"JSON and binary codecs generated from your type, so Date, BigInt, Map and Set survive the round-trip.",{"title":42,"path":43,"stem":44,"description":699,"children":-1},"Type guards and error reports generated from your type at build time.",1781995977801]