[{"data":1,"prerenderedAt":3434},["ShallowReactive",2],{"navigation_docs":3,"-runtypes-ai-integration-friendly-text":399},[4,162,346],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":24},"RPC","icon-park-outline:lightning","\u002Frpc","01.rpc",[10,25,63,77,102,136],{"title":11,"icon":12,"redirect":7,"path":13,"stem":14,"children":15,"page":24},"Introduction","icon-park-outline:home","\u002Frpc\u002Fintroduction","01.rpc\u002F01.introduction",[16,20],{"title":17,"path":18,"stem":19},"Quick Start","\u002Frpc\u002Fintroduction\u002Fquick-start","01.rpc\u002F01.introduction\u002F02.quick-start",{"title":21,"path":22,"stem":23},"Manual Install","\u002Frpc\u002Fintroduction\u002Fmanual-install","01.rpc\u002F01.introduction\u002F03.manual-install",false,{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":24},"Server","icon-park-outline:server","\u002Frpc\u002Fserver","01.rpc\u002F02.server",[31,35,39,43,47,51,55,59],{"title":32,"path":33,"stem":34},"Routes","\u002Frpc\u002Fserver\u002Froutes","01.rpc\u002F02.server\u002F01.routes",{"title":36,"path":37,"stem":38},"Middleware","\u002Frpc\u002Fserver\u002Fmiddleware","01.rpc\u002F02.server\u002F02.middleware",{"title":40,"path":41,"stem":42},"Call Context","\u002Frpc\u002Fserver\u002Fcall-context","01.rpc\u002F02.server\u002F03.call-context",{"title":44,"path":45,"stem":46},"Headers","\u002Frpc\u002Fserver\u002Fheaders","01.rpc\u002F02.server\u002F04.headers",{"title":48,"path":49,"stem":50},"Error Handling","\u002Frpc\u002Fserver\u002Ferror-handling","01.rpc\u002F02.server\u002F05.error-handling",{"title":52,"path":53,"stem":54},"Validation","\u002Frpc\u002Fserver\u002Fvalidation","01.rpc\u002F02.server\u002F06.validation",{"title":56,"path":57,"stem":58},"JSON Round Trip","\u002Frpc\u002Fserver\u002Fjson-round-trip","01.rpc\u002F02.server\u002F07.json-round-trip",{"title":60,"path":61,"stem":62},"Drizzle Tables","\u002Frpc\u002Fserver\u002Fdrizzle-tables","01.rpc\u002F02.server\u002F08.drizzle-tables",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":24},"Middlewares","icon-park-outline:link-one","\u002Frpc\u002Fmiddlewares","01.rpc\u002F03.middlewares",[69,73],{"title":70,"path":71,"stem":72},"fetchMetadata","\u002Frpc\u002Fmiddlewares\u002Ffetch-metadata","01.rpc\u002F03.middlewares\u002F01.fetch-metadata",{"title":74,"path":75,"stem":76},"syncRoutes","\u002Frpc\u002Fmiddlewares\u002Fsync-routes","01.rpc\u002F03.middlewares\u002F02.sync-routes",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":24},"Client","icon-park-outline:computer","\u002Frpc\u002Fclient","01.rpc\u002F04.client",[83,87,91,94,98],{"title":84,"path":85,"stem":86},"Client Overview","\u002Frpc\u002Fclient\u002Fclient-overview","01.rpc\u002F04.client\u002F00.client-overview",{"title":88,"path":89,"stem":90},"Client Middleware","\u002Frpc\u002Fclient\u002Fclient-middleware","01.rpc\u002F04.client\u002F01.client-middleware",{"title":48,"path":92,"stem":93},"\u002Frpc\u002Fclient\u002Ferror-handling","01.rpc\u002F04.client\u002F02.error-handling",{"title":95,"path":96,"stem":97},"Batch Requests","\u002Frpc\u002Fclient\u002Fbatch","01.rpc\u002F04.client\u002F03.batch",{"title":99,"path":100,"stem":101},"Cancellation & Timeouts","\u002Frpc\u002Fclient\u002Fcancellation-timeouts","01.rpc\u002F04.client\u002F04.cancellation-timeouts",{"title":103,"redirect":104,"icon":105,"path":106,"stem":107,"children":108,"page":24},"Platforms","\u002Frpc\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Frpc\u002Fplatforms","01.rpc\u002F06.platforms",[109,112,116,120,124,128,132],{"title":110,"path":104,"stem":111},"Node.js","01.rpc\u002F06.platforms\u002F01.node-js",{"title":113,"path":114,"stem":115},"Bun","\u002Frpc\u002Fplatforms\u002Fbun","01.rpc\u002F06.platforms\u002F02.bun",{"title":117,"path":118,"stem":119},"AWS Lambda","\u002Frpc\u002Fplatforms\u002Faws-lambda","01.rpc\u002F06.platforms\u002F03.aws-lambda",{"title":121,"path":122,"stem":123},"Google Cloud Functions","\u002Frpc\u002Fplatforms\u002Fgoogle-cloud-functions","01.rpc\u002F06.platforms\u002F04.google-cloud-functions",{"title":125,"path":126,"stem":127},"Cloudflare Workers","\u002Frpc\u002Fplatforms\u002Fcloudflare","01.rpc\u002F06.platforms\u002F05.cloudflare",{"title":129,"path":130,"stem":131},"Vercel","\u002Frpc\u002Fplatforms\u002Fvercel","01.rpc\u002F06.platforms\u002F06.vercel",{"title":133,"path":134,"stem":135},"uWebSockets.js","\u002Frpc\u002Fplatforms\u002Fuwebsockets","01.rpc\u002F06.platforms\u002F07.uwebsockets",{"title":137,"icon":138,"path":139,"stem":140,"children":141,"page":24},"Devtools","icon-park-outline:tool","\u002Frpc\u002Fdevtools","01.rpc\u002F07.devtools",[142,146,150,154,158],{"title":143,"path":144,"stem":145},"Linter","\u002Frpc\u002Fdevtools\u002Flinter","01.rpc\u002F07.devtools\u002F01.linter",{"title":147,"path":148,"stem":149},"Vite","\u002Frpc\u002Fdevtools\u002Fvite","01.rpc\u002F07.devtools\u002F02.vite",{"title":151,"path":152,"stem":153},"Next.js","\u002Frpc\u002Fdevtools\u002Fnextjs","01.rpc\u002F07.devtools\u002F03.nextjs",{"title":155,"path":156,"stem":157},"CLI","\u002Frpc\u002Fdevtools\u002Fcli","01.rpc\u002F07.devtools\u002F04.cli",{"title":159,"path":160,"stem":161},"API Types","\u002Frpc\u002Fdevtools\u002Fapi-types","01.rpc\u002F07.devtools\u002F05.api-types",{"title":163,"icon":164,"path":165,"stem":166,"children":167,"page":24},"RunTypes","i-lucide-braces","\u002Fruntypes","02.runtypes",[168,184,224,254,268,290,332],{"title":11,"icon":169,"redirect":165,"path":170,"stem":171,"children":172,"page":24},"i-lucide-rocket","\u002Fruntypes\u002Fintroduction","02.runtypes\u002F01.introduction",[173,177,180],{"title":174,"path":175,"stem":176},"Built on typescript-go","\u002Fruntypes\u002Fintroduction\u002Fbuilt-on-typescript-go","02.runtypes\u002F01.introduction\u002F02.built-on-typescript-go",{"title":17,"path":178,"stem":179},"\u002Fruntypes\u002Fintroduction\u002Fquick-start","02.runtypes\u002F01.introduction\u002F03.quick-start",{"title":181,"path":182,"stem":183},"Configuration","\u002Fruntypes\u002Fintroduction\u002Fconfiguration","02.runtypes\u002F01.introduction\u002F04.configuration",{"title":185,"icon":186,"redirect":187,"path":188,"stem":189,"children":190,"page":24},"Guide","i-lucide-book-open","\u002Fruntypes\u002Fguide\u002Ftype-builders","\u002Fruntypes\u002Fguide","02.runtypes\u002F02.guide",[191,194,198,201,204,208,212,216,220],{"title":192,"path":187,"stem":193},"Types vs Type Builders","02.runtypes\u002F02.guide\u002F01.type-builders",{"title":195,"path":196,"stem":197},"Reflection","\u002Fruntypes\u002Fguide\u002Freflection","02.runtypes\u002F02.guide\u002F02.reflection",{"title":52,"path":199,"stem":200},"\u002Fruntypes\u002Fguide\u002Fvalidation","02.runtypes\u002F02.guide\u002F03.validation",{"title":56,"path":202,"stem":203},"\u002Fruntypes\u002Fguide\u002Fjson-round-trip","02.runtypes\u002F02.guide\u002F04.json-round-trip",{"title":205,"path":206,"stem":207},"Data Mocking","\u002Fruntypes\u002Fguide\u002Fmocking","02.runtypes\u002F02.guide\u002F07.mocking",{"title":209,"path":210,"stem":211},"JSON Schemas","\u002Fruntypes\u002Fguide\u002Fjson-schemas","02.runtypes\u002F02.guide\u002F08.json-schemas",{"title":213,"path":214,"stem":215},"Pure Functions","\u002Fruntypes\u002Fguide\u002Fpure-functions","02.runtypes\u002F02.guide\u002F09.pure-functions",{"title":217,"path":218,"stem":219},"Compiler Markers","\u002Fruntypes\u002Fguide\u002Fcompiler-markers","02.runtypes\u002F02.guide\u002F10.compiler-markers",{"title":221,"path":222,"stem":223},"All Compiled Functions","\u002Fruntypes\u002Fguide\u002Fall-compiled-functions","02.runtypes\u002F02.guide\u002F11.all-compiled-functions",{"title":225,"icon":226,"redirect":227,"path":228,"stem":229,"children":230,"page":24},"Type Formats","i-lucide-shapes","\u002Fruntypes\u002Ftype-formats\u002Foverview","\u002Fruntypes\u002Ftype-formats","02.runtypes\u002F03.type-formats",[231,234,238,242,246,250],{"title":232,"path":227,"stem":233},"Overview","02.runtypes\u002F03.type-formats\u002F01.overview",{"title":235,"path":236,"stem":237},"String Formats","\u002Fruntypes\u002Ftype-formats\u002Fstring","02.runtypes\u002F03.type-formats\u002F02.string",{"title":239,"path":240,"stem":241},"Number Formats","\u002Fruntypes\u002Ftype-formats\u002Fnumber","02.runtypes\u002F03.type-formats\u002F03.number",{"title":243,"path":244,"stem":245},"BigInt Formats","\u002Fruntypes\u002Ftype-formats\u002Fbigint","02.runtypes\u002F03.type-formats\u002F04.bigint",{"title":247,"path":248,"stem":249},"Date and Time Formats","\u002Fruntypes\u002Ftype-formats\u002Fdate-time","02.runtypes\u002F03.type-formats\u002F05.date-time",{"title":251,"path":252,"stem":253},"Collection Formats","\u002Fruntypes\u002Ftype-formats\u002Fcollections","02.runtypes\u002F03.type-formats\u002F06.collections",{"title":255,"icon":256,"redirect":257,"path":258,"stem":259,"children":260,"page":24},"Tooling","i-lucide-wrench","\u002Fruntypes\u002Ftooling\u002Flinting","\u002Fruntypes\u002Ftooling","02.runtypes\u002F04.tooling",[261,264],{"title":262,"path":257,"stem":263},"Linting","02.runtypes\u002F04.tooling\u002F01.linting",{"title":265,"path":266,"stem":267},"Source Conversion","\u002Fruntypes\u002Ftooling\u002Fsource-conversion","02.runtypes\u002F04.tooling\u002F02.source-conversion",{"title":269,"icon":270,"redirect":271,"path":272,"stem":273,"children":274,"page":24},"AI Integration","i-lucide-sparkles","\u002Fruntypes\u002Fai-integration\u002Fworkflow-and-commands","\u002Fruntypes\u002Fai-integration","02.runtypes\u002F05.ai-integration",[275,278,282,286],{"title":276,"path":271,"stem":277},"AI Workflow","02.runtypes\u002F05.ai-integration\u002F01.workflow-and-commands",{"title":279,"path":280,"stem":281},"FriendlyText","\u002Fruntypes\u002Fai-integration\u002Ffriendly-text","02.runtypes\u002F05.ai-integration\u002F02.friendly-text",{"title":283,"path":284,"stem":285},"MockData","\u002Fruntypes\u002Fai-integration\u002Fmock-data","02.runtypes\u002F05.ai-integration\u002F03.mock-data",{"title":287,"path":288,"stem":289},"Translations (i18n)","\u002Fruntypes\u002Fai-integration\u002Fi18n","02.runtypes\u002F05.ai-integration\u002F04.i18n",{"title":291,"icon":292,"redirect":293,"path":294,"stem":295,"children":296,"page":24},"Drizzle ORM","i-lineicons-drizzle","\u002Fruntypes\u002Fdrizzle-orm\u002Fdrizzle-overview","\u002Fruntypes\u002Fdrizzle-orm","02.runtypes\u002F06.drizzle-orm",[297,300,304,308,312,316,320,324,328],{"title":298,"path":293,"stem":299},"Drizzle Overview","02.runtypes\u002F06.drizzle-orm\u002F00.drizzle-overview",{"title":301,"path":302,"stem":303},"Column Formats","\u002Fruntypes\u002Fdrizzle-orm\u002Fcolumn-formats","02.runtypes\u002F06.drizzle-orm\u002F01.column-formats",{"title":305,"path":306,"stem":307},"Views","\u002Fruntypes\u002Fdrizzle-orm\u002Fviews","02.runtypes\u002F06.drizzle-orm\u002F02.views",{"title":309,"path":310,"stem":311},"Indexes and Constraints","\u002Fruntypes\u002Fdrizzle-orm\u002Fconstraints","02.runtypes\u002F06.drizzle-orm\u002F03.constraints",{"title":313,"path":314,"stem":315},"Row Level Security","\u002Fruntypes\u002Fdrizzle-orm\u002Frow-level-security","02.runtypes\u002F06.drizzle-orm\u002F04.row-level-security",{"title":317,"path":318,"stem":319},"Relations","\u002Fruntypes\u002Fdrizzle-orm\u002Frelations","02.runtypes\u002F06.drizzle-orm\u002F05.relations",{"title":321,"path":322,"stem":323},"The Schema File","\u002Fruntypes\u002Fdrizzle-orm\u002Fschema-file","02.runtypes\u002F06.drizzle-orm\u002F06.schema-file",{"title":325,"path":326,"stem":327},"Migrate an Existing Schema","\u002Fruntypes\u002Fdrizzle-orm\u002Fmigrate-an-existing-schema","02.runtypes\u002F06.drizzle-orm\u002F07.migrate-an-existing-schema",{"title":329,"path":330,"stem":331},"Cloudflare D1 and Durable Objects","\u002Fruntypes\u002Fdrizzle-orm\u002Fcloudflare-storage","02.runtypes\u002F06.drizzle-orm\u002F08.cloudflare-storage",{"title":333,"icon":334,"redirect":335,"path":336,"stem":337,"children":338,"page":24},"Diagnostics","i-lucide-triangle-alert","\u002Fruntypes\u002Fdiagnostics\u002Ferror-levels","\u002Fruntypes\u002Fdiagnostics","02.runtypes\u002F08.diagnostics",[339,342],{"title":340,"path":335,"stem":341},"Error Levels","02.runtypes\u002F08.diagnostics\u002F01.error-levels",{"title":343,"path":344,"stem":345},"All Diagnostics","\u002Fruntypes\u002Fdiagnostics\u002Fall-diagnostics","02.runtypes\u002F08.diagnostics\u002F02.all-diagnostics",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":24},"Benchmarks","i-lucide-gauge","\u002Fbenchmarks","03.benchmarks",[352,372],{"title":5,"icon":6,"redirect":353,"path":354,"stem":355,"children":356,"page":24},"\u002Fbenchmarks\u002Frpc\u002Fhello-world","\u002Fbenchmarks\u002Frpc","03.benchmarks\u002F02.rpc",[357,360,364,368],{"title":358,"path":353,"stem":359},"Hello World","03.benchmarks\u002F02.rpc\u002F01.hello-world",{"title":361,"path":362,"stem":363},"Light Validation","\u002Fbenchmarks\u002Frpc\u002Flight-validation","03.benchmarks\u002F02.rpc\u002F02.light-validation",{"title":365,"path":366,"stem":367},"Heavy Validation","\u002Fbenchmarks\u002Frpc\u002Fheavy-validation","03.benchmarks\u002F02.rpc\u002F03.heavy-validation",{"title":369,"path":370,"stem":371},"Payload Sizes","\u002Fbenchmarks\u002Frpc\u002Fpayload-sizes","03.benchmarks\u002F02.rpc\u002F04.payload-sizes",{"title":163,"icon":164,"redirect":373,"path":374,"stem":375,"children":376,"page":24},"\u002Fbenchmarks\u002Fruntypes\u002Fis-valid","\u002Fbenchmarks\u002Fruntypes","03.benchmarks\u002F03.runtypes",[377,380,384,388,392,395],{"title":378,"path":373,"stem":379},"Is Valid","03.benchmarks\u002F03.runtypes\u002F01.is-valid",{"title":381,"path":382,"stem":383},"Is Valid Formats","\u002Fbenchmarks\u002Fruntypes\u002Fis-valid-formats","03.benchmarks\u002F03.runtypes\u002F02.is-valid-formats",{"title":385,"path":386,"stem":387},"Get Errors","\u002Fbenchmarks\u002Fruntypes\u002Fget-errors","03.benchmarks\u002F03.runtypes\u002F03.get-errors",{"title":389,"path":390,"stem":391},"Get Errors Formats","\u002Fbenchmarks\u002Fruntypes\u002Fget-errors-formats","03.benchmarks\u002F03.runtypes\u002F04.get-errors-formats",{"title":56,"path":393,"stem":394},"\u002Fbenchmarks\u002Fruntypes\u002Fjson-round-trip","03.benchmarks\u002F03.runtypes\u002F05.json-round-trip",{"title":396,"path":397,"stem":398},"Type Checking","\u002Fbenchmarks\u002Fruntypes\u002Ftype-checking","03.benchmarks\u002F03.runtypes\u002F07.type-checking",{"id":400,"title":279,"body":401,"description":3428,"extension":3429,"links":3430,"meta":3431,"navigation":525,"path":280,"seo":3432,"stem":281,"__hash__":3433},"docs\u002F02.runtypes\u002F05.ai-integration\u002F02.friendly-text.md",{"type":402,"value":403},"minimark",[404,414,435,440,469,2075,2083,2087,2094,2202,2268,2272,2275,2293,2308,2318,2322,2349,2633,2653,2657,2664,2732,2738,2742,2770,2818,2834,2838,2854,3060,3066,3070,3076,3343,3352,3412,3418,3424],[405,406,407,413],"p",{},[408,409,412],"span",{"className":410},[411],"rt-badge-experimental","Experimental"," The enrichment workflow works today. The generated file shape and the commands may still change between minor versions.",[405,415,416,420,421,425,426,429,430,434],{},[417,418,419],"code",{},"FriendlyText\u003CT>"," gives every field of a type a ",[422,423,424],"strong",{},"label"," and ",[422,427,428],{},"error messages",". You ",[431,432,433],"a",{"href":271},"commit"," the map next to your type, and the compiler checks it against that type on every build. Use it to turn validation errors into messages people can read.",[436,437,439],"h2",{"id":438},"friendlytext-shape","FriendlyText Shape",[405,441,442,443,446,447,450,451,454,455,458,459,425,462,465,466,468],{},"The map mirrors your type, every field included. Every node is ",[417,444,445],{},"{ rt$label, rt$errors, ...fields }",": both ",[417,448,449],{},"rt$"," keys always, then one key per child field. Arrays use ",[417,452,453],{},"rt$items",", tuples ",[417,456,457],{},"rt$slots",", a Map ",[417,460,461],{},"rt$keys",[417,463,464],{},"rt$values",", a Set ",[417,467,464],{},".",[470,471,472,733,1461],"code-group",{},[473,474,480],"pre",{"className":475,"code":476,"filename":477,"language":478,"meta":479,"style":479},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type * as TF from '@mionjs\u002Frun-types\u002Fformats';\n\n\u002F\u002F src\u002Fmodels\u002Fuser.ts\nexport interface User {\n  name: TF.String\u003C{minLength: 2; maxLength: 60}>;\n  age: TF.Number\u003C{min: 0; max: 120}>;\n  isActive: boolean;\n  tags: string[];\n  profile: {\n    email: TF.Email;\n    score: TF.Number\u003C{min: 0; max: 100}>;\n  };\n}\n","Your type","ts","",[417,481,482,520,527,534,551,595,632,645,661,671,688,721,727],{"__ignoreMap":479},[408,483,486,490,493,497,500,504,507,510,514,517],{"class":484,"line":485},"line",1,[408,487,489],{"class":488},"s7zQu","import",[408,491,492],{"class":488}," type",[408,494,496],{"class":495},"sMK4o"," *",[408,498,499],{"class":488}," as",[408,501,503],{"class":502},"sTEyZ"," TF ",[408,505,506],{"class":488},"from",[408,508,509],{"class":495}," '",[408,511,513],{"class":512},"sfazB","@mionjs\u002Frun-types\u002Fformats",[408,515,516],{"class":495},"'",[408,518,519],{"class":495},";\n",[408,521,523],{"class":484,"line":522},2,[408,524,526],{"emptyLinePlaceholder":525},true,"\n",[408,528,530],{"class":484,"line":529},3,[408,531,533],{"class":532},"sHwdD","\u002F\u002F src\u002Fmodels\u002Fuser.ts\n",[408,535,537,540,544,548],{"class":484,"line":536},4,[408,538,539],{"class":488},"export",[408,541,543],{"class":542},"spNyl"," interface",[408,545,547],{"class":546},"sBMFI"," User",[408,549,550],{"class":495}," {\n",[408,552,554,558,561,564,566,569,572,575,577,581,584,587,589,592],{"class":484,"line":553},5,[408,555,557],{"class":556},"swJcz","  name",[408,559,560],{"class":495},":",[408,562,563],{"class":546}," TF",[408,565,468],{"class":495},[408,567,568],{"class":546},"String",[408,570,571],{"class":495},"\u003C{",[408,573,574],{"class":556},"minLength",[408,576,560],{"class":495},[408,578,580],{"class":579},"sbssI"," 2",[408,582,583],{"class":495},";",[408,585,586],{"class":556}," maxLength",[408,588,560],{"class":495},[408,590,591],{"class":579}," 60",[408,593,594],{"class":495},"}>;\n",[408,596,598,601,603,605,607,610,612,615,617,620,622,625,627,630],{"class":484,"line":597},6,[408,599,600],{"class":556},"  age",[408,602,560],{"class":495},[408,604,563],{"class":546},[408,606,468],{"class":495},[408,608,609],{"class":546},"Number",[408,611,571],{"class":495},[408,613,614],{"class":556},"min",[408,616,560],{"class":495},[408,618,619],{"class":579}," 0",[408,621,583],{"class":495},[408,623,624],{"class":556}," max",[408,626,560],{"class":495},[408,628,629],{"class":579}," 120",[408,631,594],{"class":495},[408,633,635,638,640,643],{"class":484,"line":634},7,[408,636,637],{"class":556},"  isActive",[408,639,560],{"class":495},[408,641,642],{"class":546}," boolean",[408,644,519],{"class":495},[408,646,648,651,653,656,659],{"class":484,"line":647},8,[408,649,650],{"class":556},"  tags",[408,652,560],{"class":495},[408,654,655],{"class":546}," string",[408,657,658],{"class":502},"[]",[408,660,519],{"class":495},[408,662,664,667,669],{"class":484,"line":663},9,[408,665,666],{"class":556},"  profile",[408,668,560],{"class":495},[408,670,550],{"class":495},[408,672,674,677,679,681,683,686],{"class":484,"line":673},10,[408,675,676],{"class":556},"    email",[408,678,560],{"class":495},[408,680,563],{"class":546},[408,682,468],{"class":495},[408,684,685],{"class":546},"Email",[408,687,519],{"class":495},[408,689,691,694,696,698,700,702,704,706,708,710,712,714,716,719],{"class":484,"line":690},11,[408,692,693],{"class":556},"    score",[408,695,560],{"class":495},[408,697,563],{"class":546},[408,699,468],{"class":495},[408,701,609],{"class":546},[408,703,571],{"class":495},[408,705,614],{"class":556},[408,707,560],{"class":495},[408,709,619],{"class":579},[408,711,583],{"class":495},[408,713,624],{"class":556},[408,715,560],{"class":495},[408,717,718],{"class":579}," 100",[408,720,594],{"class":495},[408,722,724],{"class":484,"line":723},12,[408,725,726],{"class":495},"  };\n",[408,728,730],{"class":484,"line":729},13,[408,731,732],{"class":495},"}\n",[473,734,737],{"className":475,"code":735,"filename":736,"language":478,"meta":479,"style":479},"import type {FriendlyText} from '@mionjs\u002Frun-types';\nimport type {User} from '.\u002Fuser';\n\n\u002F\u002F @todo: generated skeleton — fill in real data, then delete this line\nexport const friendlyUser: FriendlyText\u003CUser> = {\n  rt$label: '',\n  rt$errors: {type: ''},\n\n  name: {\n    rt$label: '',\n    rt$errors: {\n      type: '',\n      minLength: {one: '', other: ''},\n      maxLength: {one: '', other: ''},\n    },\n  },\n  age: {\n    rt$label: '',\n    rt$errors: {\n      type: '',\n      min: {one: '', other: ''},\n      max: {one: '', other: ''},\n    },\n  },\n  isActive: {rt$label: '', rt$errors: {type: ''}},\n\n  tags: {\n    rt$label: '',\n    rt$errors: {type: ''},\n    rt$items: {rt$label: '', rt$errors: {type: ''}},\n  },\n\n  profile: {\n    \u002F\u002F nested object: same node shape\n    rt$label: '',\n    rt$errors: {type: ''},\n    email: {\n      rt$label: '',\n      rt$errors: {\n        type: '',\n        minLength: {one: '', other: ''},\n        maxLength: {one: '', other: ''},\n        pattern: '',\n      },\n    },\n    score: {\n      rt$label: '',\n      rt$errors: {\n        type: '',\n        min: {one: '', other: ''},\n        max: {one: '', other: ''},\n      },\n    },\n  },\n};\n","Generated by the compiler",[417,738,739,765,789,793,798,826,839,858,862,870,881,890,901,929,955,961,967,976,987,996,1007,1033,1059,1064,1069,1103,1108,1117,1128,1145,1177,1182,1187,1196,1202,1213,1230,1239,1251,1261,1273,1299,1325,1337,1343,1348,1357,1368,1377,1388,1414,1440,1445,1450,1455],{"__ignoreMap":479},[408,740,741,743,745,748,750,753,756,758,761,763],{"class":484,"line":485},[408,742,489],{"class":488},[408,744,492],{"class":488},[408,746,747],{"class":495}," {",[408,749,279],{"class":502},[408,751,752],{"class":495},"}",[408,754,755],{"class":488}," from",[408,757,509],{"class":495},[408,759,760],{"class":512},"@mionjs\u002Frun-types",[408,762,516],{"class":495},[408,764,519],{"class":495},[408,766,767,769,771,773,776,778,780,782,785,787],{"class":484,"line":522},[408,768,489],{"class":488},[408,770,492],{"class":488},[408,772,747],{"class":495},[408,774,775],{"class":502},"User",[408,777,752],{"class":495},[408,779,755],{"class":488},[408,781,509],{"class":495},[408,783,784],{"class":512},".\u002Fuser",[408,786,516],{"class":495},[408,788,519],{"class":495},[408,790,791],{"class":484,"line":529},[408,792,526],{"emptyLinePlaceholder":525},[408,794,795],{"class":484,"line":536},[408,796,797],{"class":532},"\u002F\u002F @todo: generated skeleton — fill in real data, then delete this line\n",[408,799,800,802,805,808,810,813,816,818,821,824],{"class":484,"line":553},[408,801,539],{"class":488},[408,803,804],{"class":542}," const",[408,806,807],{"class":502}," friendlyUser",[408,809,560],{"class":495},[408,811,812],{"class":546}," FriendlyText",[408,814,815],{"class":495},"\u003C",[408,817,775],{"class":546},[408,819,820],{"class":495},">",[408,822,823],{"class":495}," =",[408,825,550],{"class":495},[408,827,828,831,833,836],{"class":484,"line":597},[408,829,830],{"class":556},"  rt$label",[408,832,560],{"class":495},[408,834,835],{"class":495}," ''",[408,837,838],{"class":495},",\n",[408,840,841,844,846,848,851,853,855],{"class":484,"line":634},[408,842,843],{"class":556},"  rt$errors",[408,845,560],{"class":495},[408,847,747],{"class":495},[408,849,850],{"class":556},"type",[408,852,560],{"class":495},[408,854,835],{"class":495},[408,856,857],{"class":495},"},\n",[408,859,860],{"class":484,"line":647},[408,861,526],{"emptyLinePlaceholder":525},[408,863,864,866,868],{"class":484,"line":663},[408,865,557],{"class":556},[408,867,560],{"class":495},[408,869,550],{"class":495},[408,871,872,875,877,879],{"class":484,"line":673},[408,873,874],{"class":556},"    rt$label",[408,876,560],{"class":495},[408,878,835],{"class":495},[408,880,838],{"class":495},[408,882,883,886,888],{"class":484,"line":690},[408,884,885],{"class":556},"    rt$errors",[408,887,560],{"class":495},[408,889,550],{"class":495},[408,891,892,895,897,899],{"class":484,"line":723},[408,893,894],{"class":556},"      type",[408,896,560],{"class":495},[408,898,835],{"class":495},[408,900,838],{"class":495},[408,902,903,906,908,910,913,915,917,920,923,925,927],{"class":484,"line":729},[408,904,905],{"class":556},"      minLength",[408,907,560],{"class":495},[408,909,747],{"class":495},[408,911,912],{"class":556},"one",[408,914,560],{"class":495},[408,916,835],{"class":495},[408,918,919],{"class":495},",",[408,921,922],{"class":556}," other",[408,924,560],{"class":495},[408,926,835],{"class":495},[408,928,857],{"class":495},[408,930,932,935,937,939,941,943,945,947,949,951,953],{"class":484,"line":931},14,[408,933,934],{"class":556},"      maxLength",[408,936,560],{"class":495},[408,938,747],{"class":495},[408,940,912],{"class":556},[408,942,560],{"class":495},[408,944,835],{"class":495},[408,946,919],{"class":495},[408,948,922],{"class":556},[408,950,560],{"class":495},[408,952,835],{"class":495},[408,954,857],{"class":495},[408,956,958],{"class":484,"line":957},15,[408,959,960],{"class":495},"    },\n",[408,962,964],{"class":484,"line":963},16,[408,965,966],{"class":495},"  },\n",[408,968,970,972,974],{"class":484,"line":969},17,[408,971,600],{"class":556},[408,973,560],{"class":495},[408,975,550],{"class":495},[408,977,979,981,983,985],{"class":484,"line":978},18,[408,980,874],{"class":556},[408,982,560],{"class":495},[408,984,835],{"class":495},[408,986,838],{"class":495},[408,988,990,992,994],{"class":484,"line":989},19,[408,991,885],{"class":556},[408,993,560],{"class":495},[408,995,550],{"class":495},[408,997,999,1001,1003,1005],{"class":484,"line":998},20,[408,1000,894],{"class":556},[408,1002,560],{"class":495},[408,1004,835],{"class":495},[408,1006,838],{"class":495},[408,1008,1010,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031],{"class":484,"line":1009},21,[408,1011,1012],{"class":556},"      min",[408,1014,560],{"class":495},[408,1016,747],{"class":495},[408,1018,912],{"class":556},[408,1020,560],{"class":495},[408,1022,835],{"class":495},[408,1024,919],{"class":495},[408,1026,922],{"class":556},[408,1028,560],{"class":495},[408,1030,835],{"class":495},[408,1032,857],{"class":495},[408,1034,1036,1039,1041,1043,1045,1047,1049,1051,1053,1055,1057],{"class":484,"line":1035},22,[408,1037,1038],{"class":556},"      max",[408,1040,560],{"class":495},[408,1042,747],{"class":495},[408,1044,912],{"class":556},[408,1046,560],{"class":495},[408,1048,835],{"class":495},[408,1050,919],{"class":495},[408,1052,922],{"class":556},[408,1054,560],{"class":495},[408,1056,835],{"class":495},[408,1058,857],{"class":495},[408,1060,1062],{"class":484,"line":1061},23,[408,1063,960],{"class":495},[408,1065,1067],{"class":484,"line":1066},24,[408,1068,966],{"class":495},[408,1070,1072,1074,1076,1078,1081,1083,1085,1087,1090,1092,1094,1096,1098,1100],{"class":484,"line":1071},25,[408,1073,637],{"class":556},[408,1075,560],{"class":495},[408,1077,747],{"class":495},[408,1079,1080],{"class":556},"rt$label",[408,1082,560],{"class":495},[408,1084,835],{"class":495},[408,1086,919],{"class":495},[408,1088,1089],{"class":556}," rt$errors",[408,1091,560],{"class":495},[408,1093,747],{"class":495},[408,1095,850],{"class":556},[408,1097,560],{"class":495},[408,1099,835],{"class":495},[408,1101,1102],{"class":495},"}},\n",[408,1104,1106],{"class":484,"line":1105},26,[408,1107,526],{"emptyLinePlaceholder":525},[408,1109,1111,1113,1115],{"class":484,"line":1110},27,[408,1112,650],{"class":556},[408,1114,560],{"class":495},[408,1116,550],{"class":495},[408,1118,1120,1122,1124,1126],{"class":484,"line":1119},28,[408,1121,874],{"class":556},[408,1123,560],{"class":495},[408,1125,835],{"class":495},[408,1127,838],{"class":495},[408,1129,1131,1133,1135,1137,1139,1141,1143],{"class":484,"line":1130},29,[408,1132,885],{"class":556},[408,1134,560],{"class":495},[408,1136,747],{"class":495},[408,1138,850],{"class":556},[408,1140,560],{"class":495},[408,1142,835],{"class":495},[408,1144,857],{"class":495},[408,1146,1148,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175],{"class":484,"line":1147},30,[408,1149,1150],{"class":556},"    rt$items",[408,1152,560],{"class":495},[408,1154,747],{"class":495},[408,1156,1080],{"class":556},[408,1158,560],{"class":495},[408,1160,835],{"class":495},[408,1162,919],{"class":495},[408,1164,1089],{"class":556},[408,1166,560],{"class":495},[408,1168,747],{"class":495},[408,1170,850],{"class":556},[408,1172,560],{"class":495},[408,1174,835],{"class":495},[408,1176,1102],{"class":495},[408,1178,1180],{"class":484,"line":1179},31,[408,1181,966],{"class":495},[408,1183,1185],{"class":484,"line":1184},32,[408,1186,526],{"emptyLinePlaceholder":525},[408,1188,1190,1192,1194],{"class":484,"line":1189},33,[408,1191,666],{"class":556},[408,1193,560],{"class":495},[408,1195,550],{"class":495},[408,1197,1199],{"class":484,"line":1198},34,[408,1200,1201],{"class":532},"    \u002F\u002F nested object: same node shape\n",[408,1203,1205,1207,1209,1211],{"class":484,"line":1204},35,[408,1206,874],{"class":556},[408,1208,560],{"class":495},[408,1210,835],{"class":495},[408,1212,838],{"class":495},[408,1214,1216,1218,1220,1222,1224,1226,1228],{"class":484,"line":1215},36,[408,1217,885],{"class":556},[408,1219,560],{"class":495},[408,1221,747],{"class":495},[408,1223,850],{"class":556},[408,1225,560],{"class":495},[408,1227,835],{"class":495},[408,1229,857],{"class":495},[408,1231,1233,1235,1237],{"class":484,"line":1232},37,[408,1234,676],{"class":556},[408,1236,560],{"class":495},[408,1238,550],{"class":495},[408,1240,1242,1245,1247,1249],{"class":484,"line":1241},38,[408,1243,1244],{"class":556},"      rt$label",[408,1246,560],{"class":495},[408,1248,835],{"class":495},[408,1250,838],{"class":495},[408,1252,1254,1257,1259],{"class":484,"line":1253},39,[408,1255,1256],{"class":556},"      rt$errors",[408,1258,560],{"class":495},[408,1260,550],{"class":495},[408,1262,1264,1267,1269,1271],{"class":484,"line":1263},40,[408,1265,1266],{"class":556},"        type",[408,1268,560],{"class":495},[408,1270,835],{"class":495},[408,1272,838],{"class":495},[408,1274,1276,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297],{"class":484,"line":1275},41,[408,1277,1278],{"class":556},"        minLength",[408,1280,560],{"class":495},[408,1282,747],{"class":495},[408,1284,912],{"class":556},[408,1286,560],{"class":495},[408,1288,835],{"class":495},[408,1290,919],{"class":495},[408,1292,922],{"class":556},[408,1294,560],{"class":495},[408,1296,835],{"class":495},[408,1298,857],{"class":495},[408,1300,1302,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323],{"class":484,"line":1301},42,[408,1303,1304],{"class":556},"        maxLength",[408,1306,560],{"class":495},[408,1308,747],{"class":495},[408,1310,912],{"class":556},[408,1312,560],{"class":495},[408,1314,835],{"class":495},[408,1316,919],{"class":495},[408,1318,922],{"class":556},[408,1320,560],{"class":495},[408,1322,835],{"class":495},[408,1324,857],{"class":495},[408,1326,1328,1331,1333,1335],{"class":484,"line":1327},43,[408,1329,1330],{"class":556},"        pattern",[408,1332,560],{"class":495},[408,1334,835],{"class":495},[408,1336,838],{"class":495},[408,1338,1340],{"class":484,"line":1339},44,[408,1341,1342],{"class":495},"      },\n",[408,1344,1346],{"class":484,"line":1345},45,[408,1347,960],{"class":495},[408,1349,1351,1353,1355],{"class":484,"line":1350},46,[408,1352,693],{"class":556},[408,1354,560],{"class":495},[408,1356,550],{"class":495},[408,1358,1360,1362,1364,1366],{"class":484,"line":1359},47,[408,1361,1244],{"class":556},[408,1363,560],{"class":495},[408,1365,835],{"class":495},[408,1367,838],{"class":495},[408,1369,1371,1373,1375],{"class":484,"line":1370},48,[408,1372,1256],{"class":556},[408,1374,560],{"class":495},[408,1376,550],{"class":495},[408,1378,1380,1382,1384,1386],{"class":484,"line":1379},49,[408,1381,1266],{"class":556},[408,1383,560],{"class":495},[408,1385,835],{"class":495},[408,1387,838],{"class":495},[408,1389,1391,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412],{"class":484,"line":1390},50,[408,1392,1393],{"class":556},"        min",[408,1395,560],{"class":495},[408,1397,747],{"class":495},[408,1399,912],{"class":556},[408,1401,560],{"class":495},[408,1403,835],{"class":495},[408,1405,919],{"class":495},[408,1407,922],{"class":556},[408,1409,560],{"class":495},[408,1411,835],{"class":495},[408,1413,857],{"class":495},[408,1415,1417,1420,1422,1424,1426,1428,1430,1432,1434,1436,1438],{"class":484,"line":1416},51,[408,1418,1419],{"class":556},"        max",[408,1421,560],{"class":495},[408,1423,747],{"class":495},[408,1425,912],{"class":556},[408,1427,560],{"class":495},[408,1429,835],{"class":495},[408,1431,919],{"class":495},[408,1433,922],{"class":556},[408,1435,560],{"class":495},[408,1437,835],{"class":495},[408,1439,857],{"class":495},[408,1441,1443],{"class":484,"line":1442},52,[408,1444,1342],{"class":495},[408,1446,1448],{"class":484,"line":1447},53,[408,1449,960],{"class":495},[408,1451,1453],{"class":484,"line":1452},54,[408,1454,966],{"class":495},[408,1456,1458],{"class":484,"line":1457},55,[408,1459,1460],{"class":495},"};\n",[473,1462,1465],{"className":475,"code":1463,"filename":1464,"language":478,"meta":479,"style":479},"import type {FriendlyText} from '@mionjs\u002Frun-types';\nimport type {User} from '.\u002Fuser';\n\nexport const friendlyUser: FriendlyText\u003CUser> = {\n  rt$label: 'User account',\n  rt$errors: {type: '$[label] must be an object'},\n\n  name: {\n    rt$label: 'Full name',\n    rt$errors: {\n      type: '$[label] must be text',\n      minLength: '$[label] needs at least $[val] characters',\n      maxLength: '$[label] allows at most $[val] characters',\n    },\n  },\n  age: {\n    rt$label: 'Age',\n    rt$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  isActive: {rt$label: 'Active?', rt$errors: {type: ''}},\n\n  tags: {\n    rt$label: 'Tags',\n    rt$errors: {type: ''},\n    rt$items: {rt$label: '', rt$errors: {type: 'each tag must be text'}}, \u002F\u002F element node\n  },\n\n  profile: {\n    \u002F\u002F nested object: same node shape, recursively\n    rt$label: 'Profile',\n    rt$errors: {type: ''},\n    email: {\n      rt$label: 'Email',\n      rt$errors: {\n        type: '',\n        minLength: '',\n        maxLength: '',\n        pattern: 'Enter a valid email address',\n      },\n    },\n    score: {\n      rt$label: 'Score',\n      rt$errors: {type: '', min: 'min $[val]', max: 'max $[val]'},\n    },\n  },\n};\n","Filled by the agent",[417,1466,1467,1489,1511,1515,1537,1552,1573,1577,1585,1600,1608,1623,1638,1653,1657,1661,1669,1684,1692,1707,1722,1737,1741,1745,1780,1784,1792,1807,1823,1862,1866,1870,1878,1883,1898,1914,1922,1936,1944,1954,1964,1974,1989,1993,1997,2005,2020,2063,2067,2071],{"__ignoreMap":479},[408,1468,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487],{"class":484,"line":485},[408,1470,489],{"class":488},[408,1472,492],{"class":488},[408,1474,747],{"class":495},[408,1476,279],{"class":502},[408,1478,752],{"class":495},[408,1480,755],{"class":488},[408,1482,509],{"class":495},[408,1484,760],{"class":512},[408,1486,516],{"class":495},[408,1488,519],{"class":495},[408,1490,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509],{"class":484,"line":522},[408,1492,489],{"class":488},[408,1494,492],{"class":488},[408,1496,747],{"class":495},[408,1498,775],{"class":502},[408,1500,752],{"class":495},[408,1502,755],{"class":488},[408,1504,509],{"class":495},[408,1506,784],{"class":512},[408,1508,516],{"class":495},[408,1510,519],{"class":495},[408,1512,1513],{"class":484,"line":529},[408,1514,526],{"emptyLinePlaceholder":525},[408,1516,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535],{"class":484,"line":536},[408,1518,539],{"class":488},[408,1520,804],{"class":542},[408,1522,807],{"class":502},[408,1524,560],{"class":495},[408,1526,812],{"class":546},[408,1528,815],{"class":495},[408,1530,775],{"class":546},[408,1532,820],{"class":495},[408,1534,823],{"class":495},[408,1536,550],{"class":495},[408,1538,1539,1541,1543,1545,1548,1550],{"class":484,"line":553},[408,1540,830],{"class":556},[408,1542,560],{"class":495},[408,1544,509],{"class":495},[408,1546,1547],{"class":512},"User account",[408,1549,516],{"class":495},[408,1551,838],{"class":495},[408,1553,1554,1556,1558,1560,1562,1564,1566,1569,1571],{"class":484,"line":597},[408,1555,843],{"class":556},[408,1557,560],{"class":495},[408,1559,747],{"class":495},[408,1561,850],{"class":556},[408,1563,560],{"class":495},[408,1565,509],{"class":495},[408,1567,1568],{"class":512},"$[label] must be an object",[408,1570,516],{"class":495},[408,1572,857],{"class":495},[408,1574,1575],{"class":484,"line":634},[408,1576,526],{"emptyLinePlaceholder":525},[408,1578,1579,1581,1583],{"class":484,"line":647},[408,1580,557],{"class":556},[408,1582,560],{"class":495},[408,1584,550],{"class":495},[408,1586,1587,1589,1591,1593,1596,1598],{"class":484,"line":663},[408,1588,874],{"class":556},[408,1590,560],{"class":495},[408,1592,509],{"class":495},[408,1594,1595],{"class":512},"Full name",[408,1597,516],{"class":495},[408,1599,838],{"class":495},[408,1601,1602,1604,1606],{"class":484,"line":673},[408,1603,885],{"class":556},[408,1605,560],{"class":495},[408,1607,550],{"class":495},[408,1609,1610,1612,1614,1616,1619,1621],{"class":484,"line":690},[408,1611,894],{"class":556},[408,1613,560],{"class":495},[408,1615,509],{"class":495},[408,1617,1618],{"class":512},"$[label] must be text",[408,1620,516],{"class":495},[408,1622,838],{"class":495},[408,1624,1625,1627,1629,1631,1634,1636],{"class":484,"line":723},[408,1626,905],{"class":556},[408,1628,560],{"class":495},[408,1630,509],{"class":495},[408,1632,1633],{"class":512},"$[label] needs at least $[val] characters",[408,1635,516],{"class":495},[408,1637,838],{"class":495},[408,1639,1640,1642,1644,1646,1649,1651],{"class":484,"line":729},[408,1641,934],{"class":556},[408,1643,560],{"class":495},[408,1645,509],{"class":495},[408,1647,1648],{"class":512},"$[label] allows at most $[val] characters",[408,1650,516],{"class":495},[408,1652,838],{"class":495},[408,1654,1655],{"class":484,"line":931},[408,1656,960],{"class":495},[408,1658,1659],{"class":484,"line":957},[408,1660,966],{"class":495},[408,1662,1663,1665,1667],{"class":484,"line":963},[408,1664,600],{"class":556},[408,1666,560],{"class":495},[408,1668,550],{"class":495},[408,1670,1671,1673,1675,1677,1680,1682],{"class":484,"line":969},[408,1672,874],{"class":556},[408,1674,560],{"class":495},[408,1676,509],{"class":495},[408,1678,1679],{"class":512},"Age",[408,1681,516],{"class":495},[408,1683,838],{"class":495},[408,1685,1686,1688,1690],{"class":484,"line":978},[408,1687,885],{"class":556},[408,1689,560],{"class":495},[408,1691,550],{"class":495},[408,1693,1694,1696,1698,1700,1703,1705],{"class":484,"line":989},[408,1695,894],{"class":556},[408,1697,560],{"class":495},[408,1699,509],{"class":495},[408,1701,1702],{"class":512},"$[label] must be a number",[408,1704,516],{"class":495},[408,1706,838],{"class":495},[408,1708,1709,1711,1713,1715,1718,1720],{"class":484,"line":998},[408,1710,1012],{"class":556},[408,1712,560],{"class":495},[408,1714,509],{"class":495},[408,1716,1717],{"class":512},"$[label] must be at least $[val]",[408,1719,516],{"class":495},[408,1721,838],{"class":495},[408,1723,1724,1726,1728,1730,1733,1735],{"class":484,"line":1009},[408,1725,1038],{"class":556},[408,1727,560],{"class":495},[408,1729,509],{"class":495},[408,1731,1732],{"class":512},"$[label] must be no more than $[val]",[408,1734,516],{"class":495},[408,1736,838],{"class":495},[408,1738,1739],{"class":484,"line":1035},[408,1740,960],{"class":495},[408,1742,1743],{"class":484,"line":1061},[408,1744,966],{"class":495},[408,1746,1747,1749,1751,1753,1755,1757,1759,1762,1764,1766,1768,1770,1772,1774,1776,1778],{"class":484,"line":1066},[408,1748,637],{"class":556},[408,1750,560],{"class":495},[408,1752,747],{"class":495},[408,1754,1080],{"class":556},[408,1756,560],{"class":495},[408,1758,509],{"class":495},[408,1760,1761],{"class":512},"Active?",[408,1763,516],{"class":495},[408,1765,919],{"class":495},[408,1767,1089],{"class":556},[408,1769,560],{"class":495},[408,1771,747],{"class":495},[408,1773,850],{"class":556},[408,1775,560],{"class":495},[408,1777,835],{"class":495},[408,1779,1102],{"class":495},[408,1781,1782],{"class":484,"line":1071},[408,1783,526],{"emptyLinePlaceholder":525},[408,1785,1786,1788,1790],{"class":484,"line":1105},[408,1787,650],{"class":556},[408,1789,560],{"class":495},[408,1791,550],{"class":495},[408,1793,1794,1796,1798,1800,1803,1805],{"class":484,"line":1110},[408,1795,874],{"class":556},[408,1797,560],{"class":495},[408,1799,509],{"class":495},[408,1801,1802],{"class":512},"Tags",[408,1804,516],{"class":495},[408,1806,838],{"class":495},[408,1808,1809,1811,1813,1815,1817,1819,1821],{"class":484,"line":1119},[408,1810,885],{"class":556},[408,1812,560],{"class":495},[408,1814,747],{"class":495},[408,1816,850],{"class":556},[408,1818,560],{"class":495},[408,1820,835],{"class":495},[408,1822,857],{"class":495},[408,1824,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1854,1856,1859],{"class":484,"line":1130},[408,1826,1150],{"class":556},[408,1828,560],{"class":495},[408,1830,747],{"class":495},[408,1832,1080],{"class":556},[408,1834,560],{"class":495},[408,1836,835],{"class":495},[408,1838,919],{"class":495},[408,1840,1089],{"class":556},[408,1842,560],{"class":495},[408,1844,747],{"class":495},[408,1846,850],{"class":556},[408,1848,560],{"class":495},[408,1850,509],{"class":495},[408,1852,1853],{"class":512},"each tag must be text",[408,1855,516],{"class":495},[408,1857,1858],{"class":495},"}},",[408,1860,1861],{"class":532}," \u002F\u002F element node\n",[408,1863,1864],{"class":484,"line":1147},[408,1865,966],{"class":495},[408,1867,1868],{"class":484,"line":1179},[408,1869,526],{"emptyLinePlaceholder":525},[408,1871,1872,1874,1876],{"class":484,"line":1184},[408,1873,666],{"class":556},[408,1875,560],{"class":495},[408,1877,550],{"class":495},[408,1879,1880],{"class":484,"line":1189},[408,1881,1882],{"class":532},"    \u002F\u002F nested object: same node shape, recursively\n",[408,1884,1885,1887,1889,1891,1894,1896],{"class":484,"line":1198},[408,1886,874],{"class":556},[408,1888,560],{"class":495},[408,1890,509],{"class":495},[408,1892,1893],{"class":512},"Profile",[408,1895,516],{"class":495},[408,1897,838],{"class":495},[408,1899,1900,1902,1904,1906,1908,1910,1912],{"class":484,"line":1204},[408,1901,885],{"class":556},[408,1903,560],{"class":495},[408,1905,747],{"class":495},[408,1907,850],{"class":556},[408,1909,560],{"class":495},[408,1911,835],{"class":495},[408,1913,857],{"class":495},[408,1915,1916,1918,1920],{"class":484,"line":1215},[408,1917,676],{"class":556},[408,1919,560],{"class":495},[408,1921,550],{"class":495},[408,1923,1924,1926,1928,1930,1932,1934],{"class":484,"line":1232},[408,1925,1244],{"class":556},[408,1927,560],{"class":495},[408,1929,509],{"class":495},[408,1931,685],{"class":512},[408,1933,516],{"class":495},[408,1935,838],{"class":495},[408,1937,1938,1940,1942],{"class":484,"line":1241},[408,1939,1256],{"class":556},[408,1941,560],{"class":495},[408,1943,550],{"class":495},[408,1945,1946,1948,1950,1952],{"class":484,"line":1253},[408,1947,1266],{"class":556},[408,1949,560],{"class":495},[408,1951,835],{"class":495},[408,1953,838],{"class":495},[408,1955,1956,1958,1960,1962],{"class":484,"line":1263},[408,1957,1278],{"class":556},[408,1959,560],{"class":495},[408,1961,835],{"class":495},[408,1963,838],{"class":495},[408,1965,1966,1968,1970,1972],{"class":484,"line":1275},[408,1967,1304],{"class":556},[408,1969,560],{"class":495},[408,1971,835],{"class":495},[408,1973,838],{"class":495},[408,1975,1976,1978,1980,1982,1985,1987],{"class":484,"line":1301},[408,1977,1330],{"class":556},[408,1979,560],{"class":495},[408,1981,509],{"class":495},[408,1983,1984],{"class":512},"Enter a valid email address",[408,1986,516],{"class":495},[408,1988,838],{"class":495},[408,1990,1991],{"class":484,"line":1327},[408,1992,1342],{"class":495},[408,1994,1995],{"class":484,"line":1339},[408,1996,960],{"class":495},[408,1998,1999,2001,2003],{"class":484,"line":1345},[408,2000,693],{"class":556},[408,2002,560],{"class":495},[408,2004,550],{"class":495},[408,2006,2007,2009,2011,2013,2016,2018],{"class":484,"line":1350},[408,2008,1244],{"class":556},[408,2010,560],{"class":495},[408,2012,509],{"class":495},[408,2014,2015],{"class":512},"Score",[408,2017,516],{"class":495},[408,2019,838],{"class":495},[408,2021,2022,2024,2026,2028,2030,2032,2034,2036,2039,2041,2043,2046,2048,2050,2052,2054,2056,2059,2061],{"class":484,"line":1359},[408,2023,1256],{"class":556},[408,2025,560],{"class":495},[408,2027,747],{"class":495},[408,2029,850],{"class":556},[408,2031,560],{"class":495},[408,2033,835],{"class":495},[408,2035,919],{"class":495},[408,2037,2038],{"class":556}," min",[408,2040,560],{"class":495},[408,2042,509],{"class":495},[408,2044,2045],{"class":512},"min $[val]",[408,2047,516],{"class":495},[408,2049,919],{"class":495},[408,2051,624],{"class":556},[408,2053,560],{"class":495},[408,2055,509],{"class":495},[408,2057,2058],{"class":512},"max $[val]",[408,2060,516],{"class":495},[408,2062,857],{"class":495},[408,2064,2065],{"class":484,"line":1370},[408,2066,960],{"class":495},[408,2068,2069],{"class":484,"line":1379},[408,2070,966],{"class":495},[408,2072,2073],{"class":484,"line":1390},[408,2074,1460],{"class":495},[2076,2077,2078,2079,2082],"tip",{},"A blank string means \"no custom text here\" and renders the fallback, but ",[417,2080,2081],{},"--require-complete"," still fails on it. Never delete a key: the next sync adds it back.",[436,2084,2086],{"id":2085},"keeping-friendlytext-in-sync","Keeping FriendlyText in Sync",[405,2088,2089,2090,2093],{},"When your type changes, ",[417,2091,2092],{},"enrich --update"," re-syncs the map and keeps every label and message you wrote. Text an edit would throw away is kept as a comment:",[473,2095,2097],{"className":475,"code":2096,"language":478,"meta":479,"style":479},"export const friendlyUser: FriendlyText\u003CUser> = {\n  rt$label: 'User account',\n  rt$errors: { type: '' },\n  name: { rt$label: 'Full name', rt$errors: { type: '' } },\n  \u002F* @rtOrphanChild isActive: { rt$label: 'Active?', rt$errors: { type: '' } }, *\u002F   \u002F\u002F you removed isActive\n};\n",[417,2098,2099,2121,2135,2152,2190,2198],{"__ignoreMap":479},[408,2100,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119],{"class":484,"line":485},[408,2102,539],{"class":488},[408,2104,804],{"class":542},[408,2106,807],{"class":502},[408,2108,560],{"class":495},[408,2110,812],{"class":546},[408,2112,815],{"class":495},[408,2114,775],{"class":546},[408,2116,820],{"class":495},[408,2118,823],{"class":495},[408,2120,550],{"class":495},[408,2122,2123,2125,2127,2129,2131,2133],{"class":484,"line":522},[408,2124,830],{"class":556},[408,2126,560],{"class":495},[408,2128,509],{"class":495},[408,2130,1547],{"class":512},[408,2132,516],{"class":495},[408,2134,838],{"class":495},[408,2136,2137,2139,2141,2143,2145,2147,2149],{"class":484,"line":529},[408,2138,843],{"class":556},[408,2140,560],{"class":495},[408,2142,747],{"class":495},[408,2144,492],{"class":556},[408,2146,560],{"class":495},[408,2148,835],{"class":495},[408,2150,2151],{"class":495}," },\n",[408,2153,2154,2156,2158,2160,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2188],{"class":484,"line":536},[408,2155,557],{"class":556},[408,2157,560],{"class":495},[408,2159,747],{"class":495},[408,2161,2162],{"class":556}," rt$label",[408,2164,560],{"class":495},[408,2166,509],{"class":495},[408,2168,1595],{"class":512},[408,2170,516],{"class":495},[408,2172,919],{"class":495},[408,2174,1089],{"class":556},[408,2176,560],{"class":495},[408,2178,747],{"class":495},[408,2180,492],{"class":556},[408,2182,560],{"class":495},[408,2184,835],{"class":495},[408,2186,2187],{"class":495}," }",[408,2189,2151],{"class":495},[408,2191,2192,2195],{"class":484,"line":553},[408,2193,2194],{"class":532},"  \u002F* @rtOrphanChild isActive: { rt$label: 'Active?', rt$errors: { type: '' } }, *\u002F",[408,2196,2197],{"class":532},"   \u002F\u002F you removed isActive\n",[408,2199,2200],{"class":484,"line":597},[408,2201,1460],{"class":495},[2203,2204,2205,2218],"table",{},[2206,2207,2208],"thead",{},[2209,2210,2211,2215],"tr",{},[2212,2213,2214],"th",{},"The edit",[2212,2216,2217],{},"What happens to your text",[2219,2220,2221,2230,2241,2249,2257],"tbody",{},[2209,2222,2223,2227],{},[2224,2225,2226],"td",{},"Rename a field or a whole type",[2224,2228,2229],{},"it follows the field, untouched",[2209,2231,2232,2235],{},[2224,2233,2234],{},"Remove a field",[2224,2236,2237,2238],{},"its node is kept as a comment marked ",[417,2239,2240],{},"@rtOrphanChild",[2209,2242,2243,2246],{},[2224,2244,2245],{},"Change a field's type",[2224,2247,2248],{},"the label always survives, and only the messages the new type no longer declares are kept as comments",[2209,2250,2251,2254],{},[2224,2252,2253],{},"Change a field to a different shape (a number becomes an array of objects)",[2224,2255,2256],{},"the whole old node is kept as a comment and a fresh blank takes its place",[2209,2258,2259,2262],{},[2224,2260,2261],{},"Delete a whole type",[2224,2263,2264,2265],{},"its entire map is kept as a comment marked ",[417,2266,2267],{},"@rtOrphan",[436,2269,2271],{"id":2270},"pruning-comments-left-by-removed-fields","Pruning Comments Left by Removed Fields",[405,2273,2274],{},"Comments left by a removed field or type stay until a prune clears them all at once.",[473,2276,2280],{"className":2277,"code":2278,"language":2279,"meta":479,"style":479},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mion enrich --prune\n","bash",[417,2281,2282],{"__ignoreMap":479},[408,2283,2284,2287,2290],{"class":484,"line":485},[408,2285,2286],{"class":546},"mion",[408,2288,2289],{"class":512}," enrich",[408,2291,2292],{"class":512}," --prune\n",[2076,2294,2295,2296,425,2298,2300,2301,2304,2305,2307],{},"Prune removes only the ",[417,2297,2267],{},[417,2299,2240],{}," comments, never a live field or a ",[417,2302,2303],{},"@todo"," blank. Bring a removed field or type back and the next ",[417,2306,2092],{}," restores its text.",[2309,2310,2311,2314,2315,468],"note",{},[417,2312,2313],{},"MockData\u003CT>"," works the same: a removed field's sample pool is kept as a comment until ",[417,2316,2317],{},"enrich --prune",[436,2319,2321],{"id":2320},"error-message-keys","Error Message Keys",[405,2323,2324,2325,2328,2329,2332,2333,2336,2337,2340,2341,2344,2345,2348],{},"Each ",[417,2326,2327],{},"rt$errors"," key names the rule the value broke, and params that never fail (such as ",[417,2330,2331],{},"float",", ",[417,2334,2335],{},"isCurrency"," and the ",[417,2338,2339],{},"transform"," block) get no key. Your editor accepts only keys the field's format can fail on, so a typo shows right away. ",[417,2342,2343],{},"mion enrich --no-emit"," warns about a missing key (enrich-text-missing-message) or one the field can never fail on (enrich-text-unknown-error-key), and ",[417,2346,2347],{},"--update"," adds missing keys as blanks.",[2203,2350,2351,2369],{},[2206,2352,2353],{},[2209,2354,2355,2358,2363],{},[2212,2356,2357],{},"Failure",[2212,2359,2360,2362],{},[417,2361,2327],{}," key",[2212,2364,2365,2368],{},[417,2366,2367],{},"$[val]"," resolves to",[2219,2370,2371,2383,2410,2423,2449,2473,2489,2505,2525,2543,2555,2568,2586,2600,2618],{},[2209,2372,2373,2376,2380],{},[2224,2374,2375],{},"base type-shape (wrong kind)",[2224,2377,2378],{},[417,2379,850],{},[2224,2381,2382],{},"n\u002Fa",[2209,2384,2385,2394,2400],{},[2224,2386,2387,2388,2390,2391],{},"string ",[417,2389,574],{}," \u002F ",[417,2392,2393],{},"maxLength",[2224,2395,2396,2390,2398],{},[417,2397,574],{},[417,2399,2393],{},[2224,2401,2402,2403,2332,2406,2409],{},"the bound (",[417,2404,2405],{},"2",[417,2407,2408],{},"60",")",[2209,2411,2412,2417,2421],{},[2224,2413,2387,2414],{},[417,2415,2416],{},"pattern",[2224,2418,2419],{},[417,2420,2416],{},[2224,2422,2382],{},[2209,2424,2425,2440,2446],{},[2224,2426,2427,2428,2390,2430,2433,2434,2390,2437,2409],{},"number ",[417,2429,614],{},[417,2431,2432],{},"max"," (",[417,2435,2436],{},"minimum",[417,2438,2439],{},"maximum",[2224,2441,2442,2390,2444],{},[417,2443,614],{},[417,2445,2432],{},[2224,2447,2448],{},"the bound",[2209,2450,2451,2465,2471],{},[2224,2452,2427,2453,2390,2456,2433,2459,2390,2462,2409],{},[417,2454,2455],{},"lt",[417,2457,2458],{},"gt",[417,2460,2461],{},"exclusiveMaximum",[417,2463,2464],{},"exclusiveMinimum",[2224,2466,2467,2390,2469],{},[417,2468,2455],{},[417,2470,2458],{},[2224,2472,2448],{},[2209,2474,2475,2480,2484],{},[2224,2476,2427,2477],{},[417,2478,2479],{},"integer",[2224,2481,2482],{},[417,2483,2479],{},[2224,2485,2486],{},[417,2487,2488],{},"true",[2209,2490,2491,2494,2499],{},[2224,2492,2493],{},"date or time in the wrong layout",[2224,2495,2496],{},[417,2497,2498],{},"format",[2224,2500,2501,2502,2409],{},"the layout (",[417,2503,2504],{},"'ISO'",[2209,2506,2507,2517,2523],{},[2224,2508,2509,2510,2390,2513,2516],{},"date-time ",[417,2511,2512],{},"date",[417,2514,2515],{},"time"," part",[2224,2518,2519,2390,2521],{},[417,2520,2512],{},[417,2522,2515],{},[2224,2524,2382],{},[2209,2526,2527,2533,2538],{},[2224,2528,2529,2532],{},[417,2530,2531],{},"uuid"," or IP version",[2224,2534,2535],{},[417,2536,2537],{},"version",[2224,2539,2540],{},[417,2541,2542],{},"'4'",[2209,2544,2545,2548,2553],{},[2224,2546,2547],{},"credit card format or checksum",[2224,2549,2550],{},[417,2551,2552],{},"creditCard",[2224,2554,2382],{},[2209,2556,2557,2560,2565],{},[2224,2558,2559],{},"credit card network not allowed",[2224,2561,2562],{},[417,2563,2564],{},"networks",[2224,2566,2567],{},"the allowed list",[2209,2569,2570,2579,2584],{},[2224,2571,2572,2573,2332,2576,2409],{},"email address (",[417,2574,2575],{},"EmailAddress",[417,2577,2578],{},"IdnEmail",[2224,2580,2581],{},[417,2582,2583],{},"emailRfc",[2224,2585,2382],{},[2209,2587,2588,2594,2598],{},[2224,2589,2590,2591],{},"email with no ",[417,2592,2593],{},"@",[2224,2595,2596],{},[417,2597,2593],{},[2224,2599,2382],{},[2209,2601,2602,2611,2616],{},[2224,2603,2604,2605,2332,2608,2409],{},"host name (",[417,2606,2607],{},"Hostname",[417,2609,2610],{},"IdnHostname",[2224,2612,2613],{},[417,2614,2615],{},"idna",[2224,2617,2382],{},[2209,2619,2620,2626,2631],{},[2224,2621,2622,2623],{},"domain label starts or ends with ",[417,2624,2625],{},"-",[2224,2627,2628],{},[417,2629,2630],{},"hyphen",[2224,2632,2382],{},[2309,2634,2635,2636,2639,2640,425,2642,2644,2645,2648,2649,2652],{},"Errors ",[422,2637,2638],{},"accumulate",": a value that breaks both ",[417,2641,574],{},[417,2643,2416],{}," gets ",[422,2646,2647],{},"one message per broken rule",". For one message per field, use ",[417,2650,2651],{},"rt$default"," below.",[436,2654,2656],{"id":2655},"message-placeholders","Message Placeholders",[405,2658,2659,2660,2663],{},"The compiler checks these ",[417,2661,2662],{},"$[…]"," tokens and the renderer fills them in.",[2203,2665,2666,2676],{},[2206,2667,2668],{},[2209,2669,2670,2673],{},[2212,2671,2672],{},"Token",[2212,2674,2675],{},"Resolves to",[2219,2677,2678,2691,2706,2719],{},[2209,2679,2680,2685],{},[2224,2681,2682],{},[417,2683,2684],{},"$[label]",[2224,2686,2687,2688,2690],{},"the node's ",[417,2689,1080],{},", falling back to the raw field name",[2209,2692,2693,2697],{},[2224,2694,2695],{},[417,2696,2367],{},[2224,2698,2699,2700,2702,2703,2409],{},"the failed constraint's bound (e.g. ",[417,2701,2405],{}," for ",[417,2704,2705],{},"minLength: 2",[2209,2707,2708,2713],{},[2224,2709,2710],{},[417,2711,2712],{},"$[path]",[2224,2714,2715,2716,2409],{},"the dotted path to the field (",[417,2717,2718],{},"profile.email",[2209,2720,2721,2726],{},[2224,2722,2723],{},[417,2724,2725],{},"$[index]",[2224,2727,2728,2729,2731],{},"the array element index, for ",[417,2730,453],{}," failures",[2309,2733,2734,2737],{},[417,2735,2736],{},"$[value]"," (the received value) is not supported yet: the error does not carry the input.",[436,2739,2741],{"id":2740},"plural-messages","Plural Messages",[405,2743,2744,2745,2332,2747,2332,2749,2332,2751,2332,2753,2332,2755,2757,2758,2761,2762,2765,2766,2769],{},"A count rule (",[417,2746,574],{},[417,2748,2393],{},[417,2750,614],{},[417,2752,2432],{},[417,2754,2455],{},[417,2756,2458],{},") can hold one wording per plural form instead of a single string. The form follows the broken limit (the ",[417,2759,2760],{},"3"," in ",[417,2763,2764],{},"minLength: 3","), and only ",[417,2767,2768],{},"other"," is required.",[473,2771,2773],{"className":475,"code":2772,"language":478,"meta":479,"style":479},"minLength: {\n  one: '$[label] needs at least $[val] character',\n  other: '$[label] needs at least $[val] characters',\n},\n",[417,2774,2775,2783,2799,2814],{"__ignoreMap":479},[408,2776,2777,2779,2781],{"class":484,"line":485},[408,2778,574],{"class":546},[408,2780,560],{"class":495},[408,2782,550],{"class":495},[408,2784,2785,2788,2790,2792,2795,2797],{"class":484,"line":522},[408,2786,2787],{"class":546},"  one",[408,2789,560],{"class":495},[408,2791,509],{"class":495},[408,2793,2794],{"class":512},"$[label] needs at least $[val] character",[408,2796,516],{"class":495},[408,2798,838],{"class":495},[408,2800,2801,2804,2806,2808,2810,2812],{"class":484,"line":529},[408,2802,2803],{"class":546},"  other",[408,2805,560],{"class":495},[408,2807,509],{"class":495},[408,2809,1633],{"class":512},[408,2811,516],{"class":495},[408,2813,838],{"class":495},[408,2815,2816],{"class":484,"line":536},[408,2817,857],{"class":495},[405,2819,2820,2821,425,2823,2825,2826,2828,2829,2332,2831,2833],{},"The scaffold has the forms each file's language needs (English gets ",[417,2822,912],{},[417,2824,2768],{},", see ",[431,2827,287],{"href":288},"). Other rules (",[417,2830,850],{},[417,2832,2416],{},", and the rest) stay a single string, and a single string still works on a count rule when one wording fits every count.",[436,2835,2837],{"id":2836},"one-message-per-field","One Message per Field",[405,2839,2840,2841,2843,2844,2846,2847,2849,2850,2853],{},"Make ",[417,2842,2651],{}," the only key in ",[417,2845,2327],{}," and it becomes the message for every failure of that field. A node has either ",[417,2848,2651],{}," or the per-rule keys, never both, so each field picks its own mode. It is ",[431,2851,2852],{"href":288},"translatable"," like any other message.",[473,2855,2857],{"className":475,"code":2856,"language":478,"meta":479,"style":479},"import type * as TF from '@mionjs\u002Frun-types\u002Fformats';\nimport type {FriendlyText} from '@mionjs\u002Frun-types';\n\ninterface Signup {\n  name: TF.String\u003C{minLength: 2; maxLength: 60}>;\n}\n\nexport const friendlySignup: FriendlyText\u003CSignup> = {\n  rt$label: 'Signup',\n  rt$errors: {type: ''},\n  name: {\n    rt$label: 'Full name',\n    rt$errors: {rt$default: 'Enter a name between 2 and 60 characters'},\n  },\n};\n",[417,2858,2859,2881,2903,2907,2917,2947,2951,2955,2979,2993,3009,3017,3031,3052,3056],{"__ignoreMap":479},[408,2860,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879],{"class":484,"line":485},[408,2862,489],{"class":488},[408,2864,492],{"class":488},[408,2866,496],{"class":495},[408,2868,499],{"class":488},[408,2870,503],{"class":502},[408,2872,506],{"class":488},[408,2874,509],{"class":495},[408,2876,513],{"class":512},[408,2878,516],{"class":495},[408,2880,519],{"class":495},[408,2882,2883,2885,2887,2889,2891,2893,2895,2897,2899,2901],{"class":484,"line":522},[408,2884,489],{"class":488},[408,2886,492],{"class":488},[408,2888,747],{"class":495},[408,2890,279],{"class":502},[408,2892,752],{"class":495},[408,2894,755],{"class":488},[408,2896,509],{"class":495},[408,2898,760],{"class":512},[408,2900,516],{"class":495},[408,2902,519],{"class":495},[408,2904,2905],{"class":484,"line":529},[408,2906,526],{"emptyLinePlaceholder":525},[408,2908,2909,2912,2915],{"class":484,"line":536},[408,2910,2911],{"class":542},"interface",[408,2913,2914],{"class":546}," Signup",[408,2916,550],{"class":495},[408,2918,2919,2921,2923,2925,2927,2929,2931,2933,2935,2937,2939,2941,2943,2945],{"class":484,"line":553},[408,2920,557],{"class":556},[408,2922,560],{"class":495},[408,2924,563],{"class":546},[408,2926,468],{"class":495},[408,2928,568],{"class":546},[408,2930,571],{"class":495},[408,2932,574],{"class":556},[408,2934,560],{"class":495},[408,2936,580],{"class":579},[408,2938,583],{"class":495},[408,2940,586],{"class":556},[408,2942,560],{"class":495},[408,2944,591],{"class":579},[408,2946,594],{"class":495},[408,2948,2949],{"class":484,"line":597},[408,2950,732],{"class":495},[408,2952,2953],{"class":484,"line":634},[408,2954,526],{"emptyLinePlaceholder":525},[408,2956,2957,2959,2961,2964,2966,2968,2970,2973,2975,2977],{"class":484,"line":647},[408,2958,539],{"class":488},[408,2960,804],{"class":542},[408,2962,2963],{"class":502}," friendlySignup",[408,2965,560],{"class":495},[408,2967,812],{"class":546},[408,2969,815],{"class":495},[408,2971,2972],{"class":546},"Signup",[408,2974,820],{"class":495},[408,2976,823],{"class":495},[408,2978,550],{"class":495},[408,2980,2981,2983,2985,2987,2989,2991],{"class":484,"line":663},[408,2982,830],{"class":556},[408,2984,560],{"class":495},[408,2986,509],{"class":495},[408,2988,2972],{"class":512},[408,2990,516],{"class":495},[408,2992,838],{"class":495},[408,2994,2995,2997,2999,3001,3003,3005,3007],{"class":484,"line":673},[408,2996,843],{"class":556},[408,2998,560],{"class":495},[408,3000,747],{"class":495},[408,3002,850],{"class":556},[408,3004,560],{"class":495},[408,3006,835],{"class":495},[408,3008,857],{"class":495},[408,3010,3011,3013,3015],{"class":484,"line":690},[408,3012,557],{"class":556},[408,3014,560],{"class":495},[408,3016,550],{"class":495},[408,3018,3019,3021,3023,3025,3027,3029],{"class":484,"line":723},[408,3020,874],{"class":556},[408,3022,560],{"class":495},[408,3024,509],{"class":495},[408,3026,1595],{"class":512},[408,3028,516],{"class":495},[408,3030,838],{"class":495},[408,3032,3033,3035,3037,3039,3041,3043,3045,3048,3050],{"class":484,"line":729},[408,3034,885],{"class":556},[408,3036,560],{"class":495},[408,3038,747],{"class":495},[408,3040,2651],{"class":556},[408,3042,560],{"class":495},[408,3044,509],{"class":495},[408,3046,3047],{"class":512},"Enter a name between 2 and 60 characters",[408,3049,516],{"class":495},[408,3051,857],{"class":495},[408,3053,3054],{"class":484,"line":931},[408,3055,966],{"class":495},[408,3057,3058],{"class":484,"line":957},[408,3059,1460],{"class":495},[2076,3061,3062,3063,3065],{},"New nodes are always scaffolded with per-rule keys. Switch a node to ",[417,3064,2651],{}," by hand and every later sync keeps it.",[436,3067,3069],{"id":3068},"rendering-messages","Rendering Messages",[405,3071,3072,3075],{},[417,3073,3074],{},"createFriendlyText\u003CT>(map)"," returns a renderer with two methods. It needs only the map and the errors.",[473,3077,3079],{"className":475,"code":3078,"language":478,"meta":479,"style":479},"import {\n  createFriendlyText,\n  createGetValidationErrorsFn,\n} from '@mionjs\u002Frun-types';\nimport type {User} from '.\u002Fuser';\nimport {friendlyUser} from '.\u002Ffriendly-user';\n\nconst getUserErrors = createGetValidationErrorsFn\u003CUser>();\nconst friendly = createFriendlyText\u003CUser>(friendlyUser);\n\n\u002F\u002F label(path): dotted string or a raw path-segment array\nfriendly.label('profile.email');\n\u002F\u002F → 'Email'\n\n\u002F\u002F errors(errs): render a createGetValidationErrorsFn result into messages\nconst badInput: unknown = {name: 'A', age: 200, profile: {email: 'nope'}};\nfriendly.errors(getUserErrors(badInput));\n\u002F\u002F → [{ path: 'profile.email', label: 'Email', message: 'Enter a valid email address' }, …]\n",[417,3080,3081,3087,3094,3101,3115,3137,3159,3163,3189,3212,3216,3221,3243,3248,3252,3257,3319,3338],{"__ignoreMap":479},[408,3082,3083,3085],{"class":484,"line":485},[408,3084,489],{"class":488},[408,3086,550],{"class":495},[408,3088,3089,3092],{"class":484,"line":522},[408,3090,3091],{"class":502},"  createFriendlyText",[408,3093,838],{"class":495},[408,3095,3096,3099],{"class":484,"line":529},[408,3097,3098],{"class":502},"  createGetValidationErrorsFn",[408,3100,838],{"class":495},[408,3102,3103,3105,3107,3109,3111,3113],{"class":484,"line":536},[408,3104,752],{"class":495},[408,3106,755],{"class":488},[408,3108,509],{"class":495},[408,3110,760],{"class":512},[408,3112,516],{"class":495},[408,3114,519],{"class":495},[408,3116,3117,3119,3121,3123,3125,3127,3129,3131,3133,3135],{"class":484,"line":553},[408,3118,489],{"class":488},[408,3120,492],{"class":488},[408,3122,747],{"class":495},[408,3124,775],{"class":502},[408,3126,752],{"class":495},[408,3128,755],{"class":488},[408,3130,509],{"class":495},[408,3132,784],{"class":512},[408,3134,516],{"class":495},[408,3136,519],{"class":495},[408,3138,3139,3141,3143,3146,3148,3150,3152,3155,3157],{"class":484,"line":597},[408,3140,489],{"class":488},[408,3142,747],{"class":495},[408,3144,3145],{"class":502},"friendlyUser",[408,3147,752],{"class":495},[408,3149,755],{"class":488},[408,3151,509],{"class":495},[408,3153,3154],{"class":512},".\u002Ffriendly-user",[408,3156,516],{"class":495},[408,3158,519],{"class":495},[408,3160,3161],{"class":484,"line":634},[408,3162,526],{"emptyLinePlaceholder":525},[408,3164,3165,3168,3171,3174,3178,3180,3182,3184,3187],{"class":484,"line":647},[408,3166,3167],{"class":542},"const",[408,3169,3170],{"class":502}," getUserErrors ",[408,3172,3173],{"class":495},"=",[408,3175,3177],{"class":3176},"s2Zo4"," createGetValidationErrorsFn",[408,3179,815],{"class":495},[408,3181,775],{"class":546},[408,3183,820],{"class":495},[408,3185,3186],{"class":502},"()",[408,3188,519],{"class":495},[408,3190,3191,3193,3196,3198,3201,3203,3205,3207,3210],{"class":484,"line":663},[408,3192,3167],{"class":542},[408,3194,3195],{"class":502}," friendly ",[408,3197,3173],{"class":495},[408,3199,3200],{"class":3176}," createFriendlyText",[408,3202,815],{"class":495},[408,3204,775],{"class":546},[408,3206,820],{"class":495},[408,3208,3209],{"class":502},"(friendlyUser)",[408,3211,519],{"class":495},[408,3213,3214],{"class":484,"line":673},[408,3215,526],{"emptyLinePlaceholder":525},[408,3217,3218],{"class":484,"line":690},[408,3219,3220],{"class":532},"\u002F\u002F label(path): dotted string or a raw path-segment array\n",[408,3222,3223,3226,3228,3230,3233,3235,3237,3239,3241],{"class":484,"line":723},[408,3224,3225],{"class":502},"friendly",[408,3227,468],{"class":495},[408,3229,424],{"class":3176},[408,3231,3232],{"class":502},"(",[408,3234,516],{"class":495},[408,3236,2718],{"class":512},[408,3238,516],{"class":495},[408,3240,2409],{"class":502},[408,3242,519],{"class":495},[408,3244,3245],{"class":484,"line":729},[408,3246,3247],{"class":532},"\u002F\u002F → 'Email'\n",[408,3249,3250],{"class":484,"line":931},[408,3251,526],{"emptyLinePlaceholder":525},[408,3253,3254],{"class":484,"line":957},[408,3255,3256],{"class":532},"\u002F\u002F errors(errs): render a createGetValidationErrorsFn result into messages\n",[408,3258,3259,3261,3264,3266,3269,3271,3273,3276,3278,3280,3283,3285,3287,3290,3292,3295,3297,3300,3302,3304,3307,3309,3311,3314,3316],{"class":484,"line":963},[408,3260,3167],{"class":542},[408,3262,3263],{"class":502}," badInput",[408,3265,560],{"class":495},[408,3267,3268],{"class":546}," unknown",[408,3270,823],{"class":495},[408,3272,747],{"class":495},[408,3274,3275],{"class":556},"name",[408,3277,560],{"class":495},[408,3279,509],{"class":495},[408,3281,3282],{"class":512},"A",[408,3284,516],{"class":495},[408,3286,919],{"class":495},[408,3288,3289],{"class":556}," age",[408,3291,560],{"class":495},[408,3293,3294],{"class":579}," 200",[408,3296,919],{"class":495},[408,3298,3299],{"class":556}," profile",[408,3301,560],{"class":495},[408,3303,747],{"class":495},[408,3305,3306],{"class":556},"email",[408,3308,560],{"class":495},[408,3310,509],{"class":495},[408,3312,3313],{"class":512},"nope",[408,3315,516],{"class":495},[408,3317,3318],{"class":495},"}};\n",[408,3320,3321,3323,3325,3328,3330,3333,3336],{"class":484,"line":969},[408,3322,3225],{"class":502},[408,3324,468],{"class":495},[408,3326,3327],{"class":3176},"errors",[408,3329,3232],{"class":502},[408,3331,3332],{"class":3176},"getUserErrors",[408,3334,3335],{"class":502},"(badInput))",[408,3337,519],{"class":495},[408,3339,3340],{"class":484,"line":978},[408,3341,3342],{"class":532},"\u002F\u002F → [{ path: 'profile.email', label: 'Email', message: 'Enter a valid email address' }, …]\n",[405,3344,3345,3348,3349,560],{},[417,3346,3347],{},"errors()"," groups failures by path, picks the message for each broken rule and fills in its tokens. Each result is a ",[417,3350,3351],{},"FriendlyMessage",[473,3353,3355],{"className":475,"code":3354,"language":478,"meta":479,"style":479},"interface FriendlyMessage {\n  path: string;     \u002F\u002F dotted path to the field ('profile.email'); '' for the root\n  label: string;    \u002F\u002F the field's rt$label, or its raw last path segment as fallback\n  message: string;  \u002F\u002F the interpolated message\n}\n",[417,3356,3357,3366,3380,3394,3408],{"__ignoreMap":479},[408,3358,3359,3361,3364],{"class":484,"line":485},[408,3360,2911],{"class":542},[408,3362,3363],{"class":546}," FriendlyMessage",[408,3365,550],{"class":495},[408,3367,3368,3371,3373,3375,3377],{"class":484,"line":522},[408,3369,3370],{"class":556},"  path",[408,3372,560],{"class":495},[408,3374,655],{"class":546},[408,3376,583],{"class":495},[408,3378,3379],{"class":532},"     \u002F\u002F dotted path to the field ('profile.email'); '' for the root\n",[408,3381,3382,3385,3387,3389,3391],{"class":484,"line":529},[408,3383,3384],{"class":556},"  label",[408,3386,560],{"class":495},[408,3388,655],{"class":546},[408,3390,583],{"class":495},[408,3392,3393],{"class":532},"    \u002F\u002F the field's rt$label, or its raw last path segment as fallback\n",[408,3395,3396,3399,3401,3403,3405],{"class":484,"line":536},[408,3397,3398],{"class":556},"  message",[408,3400,560],{"class":495},[408,3402,655],{"class":546},[408,3404,583],{"class":495},[408,3406,3407],{"class":532},"  \u002F\u002F the interpolated message\n",[408,3409,3410],{"class":484,"line":553},[408,3411,732],{"class":495},[405,3413,3414,3415],{},"A blank or missing message falls back to \"",[424,3416,3417],{}," is invalid\". A blank label falls back to the raw field name.",[2309,3419,3420,3421],{},"Error rendering works today. ",[422,3422,3423],{},"Form-building UI is coming later.",[3425,3426,3427],"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}","Human-readable labels and error messages for a type.","md",null,{"toc":24},{"title":279,"description":3428},"GZqLEb50-sntREtV_sMhgQ7Yd3HR01ucTgg8sjcFb74",1793324365918]