[{"data":1,"prerenderedAt":3220},["ShallowReactive",2],{"navigation_docs":3,"-devtools-pure-functions":195,"-devtools-pure-functions-surround":3215},[4,27,61,75,100,126,147,177],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":26},"Introduction","icon-park-outline:home","\u002Fintroduction\u002Fabout-mion","\u002Fintroduction","1.introduction",[11,14,18,22],{"title":12,"path":7,"stem":13},"About mion","1.introduction\u002F1.about-mion",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fintroduction\u002Fquick-start","1.introduction\u002F2.quick-start",{"title":19,"path":20,"stem":21},"Manual Install","\u002Fintroduction\u002Fmanual-install","1.introduction\u002F3.manual-install",{"title":23,"path":24,"stem":25},"What's Next","\u002Fintroduction\u002Fwhat-is-next","1.introduction\u002F4.what-is-next",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Server","icon-park-outline:server","\u002Fserver","20.server",[33,37,41,45,49,53,57],{"title":34,"path":35,"stem":36},"Router Overview","\u002Fserver\u002Foverview","20.server\u002F0.overview",{"title":38,"path":39,"stem":40},"Routes","\u002Fserver\u002Froutes","20.server\u002F1.routes",{"title":42,"path":43,"stem":44},"Middleware","\u002Fserver\u002Fmiddle-fns","20.server\u002F2.middle-fns",{"title":46,"path":47,"stem":48},"Request & Response","\u002Fserver\u002Frequest-and-response","20.server\u002F5.request-and-response",{"title":50,"path":51,"stem":52},"Error Handling","\u002Fserver\u002Ferror-handling","20.server\u002F6.error-handling",{"title":54,"path":55,"stem":56},"Validation","\u002Fserver\u002Fvalidation","20.server\u002F7.validation",{"title":58,"path":59,"stem":60},"Serialization","\u002Fserver\u002Fserialization","20.server\u002F8.serialization",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":26},"Drizzle ORM","i-lineicons-drizzle","\u002Fdrizzle-orm","21.drizzle-orm",[67,71],{"title":68,"path":69,"stem":70},"Drizzle Overview","\u002Fdrizzle-orm\u002Fdrizzle-overview","21.drizzle-orm\u002F0.drizzle-overview",{"title":72,"path":73,"stem":74},"Column Mapping","\u002Fdrizzle-orm\u002Fcolumn-mapping","21.drizzle-orm\u002F1.column-mapping",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":26},"Client","icon-park-outline:computer","\u002Fclient","3.client",[81,85,88,92,96],{"title":82,"path":83,"stem":84},"Client Overview","\u002Fclient\u002Fclient-overview","3.client\u002F0.client-overview",{"title":50,"path":86,"stem":87},"\u002Fclient\u002Ferror-handling","3.client\u002F1.error-handling",{"title":89,"path":90,"stem":91},"Validation Errors","\u002Fclient\u002Fvalidation-errors","3.client\u002F2.validation-errors",{"title":93,"path":94,"stem":95},"Routes Flow","\u002Fclient\u002Fclient-flow","3.client\u002F3.client-flow",{"title":97,"path":98,"stem":99},"Cancellation & Timeouts","\u002Fclient\u002Fcancellation-timeouts","3.client\u002F4.cancellation-timeouts",{"title":101,"icon":102,"redirect":103,"path":104,"stem":105,"children":106,"page":26},"RunTypes","i-lucide-scan-text","\u002Frun-types\u002Foverview","\u002Frun-types","4.run-types",[107,110,114,118,122],{"title":108,"path":103,"stem":109},"RunTypes Overview","4.run-types\u002F0.overview",{"title":111,"path":112,"stem":113},"Supported Types","\u002Frun-types\u002Ffeatures","4.run-types\u002F1.features",{"title":115,"path":116,"stem":117},"Type Formats","\u002Frun-types\u002Ftype-formats","4.run-types\u002F2.type-formats",{"title":119,"path":120,"stem":121},"Built-in Formats","\u002Frun-types\u002Fbuilt-in-formats","4.run-types\u002F3.built-in-formats",{"title":123,"path":124,"stem":125},"Caveats","\u002Frun-types\u002Fcaveats","4.run-types\u002F4.caveats",{"title":127,"path":128,"stem":129,"children":130,"page":26},"Devtools","\u002Fdevtools","5.devtools",[131,135,139,143],{"title":132,"path":133,"stem":134},"AOT Compilation","\u002Fdevtools\u002Faot-compilation","5.devtools\u002F0.aot-compilation",{"title":136,"path":137,"stem":138},"Pure Functions","\u002Fdevtools\u002Fpure-functions","5.devtools\u002F1.pure-functions",{"title":140,"path":141,"stem":142},"ESLint Rules","\u002Fdevtools\u002Feslint-rules","5.devtools\u002F2.eslint-rules",{"title":144,"path":145,"stem":146},"Vite Configuration","\u002Fdevtools\u002Fvite-config","5.devtools\u002F3.vite-config",{"title":148,"redirect":149,"icon":150,"path":151,"stem":152,"children":153,"page":26},"Platforms","\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Fplatforms","6.platforms",[154,157,161,165,169,173],{"title":155,"path":149,"stem":156},"Node.js","6.platforms\u002F1.node-js",{"title":158,"path":159,"stem":160},"Bun","\u002Fplatforms\u002Fbun","6.platforms\u002F2.bun",{"title":162,"path":163,"stem":164},"AWS Lambda","\u002Fplatforms\u002Faws-lambda","6.platforms\u002F3.aws-lambda",{"title":166,"path":167,"stem":168},"Google Cloud Functions","\u002Fplatforms\u002Fgoogle-cloud-functions","6.platforms\u002F4.google-cloud-functions",{"title":170,"path":171,"stem":172},"Cloudflare Workers","\u002Fplatforms\u002Fcloudflare","6.platforms\u002F5.cloudflare",{"title":174,"path":175,"stem":176},"Vercel","\u002Fplatforms\u002Fvercel","6.platforms\u002F6.vercel",{"title":178,"icon":179,"redirect":180,"path":181,"stem":182,"children":183,"page":26},"Benchmarks","icon-park-outline:chart-line","\u002Fbenchmarks\u002Fhello-world","\u002Fbenchmarks","7.benchmarks",[184,187,191],{"title":185,"path":180,"stem":186},"Hello World","7.benchmarks\u002F1.hello-world",{"title":188,"path":189,"stem":190},"Light Validation","\u002Fbenchmarks\u002Flight-validation","7.benchmarks\u002F2.light-validation",{"title":192,"path":193,"stem":194},"Heavy Validation","\u002Fbenchmarks\u002Fheavy-validation","7.benchmarks\u002F3.heavy-validation",{"id":196,"title":136,"body":197,"description":3209,"extension":3210,"links":3211,"meta":3212,"navigation":489,"path":137,"seo":3213,"stem":138,"__hash__":3214},"docs\u002F5.devtools\u002F1.pure-functions.md",{"type":198,"value":199},"minimark",[200,209,214,217,294,301,305,314,321,665,668,672,680,690,966,971,1027,1034,1038,1052,1309,1315,1319,1324,1587,1592,1872,1877,2105,2110,2280,2284,2289,2411,2416,2583,2588,2707,2712,2842,2847,2986,2990,3000,3145,3148,3151,3178,3188,3192,3205],[201,202,203,204,208],"p",{},"mion provides a system for defining ",[205,206,207],"strong",{},"pure functions"," that can be safely transmitted over the network between server and client. All pure functions must follow strict purity rules so they can be serialized, transmitted, and executed safely on either side.",[210,211,213],"h2",{"id":212},"overview","Overview",[201,215,216],{},"There are three main APIs for working with pure functions, each with a different direction of flow:",[218,219,220,239],"table",{},[221,222,223],"thead",{},[224,225,226,230,233,236],"tr",{},[227,228,229],"th",{},"API",[227,231,232],{},"Defined in",[227,234,235],{},"Direction",[227,237,238],{},"Purpose",[240,241,242,260,276],"tbody",{},[224,243,244,251,254,257],{},[245,246,247],"td",{},[248,249,250],"code",{},"registerPureFnFactory()",[245,252,253],{},"Server code",[245,255,256],{},"Server → Client",[245,258,259],{},"Register a utility function on the server that can be shared with clients over the network",[224,261,262,267,270,273],{},[245,263,264],{},[248,265,266],{},"pureServerFn()",[245,268,269],{},"Client code",[245,271,272],{},"Client → Server",[245,274,275],{},"Define a function in client code that gets extracted and compiled into the server at build time",[224,277,278,283,285,287],{},[245,279,280],{},[248,281,282],{},"serverMapFrom()",[245,284,269],{},[245,286,272],{},[245,288,289,290,293],{},"Map the output of one route to the input of another within a ",[248,291,292],{},"routesFlow"," — compiled into server at build time",[201,295,296,297,300],{},"All three follow the same ",[205,298,299],{},"purity rules"," and are processed by the mion Vite plugin at build time.",[210,302,304],{"id":303},"registerpurefnfactory-server-client","registerPureFnFactory (Server → Client)",[201,306,307,309,310,313],{},[248,308,250],{}," is used in ",[205,311,312],{},"server code"," to register pure utility functions that can be shared with clients over the network. These are typically used by mion's JIT compilation system — for example, validation helpers, format functions, or computation utilities that both server and client need.",[201,315,316,317,320],{},"The factory function receives ",[248,318,319],{},"jitUtils"," as its single parameter, giving it access to other registered pure functions. The factory is called once at initialization time to create the actual function:",[322,323,328],"pre",{"className":324,"code":325,"language":326,"meta":327,"style":327},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Register a validation utility on the server\nregisterPureFnFactory('myNamespace', 'limitItems', function (jitUtils) {\n    const MAX_ITEMS = 100;\n    return function inner(items: any[]) {\n        return items.slice(0, MAX_ITEMS);\n    };\n});\n\n\u002F\u002F Register a factory that depends on another pure function\nregisterPureFnFactory('myNamespace', 'validateAndLimit', function (jitUtils) {\n    const limitFn = jitUtils.getPureFn('myNamespace', 'limitItems');\n    return function inner(items: any[]) {\n        const filtered = items.filter((item) => item != null);\n        return limitFn(filtered);\n    };\n});\n","ts","",[248,329,330,339,389,408,440,468,474,484,491,497,531,569,592,635,651,656],{"__ignoreMap":327},[331,332,335],"span",{"class":333,"line":334},"line",1,[331,336,338],{"class":337},"sHwdD","\u002F\u002F Register a validation utility on the server\n",[331,340,342,346,350,354,358,360,363,366,369,371,373,377,380,383,386],{"class":333,"line":341},2,[331,343,345],{"class":344},"s2Zo4","registerPureFnFactory",[331,347,349],{"class":348},"sTEyZ","(",[331,351,353],{"class":352},"sMK4o","'",[331,355,357],{"class":356},"sfazB","myNamespace",[331,359,353],{"class":352},[331,361,362],{"class":352},",",[331,364,365],{"class":352}," '",[331,367,368],{"class":356},"limitItems",[331,370,353],{"class":352},[331,372,362],{"class":352},[331,374,376],{"class":375},"spNyl"," function",[331,378,379],{"class":352}," (",[331,381,319],{"class":382},"sHdIc",[331,384,385],{"class":352},")",[331,387,388],{"class":352}," {\n",[331,390,392,395,398,401,405],{"class":333,"line":391},3,[331,393,394],{"class":375},"    const",[331,396,397],{"class":348}," MAX_ITEMS",[331,399,400],{"class":352}," =",[331,402,404],{"class":403},"sbssI"," 100",[331,406,407],{"class":352},";\n",[331,409,411,415,417,420,422,425,428,432,436,438],{"class":333,"line":410},4,[331,412,414],{"class":413},"s7zQu","    return",[331,416,376],{"class":375},[331,418,419],{"class":344}," inner",[331,421,349],{"class":352},[331,423,424],{"class":382},"items",[331,426,427],{"class":352},":",[331,429,431],{"class":430},"sBMFI"," any",[331,433,435],{"class":434},"swJcz","[]",[331,437,385],{"class":352},[331,439,388],{"class":352},[331,441,443,446,449,452,455,457,460,462,464,466],{"class":333,"line":442},5,[331,444,445],{"class":413},"        return",[331,447,448],{"class":348}," items",[331,450,451],{"class":352},".",[331,453,454],{"class":344},"slice",[331,456,349],{"class":434},[331,458,459],{"class":403},"0",[331,461,362],{"class":352},[331,463,397],{"class":348},[331,465,385],{"class":434},[331,467,407],{"class":352},[331,469,471],{"class":333,"line":470},6,[331,472,473],{"class":352},"    };\n",[331,475,477,480,482],{"class":333,"line":476},7,[331,478,479],{"class":352},"}",[331,481,385],{"class":348},[331,483,407],{"class":352},[331,485,487],{"class":333,"line":486},8,[331,488,490],{"emptyLinePlaceholder":489},true,"\n",[331,492,494],{"class":333,"line":493},9,[331,495,496],{"class":337},"\u002F\u002F Register a factory that depends on another pure function\n",[331,498,500,502,504,506,508,510,512,514,517,519,521,523,525,527,529],{"class":333,"line":499},10,[331,501,345],{"class":344},[331,503,349],{"class":348},[331,505,353],{"class":352},[331,507,357],{"class":356},[331,509,353],{"class":352},[331,511,362],{"class":352},[331,513,365],{"class":352},[331,515,516],{"class":356},"validateAndLimit",[331,518,353],{"class":352},[331,520,362],{"class":352},[331,522,376],{"class":375},[331,524,379],{"class":352},[331,526,319],{"class":382},[331,528,385],{"class":352},[331,530,388],{"class":352},[331,532,534,536,539,541,544,546,549,551,553,555,557,559,561,563,565,567],{"class":333,"line":533},11,[331,535,394],{"class":375},[331,537,538],{"class":348}," limitFn",[331,540,400],{"class":352},[331,542,543],{"class":348}," jitUtils",[331,545,451],{"class":352},[331,547,548],{"class":344},"getPureFn",[331,550,349],{"class":434},[331,552,353],{"class":352},[331,554,357],{"class":356},[331,556,353],{"class":352},[331,558,362],{"class":352},[331,560,365],{"class":352},[331,562,368],{"class":356},[331,564,353],{"class":352},[331,566,385],{"class":434},[331,568,407],{"class":352},[331,570,572,574,576,578,580,582,584,586,588,590],{"class":333,"line":571},12,[331,573,414],{"class":413},[331,575,376],{"class":375},[331,577,419],{"class":344},[331,579,349],{"class":352},[331,581,424],{"class":382},[331,583,427],{"class":352},[331,585,431],{"class":430},[331,587,435],{"class":434},[331,589,385],{"class":352},[331,591,388],{"class":352},[331,593,595,598,601,603,605,607,610,612,614,617,619,622,625,628,631,633],{"class":333,"line":594},13,[331,596,597],{"class":375},"        const",[331,599,600],{"class":348}," filtered",[331,602,400],{"class":352},[331,604,448],{"class":348},[331,606,451],{"class":352},[331,608,609],{"class":344},"filter",[331,611,349],{"class":434},[331,613,349],{"class":352},[331,615,616],{"class":382},"item",[331,618,385],{"class":352},[331,620,621],{"class":375}," =>",[331,623,624],{"class":348}," item",[331,626,627],{"class":352}," !=",[331,629,630],{"class":352}," null",[331,632,385],{"class":434},[331,634,407],{"class":352},[331,636,638,640,642,644,647,649],{"class":333,"line":637},14,[331,639,445],{"class":413},[331,641,538],{"class":344},[331,643,349],{"class":434},[331,645,646],{"class":348},"filtered",[331,648,385],{"class":434},[331,650,407],{"class":352},[331,652,654],{"class":333,"line":653},15,[331,655,473],{"class":352},[331,657,659,661,663],{"class":333,"line":658},16,[331,660,479],{"class":352},[331,662,385],{"class":348},[331,664,407],{"class":352},[201,666,667],{},"Because these functions are pure (no closures, no side effects, no forbidden globals), they can be safely serialized and sent to clients when needed — for example, when a client requests JIT functions for validation or serialization.",[210,669,671],{"id":670},"pureserverfn-client-server","pureServerFn (Client → Server)",[201,673,674,309,676,679],{},[248,675,266],{},[205,677,678],{},"client code"," to define functions that will be extracted at build time and compiled into the server. This allows clients to define logic that runs safely on the server without the server ever executing arbitrary client code.",[201,681,682,683,685,686,689],{},"At runtime on the client, ",[248,684,266],{}," returns a lightweight ",[248,687,688],{},"PureServerFnRef"," — a reference containing the function's hash identifier that the client sends to the server.",[322,691,693],{"className":324,"code":692,"language":326,"meta":327,"style":327},"\u002F\u002F Simple pure function — defined in client, runs on server\nconst double = pureServerFn((x: number) => x * 2);\n\n\u002F\u002F Named pure function\nconst compute = pureServerFn(function addOne(x: number) {\n    const result = x + 1;\n    return result;\n});\n\n\u002F\u002F Factory variant — called once at server init to create the actual function\nconst validate = pureServerFn({\n    pureFn: function factory() {\n        const regex = new RegExp('^[a-z]+$');\n        return function inner(s: string) {\n            return regex.test(s);\n        };\n    },\n    isFactory: true,\n});\n",[248,694,695,700,743,747,752,783,803,811,819,823,828,844,861,889,911,931,936,942,957],{"__ignoreMap":327},[331,696,697],{"class":333,"line":334},[331,698,699],{"class":337},"\u002F\u002F Simple pure function — defined in client, runs on server\n",[331,701,702,705,708,711,714,716,718,721,723,726,728,730,733,736,739,741],{"class":333,"line":341},[331,703,704],{"class":375},"const",[331,706,707],{"class":348}," double ",[331,709,710],{"class":352},"=",[331,712,713],{"class":344}," pureServerFn",[331,715,349],{"class":348},[331,717,349],{"class":352},[331,719,720],{"class":382},"x",[331,722,427],{"class":352},[331,724,725],{"class":430}," number",[331,727,385],{"class":352},[331,729,621],{"class":375},[331,731,732],{"class":348}," x ",[331,734,735],{"class":352},"*",[331,737,738],{"class":403}," 2",[331,740,385],{"class":348},[331,742,407],{"class":352},[331,744,745],{"class":333,"line":391},[331,746,490],{"emptyLinePlaceholder":489},[331,748,749],{"class":333,"line":410},[331,750,751],{"class":337},"\u002F\u002F Named pure function\n",[331,753,754,756,759,761,763,765,768,771,773,775,777,779,781],{"class":333,"line":442},[331,755,704],{"class":375},[331,757,758],{"class":348}," compute ",[331,760,710],{"class":352},[331,762,713],{"class":344},[331,764,349],{"class":348},[331,766,767],{"class":375},"function",[331,769,770],{"class":344}," addOne",[331,772,349],{"class":352},[331,774,720],{"class":382},[331,776,427],{"class":352},[331,778,725],{"class":430},[331,780,385],{"class":352},[331,782,388],{"class":352},[331,784,785,787,790,792,795,798,801],{"class":333,"line":470},[331,786,394],{"class":375},[331,788,789],{"class":348}," result",[331,791,400],{"class":352},[331,793,794],{"class":348}," x",[331,796,797],{"class":352}," +",[331,799,800],{"class":403}," 1",[331,802,407],{"class":352},[331,804,805,807,809],{"class":333,"line":476},[331,806,414],{"class":413},[331,808,789],{"class":348},[331,810,407],{"class":352},[331,812,813,815,817],{"class":333,"line":486},[331,814,479],{"class":352},[331,816,385],{"class":348},[331,818,407],{"class":352},[331,820,821],{"class":333,"line":493},[331,822,490],{"emptyLinePlaceholder":489},[331,824,825],{"class":333,"line":499},[331,826,827],{"class":337},"\u002F\u002F Factory variant — called once at server init to create the actual function\n",[331,829,830,832,835,837,839,841],{"class":333,"line":533},[331,831,704],{"class":375},[331,833,834],{"class":348}," validate ",[331,836,710],{"class":352},[331,838,713],{"class":344},[331,840,349],{"class":348},[331,842,843],{"class":352},"{\n",[331,845,846,849,851,853,856,859],{"class":333,"line":571},[331,847,848],{"class":344},"    pureFn",[331,850,427],{"class":352},[331,852,376],{"class":375},[331,854,855],{"class":344}," factory",[331,857,858],{"class":352},"()",[331,860,388],{"class":352},[331,862,863,865,868,870,873,876,878,880,883,885,887],{"class":333,"line":594},[331,864,597],{"class":375},[331,866,867],{"class":348}," regex",[331,869,400],{"class":352},[331,871,872],{"class":352}," new",[331,874,875],{"class":344}," RegExp",[331,877,349],{"class":434},[331,879,353],{"class":352},[331,881,882],{"class":356},"^[a-z]+$",[331,884,353],{"class":352},[331,886,385],{"class":434},[331,888,407],{"class":352},[331,890,891,893,895,897,899,902,904,907,909],{"class":333,"line":637},[331,892,445],{"class":413},[331,894,376],{"class":375},[331,896,419],{"class":344},[331,898,349],{"class":352},[331,900,901],{"class":382},"s",[331,903,427],{"class":352},[331,905,906],{"class":430}," string",[331,908,385],{"class":352},[331,910,388],{"class":352},[331,912,913,916,918,920,923,925,927,929],{"class":333,"line":653},[331,914,915],{"class":413},"            return",[331,917,867],{"class":348},[331,919,451],{"class":352},[331,921,922],{"class":344},"test",[331,924,349],{"class":434},[331,926,901],{"class":348},[331,928,385],{"class":434},[331,930,407],{"class":352},[331,932,933],{"class":333,"line":658},[331,934,935],{"class":352},"        };\n",[331,937,939],{"class":333,"line":938},17,[331,940,941],{"class":352},"    },\n",[331,943,945,948,950,954],{"class":333,"line":944},18,[331,946,947],{"class":434},"    isFactory",[331,949,427],{"class":352},[331,951,953],{"class":952},"sfNiH"," true",[331,955,956],{"class":352},",\n",[331,958,960,962,964],{"class":333,"line":959},19,[331,961,479],{"class":352},[331,963,385],{"class":348},[331,965,407],{"class":352},[967,968,970],"h3",{"id":969},"how-pureserverfn-works-at-build-time","How pureServerFn Works at Build Time",[972,973,974,985,992,1002,1012,1021],"ol",{},[975,976,977,978,981,982,984],"li",{},"The Vite plugin scans the ",[205,979,980],{},"client source"," for ",[248,983,266],{}," calls",[975,986,987,988,991],{},"Each function body is ",[205,989,990],{},"extracted via AST analysis"," and validated against purity rules",[975,993,994,995,998,999],{},"The body is ",[205,996,997],{},"normalized and hashed"," (SHA256) to produce a unique ",[248,1000,1001],{},"bodyHash",[975,1003,1004,1005,1007,1008,1011],{},"The ",[248,1006,1001],{}," is ",[205,1009,1010],{},"injected as an additional argument"," via a TypeScript transformer",[975,1013,1014,1015,1020],{},"All extracted functions are bundled into the ",[205,1016,1017],{},[248,1018,1019],{},"virtual:mion-server-pure-fns"," virtual module",[975,1022,1004,1023,1026],{},[205,1024,1025],{},"server"," imports this virtual module, making the functions available by hash lookup",[201,1028,1029,1030,1033],{},"At runtime, when the client sends a request referencing a pure function by its hash, the server looks it up in the virtual module and executes the ",[205,1031,1032],{},"server-side copy"," — never running arbitrary client code.",[210,1035,1037],{"id":1036},"servermapfrom-client-server","serverMapFrom (Client → Server)",[201,1039,1040,309,1042,1044,1045,1047,1048,1051],{},[248,1041,282],{},[205,1043,678],{}," within a ",[248,1046,292],{}," to map the output of one route to the input of another. Like ",[248,1049,1050],{},"pureServerFn",", the mapper function is defined in the client but extracted and compiled into the server at build time. This enables GraphQL-style data composition without extra round trips.",[322,1053,1055],{"className":324,"code":1054,"language":326,"meta":327,"style":327},"const {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\nconst order = routes.orders.getById('ORDER-123');\n\u002F\u002F serverMapFrom maps order.userId → users.getById input (runs server-side)\nconst mapping = serverMapFrom(order, (o) => o!.userId);\n\u002F\u002F fake() returns a typed placeholder that satisfies the TypeScript compiler\nconst user = routes.users.getById(mapping.asArg());\n\nconst [[orderData, userData]] = await routesFlow([order, user]).call();\nconsole.log(`Order by ${userData?.name}`);\n",[248,1056,1057,1106,1110,1145,1150,1187,1192,1225,1229,1272],{"__ignoreMap":327},[331,1058,1059,1061,1064,1067,1069,1071,1074,1077,1080,1083,1085,1088,1091,1093,1095,1098,1100,1102,1104],{"class":333,"line":334},[331,1060,704],{"class":375},[331,1062,1063],{"class":352}," {",[331,1065,1066],{"class":348},"routes",[331,1068,479],{"class":352},[331,1070,400],{"class":352},[331,1072,1073],{"class":344}," initClient",[331,1075,1076],{"class":352},"\u003C",[331,1078,1079],{"class":430},"MyApi",[331,1081,1082],{"class":352},">",[331,1084,349],{"class":348},[331,1086,1087],{"class":352},"{",[331,1089,1090],{"class":434},"baseURL",[331,1092,427],{"class":352},[331,1094,365],{"class":352},[331,1096,1097],{"class":356},"http:\u002F\u002Flocalhost:3000",[331,1099,353],{"class":352},[331,1101,479],{"class":352},[331,1103,385],{"class":348},[331,1105,407],{"class":352},[331,1107,1108],{"class":333,"line":341},[331,1109,490],{"emptyLinePlaceholder":489},[331,1111,1112,1114,1117,1119,1122,1124,1127,1129,1132,1134,1136,1139,1141,1143],{"class":333,"line":391},[331,1113,704],{"class":375},[331,1115,1116],{"class":348}," order ",[331,1118,710],{"class":352},[331,1120,1121],{"class":348}," routes",[331,1123,451],{"class":352},[331,1125,1126],{"class":348},"orders",[331,1128,451],{"class":352},[331,1130,1131],{"class":344},"getById",[331,1133,349],{"class":348},[331,1135,353],{"class":352},[331,1137,1138],{"class":356},"ORDER-123",[331,1140,353],{"class":352},[331,1142,385],{"class":348},[331,1144,407],{"class":352},[331,1146,1147],{"class":333,"line":410},[331,1148,1149],{"class":337},"\u002F\u002F serverMapFrom maps order.userId → users.getById input (runs server-side)\n",[331,1151,1152,1154,1157,1159,1162,1165,1167,1169,1172,1174,1176,1179,1182,1185],{"class":333,"line":442},[331,1153,704],{"class":375},[331,1155,1156],{"class":348}," mapping ",[331,1158,710],{"class":352},[331,1160,1161],{"class":344}," serverMapFrom",[331,1163,1164],{"class":348},"(order",[331,1166,362],{"class":352},[331,1168,379],{"class":352},[331,1170,1171],{"class":382},"o",[331,1173,385],{"class":352},[331,1175,621],{"class":375},[331,1177,1178],{"class":348}," o",[331,1180,1181],{"class":352},"!.",[331,1183,1184],{"class":348},"userId)",[331,1186,407],{"class":352},[331,1188,1189],{"class":333,"line":470},[331,1190,1191],{"class":337},"\u002F\u002F fake() returns a typed placeholder that satisfies the TypeScript compiler\n",[331,1193,1194,1196,1199,1201,1203,1205,1208,1210,1212,1215,1217,1220,1223],{"class":333,"line":476},[331,1195,704],{"class":375},[331,1197,1198],{"class":348}," user ",[331,1200,710],{"class":352},[331,1202,1121],{"class":348},[331,1204,451],{"class":352},[331,1206,1207],{"class":348},"users",[331,1209,451],{"class":352},[331,1211,1131],{"class":344},[331,1213,1214],{"class":348},"(mapping",[331,1216,451],{"class":352},[331,1218,1219],{"class":344},"asArg",[331,1221,1222],{"class":348},"())",[331,1224,407],{"class":352},[331,1226,1227],{"class":333,"line":486},[331,1228,490],{"emptyLinePlaceholder":489},[331,1230,1231,1233,1236,1239,1241,1244,1247,1249,1252,1255,1258,1260,1263,1265,1268,1270],{"class":333,"line":493},[331,1232,704],{"class":375},[331,1234,1235],{"class":352}," [[",[331,1237,1238],{"class":348},"orderData",[331,1240,362],{"class":352},[331,1242,1243],{"class":348}," userData",[331,1245,1246],{"class":352},"]]",[331,1248,400],{"class":352},[331,1250,1251],{"class":413}," await",[331,1253,1254],{"class":344}," routesFlow",[331,1256,1257],{"class":348},"([order",[331,1259,362],{"class":352},[331,1261,1262],{"class":348}," user])",[331,1264,451],{"class":352},[331,1266,1267],{"class":344},"call",[331,1269,858],{"class":348},[331,1271,407],{"class":352},[331,1273,1274,1277,1279,1282,1284,1287,1290,1293,1296,1299,1302,1305,1307],{"class":333,"line":499},[331,1275,1276],{"class":348},"console",[331,1278,451],{"class":352},[331,1280,1281],{"class":344},"log",[331,1283,349],{"class":348},[331,1285,1286],{"class":352},"`",[331,1288,1289],{"class":356},"Order by ",[331,1291,1292],{"class":352},"${",[331,1294,1295],{"class":348},"userData",[331,1297,1298],{"class":352},"?.",[331,1300,1301],{"class":348},"name",[331,1303,1304],{"class":352},"}`",[331,1306,385],{"class":348},[331,1308,407],{"class":352},[201,1310,1004,1311,1314],{},[248,1312,1313],{},"mapping.fake()"," call returns a typed placeholder that satisfies the TypeScript compiler, while at runtime the server uses the mapper function to extract the actual value from the order result.",[967,1316,1318],{"id":1317},"valid-examples","Valid Examples",[201,1320,1321],{},[205,1322,1323],{},"Pure functions with params, local variables, and allowed globals:",[322,1325,1327],{"className":324,"code":1326,"language":326,"meta":327,"style":327},"\u002F\u002F Pure function using only params and allowed globals\npureServerFn((x: number) => Math.floor(x * 2));\n\n\u002F\u002F Pure function with local variables\npureServerFn(function compute(x: number) {\n    const y = x * 2;\n    const z = y + 1;\n    return z;\n});\n\n\u002F\u002F Pure function with nested callbacks and destructuring\npureServerFn((items: number[]) => items.map((x) => x + 1).filter((x) => x > 0));\npureServerFn(({a, b}: {a: number; b: number}) => a + b);\n",[248,1328,1329,1334,1372,1376,1381,1404,1422,1439,1447,1455,1459,1464,1535],{"__ignoreMap":327},[331,1330,1331],{"class":333,"line":334},[331,1332,1333],{"class":337},"\u002F\u002F Pure function using only params and allowed globals\n",[331,1335,1336,1338,1340,1342,1344,1346,1348,1350,1352,1355,1357,1360,1363,1365,1367,1370],{"class":333,"line":341},[331,1337,1050],{"class":344},[331,1339,349],{"class":348},[331,1341,349],{"class":352},[331,1343,720],{"class":382},[331,1345,427],{"class":352},[331,1347,725],{"class":430},[331,1349,385],{"class":352},[331,1351,621],{"class":375},[331,1353,1354],{"class":348}," Math",[331,1356,451],{"class":352},[331,1358,1359],{"class":344},"floor",[331,1361,1362],{"class":348},"(x ",[331,1364,735],{"class":352},[331,1366,738],{"class":403},[331,1368,1369],{"class":348},"))",[331,1371,407],{"class":352},[331,1373,1374],{"class":333,"line":391},[331,1375,490],{"emptyLinePlaceholder":489},[331,1377,1378],{"class":333,"line":410},[331,1379,1380],{"class":337},"\u002F\u002F Pure function with local variables\n",[331,1382,1383,1385,1387,1389,1392,1394,1396,1398,1400,1402],{"class":333,"line":442},[331,1384,1050],{"class":344},[331,1386,349],{"class":348},[331,1388,767],{"class":375},[331,1390,1391],{"class":344}," compute",[331,1393,349],{"class":352},[331,1395,720],{"class":382},[331,1397,427],{"class":352},[331,1399,725],{"class":430},[331,1401,385],{"class":352},[331,1403,388],{"class":352},[331,1405,1406,1408,1411,1413,1415,1418,1420],{"class":333,"line":470},[331,1407,394],{"class":375},[331,1409,1410],{"class":348}," y",[331,1412,400],{"class":352},[331,1414,794],{"class":348},[331,1416,1417],{"class":352}," *",[331,1419,738],{"class":403},[331,1421,407],{"class":352},[331,1423,1424,1426,1429,1431,1433,1435,1437],{"class":333,"line":476},[331,1425,394],{"class":375},[331,1427,1428],{"class":348}," z",[331,1430,400],{"class":352},[331,1432,1410],{"class":348},[331,1434,797],{"class":352},[331,1436,800],{"class":403},[331,1438,407],{"class":352},[331,1440,1441,1443,1445],{"class":333,"line":486},[331,1442,414],{"class":413},[331,1444,1428],{"class":348},[331,1446,407],{"class":352},[331,1448,1449,1451,1453],{"class":333,"line":493},[331,1450,479],{"class":352},[331,1452,385],{"class":348},[331,1454,407],{"class":352},[331,1456,1457],{"class":333,"line":499},[331,1458,490],{"emptyLinePlaceholder":489},[331,1460,1461],{"class":333,"line":533},[331,1462,1463],{"class":337},"\u002F\u002F Pure function with nested callbacks and destructuring\n",[331,1465,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488,1491,1493,1495,1497,1499,1501,1503,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1531,1533],{"class":333,"line":571},[331,1467,1050],{"class":344},[331,1469,349],{"class":348},[331,1471,349],{"class":352},[331,1473,424],{"class":382},[331,1475,427],{"class":352},[331,1477,725],{"class":430},[331,1479,435],{"class":348},[331,1481,385],{"class":352},[331,1483,621],{"class":375},[331,1485,448],{"class":348},[331,1487,451],{"class":352},[331,1489,1490],{"class":344},"map",[331,1492,349],{"class":348},[331,1494,349],{"class":352},[331,1496,720],{"class":382},[331,1498,385],{"class":352},[331,1500,621],{"class":375},[331,1502,732],{"class":348},[331,1504,1505],{"class":352},"+",[331,1507,800],{"class":403},[331,1509,385],{"class":348},[331,1511,451],{"class":352},[331,1513,609],{"class":344},[331,1515,349],{"class":348},[331,1517,349],{"class":352},[331,1519,720],{"class":382},[331,1521,385],{"class":352},[331,1523,621],{"class":375},[331,1525,732],{"class":348},[331,1527,1082],{"class":352},[331,1529,1530],{"class":403}," 0",[331,1532,1369],{"class":348},[331,1534,407],{"class":352},[331,1536,1537,1539,1541,1544,1547,1549,1552,1555,1557,1559,1561,1563,1566,1568,1570,1572,1575,1577,1580,1582,1585],{"class":333,"line":594},[331,1538,1050],{"class":344},[331,1540,349],{"class":348},[331,1542,1543],{"class":352},"({",[331,1545,1546],{"class":382},"a",[331,1548,362],{"class":352},[331,1550,1551],{"class":382}," b",[331,1553,1554],{"class":352},"}:",[331,1556,1063],{"class":352},[331,1558,1546],{"class":434},[331,1560,427],{"class":352},[331,1562,725],{"class":430},[331,1564,1565],{"class":352},";",[331,1567,1551],{"class":434},[331,1569,427],{"class":352},[331,1571,725],{"class":430},[331,1573,1574],{"class":352},"})",[331,1576,621],{"class":375},[331,1578,1579],{"class":348}," a ",[331,1581,1505],{"class":352},[331,1583,1584],{"class":348}," b)",[331,1586,407],{"class":352},[201,1588,1589],{},[205,1590,1591],{},"Using allowed globals (JSON, Math, RegExp, console, etc.):",[322,1593,1595],{"className":324,"code":1594,"language":326,"meta":327,"style":327},"\u002F\u002F Pure functions can use allowed globals: JSON, Math, RegExp, console, etc.\npureServerFn(function validate(s: string) {\n    const encoded = encodeURIComponent(s);\n    const num = parseInt(s, 10);\n    const valid = isNaN(num) ? false : isFinite(num);\n    const regex = new RegExp('^[a-z]+$');\n    console.log(encoded, valid, regex);\n    return num;\n});\n\n\u002F\u002F Pure function with try-catch\npureServerFn(function safeParse(s: string) {\n    try {\n        return JSON.parse(s);\n    } catch (e) {\n        return null;\n    }\n});\n",[248,1596,1597,1602,1625,1645,1670,1710,1734,1760,1768,1776,1780,1785,1808,1815,1835,1852,1859,1864],{"__ignoreMap":327},[331,1598,1599],{"class":333,"line":334},[331,1600,1601],{"class":337},"\u002F\u002F Pure functions can use allowed globals: JSON, Math, RegExp, console, etc.\n",[331,1603,1604,1606,1608,1610,1613,1615,1617,1619,1621,1623],{"class":333,"line":341},[331,1605,1050],{"class":344},[331,1607,349],{"class":348},[331,1609,767],{"class":375},[331,1611,1612],{"class":344}," validate",[331,1614,349],{"class":352},[331,1616,901],{"class":382},[331,1618,427],{"class":352},[331,1620,906],{"class":430},[331,1622,385],{"class":352},[331,1624,388],{"class":352},[331,1626,1627,1629,1632,1634,1637,1639,1641,1643],{"class":333,"line":391},[331,1628,394],{"class":375},[331,1630,1631],{"class":348}," encoded",[331,1633,400],{"class":352},[331,1635,1636],{"class":344}," encodeURIComponent",[331,1638,349],{"class":434},[331,1640,901],{"class":348},[331,1642,385],{"class":434},[331,1644,407],{"class":352},[331,1646,1647,1649,1652,1654,1657,1659,1661,1663,1666,1668],{"class":333,"line":410},[331,1648,394],{"class":375},[331,1650,1651],{"class":348}," num",[331,1653,400],{"class":352},[331,1655,1656],{"class":344}," parseInt",[331,1658,349],{"class":434},[331,1660,901],{"class":348},[331,1662,362],{"class":352},[331,1664,1665],{"class":403}," 10",[331,1667,385],{"class":434},[331,1669,407],{"class":352},[331,1671,1672,1674,1677,1679,1682,1684,1687,1690,1693,1696,1699,1702,1704,1706,1708],{"class":333,"line":442},[331,1673,394],{"class":375},[331,1675,1676],{"class":348}," valid",[331,1678,400],{"class":352},[331,1680,1681],{"class":344}," isNaN",[331,1683,349],{"class":434},[331,1685,1686],{"class":348},"num",[331,1688,1689],{"class":434},") ",[331,1691,1692],{"class":352},"?",[331,1694,1695],{"class":952}," false",[331,1697,1698],{"class":352}," :",[331,1700,1701],{"class":344}," isFinite",[331,1703,349],{"class":434},[331,1705,1686],{"class":348},[331,1707,385],{"class":434},[331,1709,407],{"class":352},[331,1711,1712,1714,1716,1718,1720,1722,1724,1726,1728,1730,1732],{"class":333,"line":470},[331,1713,394],{"class":375},[331,1715,867],{"class":348},[331,1717,400],{"class":352},[331,1719,872],{"class":352},[331,1721,875],{"class":344},[331,1723,349],{"class":434},[331,1725,353],{"class":352},[331,1727,882],{"class":356},[331,1729,353],{"class":352},[331,1731,385],{"class":434},[331,1733,407],{"class":352},[331,1735,1736,1739,1741,1743,1745,1748,1750,1752,1754,1756,1758],{"class":333,"line":476},[331,1737,1738],{"class":348},"    console",[331,1740,451],{"class":352},[331,1742,1281],{"class":344},[331,1744,349],{"class":434},[331,1746,1747],{"class":348},"encoded",[331,1749,362],{"class":352},[331,1751,1676],{"class":348},[331,1753,362],{"class":352},[331,1755,867],{"class":348},[331,1757,385],{"class":434},[331,1759,407],{"class":352},[331,1761,1762,1764,1766],{"class":333,"line":486},[331,1763,414],{"class":413},[331,1765,1651],{"class":348},[331,1767,407],{"class":352},[331,1769,1770,1772,1774],{"class":333,"line":493},[331,1771,479],{"class":352},[331,1773,385],{"class":348},[331,1775,407],{"class":352},[331,1777,1778],{"class":333,"line":499},[331,1779,490],{"emptyLinePlaceholder":489},[331,1781,1782],{"class":333,"line":533},[331,1783,1784],{"class":337},"\u002F\u002F Pure function with try-catch\n",[331,1786,1787,1789,1791,1793,1796,1798,1800,1802,1804,1806],{"class":333,"line":571},[331,1788,1050],{"class":344},[331,1790,349],{"class":348},[331,1792,767],{"class":375},[331,1794,1795],{"class":344}," safeParse",[331,1797,349],{"class":352},[331,1799,901],{"class":382},[331,1801,427],{"class":352},[331,1803,906],{"class":430},[331,1805,385],{"class":352},[331,1807,388],{"class":352},[331,1809,1810,1813],{"class":333,"line":594},[331,1811,1812],{"class":413},"    try",[331,1814,388],{"class":352},[331,1816,1817,1819,1822,1824,1827,1829,1831,1833],{"class":333,"line":637},[331,1818,445],{"class":413},[331,1820,1821],{"class":348}," JSON",[331,1823,451],{"class":352},[331,1825,1826],{"class":344},"parse",[331,1828,349],{"class":434},[331,1830,901],{"class":348},[331,1832,385],{"class":434},[331,1834,407],{"class":352},[331,1836,1837,1840,1843,1845,1848,1850],{"class":333,"line":653},[331,1838,1839],{"class":352},"    }",[331,1841,1842],{"class":413}," catch",[331,1844,379],{"class":434},[331,1846,1847],{"class":348},"e",[331,1849,1689],{"class":434},[331,1851,843],{"class":352},[331,1853,1854,1856],{"class":333,"line":658},[331,1855,445],{"class":413},[331,1857,1858],{"class":352}," null;\n",[331,1860,1861],{"class":333,"line":938},[331,1862,1863],{"class":352},"    }\n",[331,1865,1866,1868,1870],{"class":333,"line":944},[331,1867,479],{"class":352},[331,1869,385],{"class":348},[331,1871,407],{"class":352},[201,1873,1874],{},[205,1875,1876],{},"Factory functions — same purity rules, local scope only:",[322,1878,1880],{"className":324,"code":1879,"language":326,"meta":327,"style":327},"\u002F\u002F Factory functions follow the same purity rules — only local scope is allowed\npureServerFn({\n    pureFn: function factory() {\n        const regexp = new RegExp('^[a-z]+$');\n        return function inner(s: string) {\n            return regexp.test(s);\n        };\n    },\n    isFactory: true,\n});\n\n\u002F\u002F registerPureFnFactory — local variables within the factory are allowed\nregisterPureFnFactory('ns', 'limitItems', function () {\n    const MAX_ITEMS = 100;\n    return function inner(items: any[]) {\n        return items.slice(0, MAX_ITEMS);\n    };\n});\n",[248,1881,1882,1887,1895,1909,1934,1954,1972,1976,1980,1990,1998,2002,2007,2037,2049,2071,2093,2097],{"__ignoreMap":327},[331,1883,1884],{"class":333,"line":334},[331,1885,1886],{"class":337},"\u002F\u002F Factory functions follow the same purity rules — only local scope is allowed\n",[331,1888,1889,1891,1893],{"class":333,"line":341},[331,1890,1050],{"class":344},[331,1892,349],{"class":348},[331,1894,843],{"class":352},[331,1896,1897,1899,1901,1903,1905,1907],{"class":333,"line":391},[331,1898,848],{"class":344},[331,1900,427],{"class":352},[331,1902,376],{"class":375},[331,1904,855],{"class":344},[331,1906,858],{"class":352},[331,1908,388],{"class":352},[331,1910,1911,1913,1916,1918,1920,1922,1924,1926,1928,1930,1932],{"class":333,"line":410},[331,1912,597],{"class":375},[331,1914,1915],{"class":348}," regexp",[331,1917,400],{"class":352},[331,1919,872],{"class":352},[331,1921,875],{"class":344},[331,1923,349],{"class":434},[331,1925,353],{"class":352},[331,1927,882],{"class":356},[331,1929,353],{"class":352},[331,1931,385],{"class":434},[331,1933,407],{"class":352},[331,1935,1936,1938,1940,1942,1944,1946,1948,1950,1952],{"class":333,"line":442},[331,1937,445],{"class":413},[331,1939,376],{"class":375},[331,1941,419],{"class":344},[331,1943,349],{"class":352},[331,1945,901],{"class":382},[331,1947,427],{"class":352},[331,1949,906],{"class":430},[331,1951,385],{"class":352},[331,1953,388],{"class":352},[331,1955,1956,1958,1960,1962,1964,1966,1968,1970],{"class":333,"line":470},[331,1957,915],{"class":413},[331,1959,1915],{"class":348},[331,1961,451],{"class":352},[331,1963,922],{"class":344},[331,1965,349],{"class":434},[331,1967,901],{"class":348},[331,1969,385],{"class":434},[331,1971,407],{"class":352},[331,1973,1974],{"class":333,"line":476},[331,1975,935],{"class":352},[331,1977,1978],{"class":333,"line":486},[331,1979,941],{"class":352},[331,1981,1982,1984,1986,1988],{"class":333,"line":493},[331,1983,947],{"class":434},[331,1985,427],{"class":352},[331,1987,953],{"class":952},[331,1989,956],{"class":352},[331,1991,1992,1994,1996],{"class":333,"line":499},[331,1993,479],{"class":352},[331,1995,385],{"class":348},[331,1997,407],{"class":352},[331,1999,2000],{"class":333,"line":533},[331,2001,490],{"emptyLinePlaceholder":489},[331,2003,2004],{"class":333,"line":571},[331,2005,2006],{"class":337},"\u002F\u002F registerPureFnFactory — local variables within the factory are allowed\n",[331,2008,2009,2011,2013,2015,2018,2020,2022,2024,2026,2028,2030,2032,2035],{"class":333,"line":594},[331,2010,345],{"class":344},[331,2012,349],{"class":348},[331,2014,353],{"class":352},[331,2016,2017],{"class":356},"ns",[331,2019,353],{"class":352},[331,2021,362],{"class":352},[331,2023,365],{"class":352},[331,2025,368],{"class":356},[331,2027,353],{"class":352},[331,2029,362],{"class":352},[331,2031,376],{"class":375},[331,2033,2034],{"class":352}," ()",[331,2036,388],{"class":352},[331,2038,2039,2041,2043,2045,2047],{"class":333,"line":637},[331,2040,394],{"class":375},[331,2042,397],{"class":348},[331,2044,400],{"class":352},[331,2046,404],{"class":403},[331,2048,407],{"class":352},[331,2050,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069],{"class":333,"line":653},[331,2052,414],{"class":413},[331,2054,376],{"class":375},[331,2056,419],{"class":344},[331,2058,349],{"class":352},[331,2060,424],{"class":382},[331,2062,427],{"class":352},[331,2064,431],{"class":430},[331,2066,435],{"class":434},[331,2068,385],{"class":352},[331,2070,388],{"class":352},[331,2072,2073,2075,2077,2079,2081,2083,2085,2087,2089,2091],{"class":333,"line":658},[331,2074,445],{"class":413},[331,2076,448],{"class":348},[331,2078,451],{"class":352},[331,2080,454],{"class":344},[331,2082,349],{"class":434},[331,2084,459],{"class":403},[331,2086,362],{"class":352},[331,2088,397],{"class":348},[331,2090,385],{"class":434},[331,2092,407],{"class":352},[331,2094,2095],{"class":333,"line":938},[331,2096,473],{"class":352},[331,2098,2099,2101,2103],{"class":333,"line":944},[331,2100,479],{"class":352},[331,2102,385],{"class":348},[331,2104,407],{"class":352},[201,2106,2107],{},[205,2108,2109],{},"serverMapFrom — valid mappers:",[322,2111,2113],{"className":324,"code":2112,"language":326,"meta":327,"style":327},"\u002F\u002F serverMapFrom() mapper follows the same purity rules as pureServerFn\nconst someSubRequest = {} as any; \u002F\u002F placeholder for SubRequest\nserverMapFrom(someSubRequest, (value: number) => value * 2);\nserverMapFrom(someSubRequest, (user: {name: string; age: number}) => user.name.toUpperCase());\nserverMapFrom(someSubRequest, function extractId(item: {id: number}) {\n    return item.id;\n});\n",[248,2114,2115,2120,2142,2176,2228,2260,2272],{"__ignoreMap":327},[331,2116,2117],{"class":333,"line":334},[331,2118,2119],{"class":337},"\u002F\u002F serverMapFrom() mapper follows the same purity rules as pureServerFn\n",[331,2121,2122,2124,2127,2129,2132,2135,2137,2139],{"class":333,"line":341},[331,2123,704],{"class":375},[331,2125,2126],{"class":348}," someSubRequest ",[331,2128,710],{"class":352},[331,2130,2131],{"class":352}," {}",[331,2133,2134],{"class":413}," as",[331,2136,431],{"class":430},[331,2138,1565],{"class":352},[331,2140,2141],{"class":337}," \u002F\u002F placeholder for SubRequest\n",[331,2143,2144,2147,2150,2152,2154,2157,2159,2161,2163,2165,2168,2170,2172,2174],{"class":333,"line":391},[331,2145,2146],{"class":344},"serverMapFrom",[331,2148,2149],{"class":348},"(someSubRequest",[331,2151,362],{"class":352},[331,2153,379],{"class":352},[331,2155,2156],{"class":382},"value",[331,2158,427],{"class":352},[331,2160,725],{"class":430},[331,2162,385],{"class":352},[331,2164,621],{"class":375},[331,2166,2167],{"class":348}," value ",[331,2169,735],{"class":352},[331,2171,738],{"class":403},[331,2173,385],{"class":348},[331,2175,407],{"class":352},[331,2177,2178,2180,2182,2184,2186,2189,2191,2193,2195,2197,2199,2201,2204,2206,2208,2210,2212,2215,2217,2219,2221,2224,2226],{"class":333,"line":410},[331,2179,2146],{"class":344},[331,2181,2149],{"class":348},[331,2183,362],{"class":352},[331,2185,379],{"class":352},[331,2187,2188],{"class":382},"user",[331,2190,427],{"class":352},[331,2192,1063],{"class":352},[331,2194,1301],{"class":434},[331,2196,427],{"class":352},[331,2198,906],{"class":430},[331,2200,1565],{"class":352},[331,2202,2203],{"class":434}," age",[331,2205,427],{"class":352},[331,2207,725],{"class":430},[331,2209,1574],{"class":352},[331,2211,621],{"class":375},[331,2213,2214],{"class":348}," user",[331,2216,451],{"class":352},[331,2218,1301],{"class":348},[331,2220,451],{"class":352},[331,2222,2223],{"class":344},"toUpperCase",[331,2225,1222],{"class":348},[331,2227,407],{"class":352},[331,2229,2230,2232,2234,2236,2238,2241,2243,2245,2247,2249,2252,2254,2256,2258],{"class":333,"line":442},[331,2231,2146],{"class":344},[331,2233,2149],{"class":348},[331,2235,362],{"class":352},[331,2237,376],{"class":375},[331,2239,2240],{"class":344}," extractId",[331,2242,349],{"class":352},[331,2244,616],{"class":382},[331,2246,427],{"class":352},[331,2248,1063],{"class":352},[331,2250,2251],{"class":434},"id",[331,2253,427],{"class":352},[331,2255,725],{"class":430},[331,2257,1574],{"class":352},[331,2259,388],{"class":352},[331,2261,2262,2264,2266,2268,2270],{"class":333,"line":470},[331,2263,414],{"class":413},[331,2265,624],{"class":348},[331,2267,451],{"class":352},[331,2269,2251],{"class":348},[331,2271,407],{"class":352},[331,2273,2274,2276,2278],{"class":333,"line":476},[331,2275,479],{"class":352},[331,2277,385],{"class":348},[331,2279,407],{"class":352},[967,2281,2283],{"id":2282},"invalid-examples","Invalid Examples",[201,2285,2286],{},[205,2287,2288],{},"Impure operations (this, await, dynamic import):",[322,2290,2292],{"className":324,"code":2291,"language":326,"meta":327,"style":327},"\u002F\u002F Using 'this' keyword\npureServerFn(function () {\n    return this.x; \u002F\u002F ❌ Error: 'this' is not allowed in pure functions\n});\n\n\u002F\u002F Using async\u002Fawait\npureServerFn(async (x: number) => await x); \u002F\u002F ❌ Error: async\u002Fawait is not allowed\n\n\u002F\u002F Using dynamic import()\npureServerFn((x: string) => import(x)); \u002F\u002F ❌ Error: Dynamic import() is not allowed\n",[248,2293,2294,2299,2311,2325,2333,2337,2342,2373,2377,2382],{"__ignoreMap":327},[331,2295,2296],{"class":333,"line":334},[331,2297,2298],{"class":337},"\u002F\u002F Using 'this' keyword\n",[331,2300,2301,2303,2305,2307,2309],{"class":333,"line":341},[331,2302,1050],{"class":344},[331,2304,349],{"class":348},[331,2306,767],{"class":375},[331,2308,2034],{"class":352},[331,2310,388],{"class":352},[331,2312,2313,2315,2318,2320,2322],{"class":333,"line":391},[331,2314,414],{"class":413},[331,2316,2317],{"class":352}," this.",[331,2319,720],{"class":348},[331,2321,1565],{"class":352},[331,2323,2324],{"class":337}," \u002F\u002F ❌ Error: 'this' is not allowed in pure functions\n",[331,2326,2327,2329,2331],{"class":333,"line":410},[331,2328,479],{"class":352},[331,2330,385],{"class":348},[331,2332,407],{"class":352},[331,2334,2335],{"class":333,"line":442},[331,2336,490],{"emptyLinePlaceholder":489},[331,2338,2339],{"class":333,"line":470},[331,2340,2341],{"class":337},"\u002F\u002F Using async\u002Fawait\n",[331,2343,2344,2346,2348,2351,2353,2355,2357,2359,2361,2363,2365,2368,2370],{"class":333,"line":476},[331,2345,1050],{"class":344},[331,2347,349],{"class":348},[331,2349,2350],{"class":375},"async",[331,2352,379],{"class":352},[331,2354,720],{"class":382},[331,2356,427],{"class":352},[331,2358,725],{"class":430},[331,2360,385],{"class":352},[331,2362,621],{"class":375},[331,2364,1251],{"class":413},[331,2366,2367],{"class":348}," x)",[331,2369,1565],{"class":352},[331,2371,2372],{"class":337}," \u002F\u002F ❌ Error: async\u002Fawait is not allowed\n",[331,2374,2375],{"class":333,"line":486},[331,2376,490],{"emptyLinePlaceholder":489},[331,2378,2379],{"class":333,"line":493},[331,2380,2381],{"class":337},"\u002F\u002F Using dynamic import()\n",[331,2383,2384,2386,2388,2390,2392,2394,2396,2398,2400,2403,2406,2408],{"class":333,"line":499},[331,2385,1050],{"class":344},[331,2387,349],{"class":348},[331,2389,349],{"class":352},[331,2391,720],{"class":382},[331,2393,427],{"class":352},[331,2395,906],{"class":430},[331,2397,385],{"class":352},[331,2399,621],{"class":375},[331,2401,2402],{"class":344}," import",[331,2404,2405],{"class":348},"(x))",[331,2407,1565],{"class":352},[331,2409,2410],{"class":337}," \u002F\u002F ❌ Error: Dynamic import() is not allowed\n",[201,2412,2413],{},[205,2414,2415],{},"Forbidden identifiers (eval, fetch, setTimeout, process, window):",[322,2417,2419],{"className":324,"code":2418,"language":326,"meta":327,"style":327},"\u002F\u002F Forbidden identifiers: eval, fetch, setTimeout, process, window, etc.\npureServerFn((x: string) => eval(x)); \u002F\u002F ❌ Error: \"eval\" is not allowed\npureServerFn((url: string) => fetch(url)); \u002F\u002F ❌ Error: \"fetch\" is not allowed\npureServerFn(() => {\n    setTimeout(() => {}, 100); \u002F\u002F ❌ Error: \"setTimeout\" is not allowed\n});\npureServerFn(() => process.env.KEY); \u002F\u002F ❌ Error: \"process\" is not allowed\npureServerFn(() => window.location.href); \u002F\u002F ❌ Error: \"window\" is not allowed\n",[248,2420,2421,2426,2454,2484,2496,2519,2527,2555],{"__ignoreMap":327},[331,2422,2423],{"class":333,"line":334},[331,2424,2425],{"class":337},"\u002F\u002F Forbidden identifiers: eval, fetch, setTimeout, process, window, etc.\n",[331,2427,2428,2430,2432,2434,2436,2438,2440,2442,2444,2447,2449,2451],{"class":333,"line":341},[331,2429,1050],{"class":344},[331,2431,349],{"class":348},[331,2433,349],{"class":352},[331,2435,720],{"class":382},[331,2437,427],{"class":352},[331,2439,906],{"class":430},[331,2441,385],{"class":352},[331,2443,621],{"class":375},[331,2445,2446],{"class":344}," eval",[331,2448,2405],{"class":348},[331,2450,1565],{"class":352},[331,2452,2453],{"class":337}," \u002F\u002F ❌ Error: \"eval\" is not allowed\n",[331,2455,2456,2458,2460,2462,2465,2467,2469,2471,2473,2476,2479,2481],{"class":333,"line":391},[331,2457,1050],{"class":344},[331,2459,349],{"class":348},[331,2461,349],{"class":352},[331,2463,2464],{"class":382},"url",[331,2466,427],{"class":352},[331,2468,906],{"class":430},[331,2470,385],{"class":352},[331,2472,621],{"class":375},[331,2474,2475],{"class":344}," fetch",[331,2477,2478],{"class":348},"(url))",[331,2480,1565],{"class":352},[331,2482,2483],{"class":337}," \u002F\u002F ❌ Error: \"fetch\" is not allowed\n",[331,2485,2486,2488,2490,2492,2494],{"class":333,"line":410},[331,2487,1050],{"class":344},[331,2489,349],{"class":348},[331,2491,858],{"class":352},[331,2493,621],{"class":375},[331,2495,388],{"class":352},[331,2497,2498,2501,2503,2505,2507,2510,2512,2514,2516],{"class":333,"line":442},[331,2499,2500],{"class":344},"    setTimeout",[331,2502,349],{"class":434},[331,2504,858],{"class":352},[331,2506,621],{"class":375},[331,2508,2509],{"class":352}," {},",[331,2511,404],{"class":403},[331,2513,385],{"class":434},[331,2515,1565],{"class":352},[331,2517,2518],{"class":337}," \u002F\u002F ❌ Error: \"setTimeout\" is not allowed\n",[331,2520,2521,2523,2525],{"class":333,"line":470},[331,2522,479],{"class":352},[331,2524,385],{"class":348},[331,2526,407],{"class":352},[331,2528,2529,2531,2533,2535,2537,2540,2542,2545,2547,2550,2552],{"class":333,"line":476},[331,2530,1050],{"class":344},[331,2532,349],{"class":348},[331,2534,858],{"class":352},[331,2536,621],{"class":375},[331,2538,2539],{"class":348}," process",[331,2541,451],{"class":352},[331,2543,2544],{"class":348},"env",[331,2546,451],{"class":352},[331,2548,2549],{"class":348},"KEY)",[331,2551,1565],{"class":352},[331,2553,2554],{"class":337}," \u002F\u002F ❌ Error: \"process\" is not allowed\n",[331,2556,2557,2559,2561,2563,2565,2568,2570,2573,2575,2578,2580],{"class":333,"line":486},[331,2558,1050],{"class":344},[331,2560,349],{"class":348},[331,2562,858],{"class":352},[331,2564,621],{"class":375},[331,2566,2567],{"class":348}," window",[331,2569,451],{"class":352},[331,2571,2572],{"class":348},"location",[331,2574,451],{"class":352},[331,2576,2577],{"class":348},"href)",[331,2579,1565],{"class":352},[331,2581,2582],{"class":337}," \u002F\u002F ❌ Error: \"window\" is not allowed\n",[201,2584,2585],{},[205,2586,2587],{},"Closure variables — referencing outer scope:",[322,2589,2591],{"className":324,"code":2590,"language":326,"meta":327,"style":327},"\u002F\u002F Closure variables — referencing outer scope is not allowed\nconst SECRET = 'my-secret-key';\npureServerFn((x: string) => x + SECRET); \u002F\u002F ❌ Error: Closure variable \"SECRET\" is not allowed\n\nconst config = {maxRetries: 3};\npureServerFn((x: number) => x + config.maxRetries); \u002F\u002F ❌ Error: Closure variable \"config\" is not allowed\n",[248,2592,2593,2598,2616,2646,2650,2672],{"__ignoreMap":327},[331,2594,2595],{"class":333,"line":334},[331,2596,2597],{"class":337},"\u002F\u002F Closure variables — referencing outer scope is not allowed\n",[331,2599,2600,2602,2605,2607,2609,2612,2614],{"class":333,"line":341},[331,2601,704],{"class":375},[331,2603,2604],{"class":348}," SECRET ",[331,2606,710],{"class":352},[331,2608,365],{"class":352},[331,2610,2611],{"class":356},"my-secret-key",[331,2613,353],{"class":352},[331,2615,407],{"class":352},[331,2617,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2641,2643],{"class":333,"line":391},[331,2619,1050],{"class":344},[331,2621,349],{"class":348},[331,2623,349],{"class":352},[331,2625,720],{"class":382},[331,2627,427],{"class":352},[331,2629,906],{"class":430},[331,2631,385],{"class":352},[331,2633,621],{"class":375},[331,2635,732],{"class":348},[331,2637,1505],{"class":352},[331,2639,2640],{"class":348}," SECRET)",[331,2642,1565],{"class":352},[331,2644,2645],{"class":337}," \u002F\u002F ❌ Error: Closure variable \"SECRET\" is not allowed\n",[331,2647,2648],{"class":333,"line":410},[331,2649,490],{"emptyLinePlaceholder":489},[331,2651,2652,2654,2657,2659,2661,2664,2666,2669],{"class":333,"line":442},[331,2653,704],{"class":375},[331,2655,2656],{"class":348}," config ",[331,2658,710],{"class":352},[331,2660,1063],{"class":352},[331,2662,2663],{"class":434},"maxRetries",[331,2665,427],{"class":352},[331,2667,2668],{"class":403}," 3",[331,2670,2671],{"class":352},"};\n",[331,2673,2674,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694,2697,2699,2702,2704],{"class":333,"line":470},[331,2675,1050],{"class":344},[331,2677,349],{"class":348},[331,2679,349],{"class":352},[331,2681,720],{"class":382},[331,2683,427],{"class":352},[331,2685,725],{"class":430},[331,2687,385],{"class":352},[331,2689,621],{"class":375},[331,2691,732],{"class":348},[331,2693,1505],{"class":352},[331,2695,2696],{"class":348}," config",[331,2698,451],{"class":352},[331,2700,2701],{"class":348},"maxRetries)",[331,2703,1565],{"class":352},[331,2705,2706],{"class":337}," \u002F\u002F ❌ Error: Closure variable \"config\" is not allowed\n",[201,2708,2709],{},[205,2710,2711],{},"Imported or dynamic arguments — cannot be statically analyzed:",[322,2713,2715],{"className":324,"code":2714,"language":326,"meta":327,"style":327},"\u002F\u002F Imported functions cannot be statically analyzed — must be defined in the same file\nimport {myFn} from '.\u002Fhelpers.ts';\npureServerFn(myFn); \u002F\u002F ❌ Error: argument \"myFn\" is imported from another module\n\npureServerFn({pureFn: myFn}); \u002F\u002F ❌ Error: argument \"myFn\" is imported from another module\n\nimport {myFactory} from '.\u002Fhelpers.ts';\nregisterPureFnFactory('ns', 'fn', myFactory); \u002F\u002F ❌ Error: argument \"myFactory\" is imported from another module\n",[248,2716,2717,2722,2746,2758,2762,2786,2790,2811],{"__ignoreMap":327},[331,2718,2719],{"class":333,"line":334},[331,2720,2721],{"class":337},"\u002F\u002F Imported functions cannot be statically analyzed — must be defined in the same file\n",[331,2723,2724,2727,2729,2732,2734,2737,2739,2742,2744],{"class":333,"line":341},[331,2725,2726],{"class":413},"import",[331,2728,1063],{"class":352},[331,2730,2731],{"class":348},"myFn",[331,2733,479],{"class":352},[331,2735,2736],{"class":413}," from",[331,2738,365],{"class":352},[331,2740,2741],{"class":356},".\u002Fhelpers.ts",[331,2743,353],{"class":352},[331,2745,407],{"class":352},[331,2747,2748,2750,2753,2755],{"class":333,"line":391},[331,2749,1050],{"class":344},[331,2751,2752],{"class":348},"(myFn)",[331,2754,1565],{"class":352},[331,2756,2757],{"class":337}," \u002F\u002F ❌ Error: argument \"myFn\" is imported from another module\n",[331,2759,2760],{"class":333,"line":410},[331,2761,490],{"emptyLinePlaceholder":489},[331,2763,2764,2766,2768,2770,2773,2775,2778,2780,2782,2784],{"class":333,"line":442},[331,2765,1050],{"class":344},[331,2767,349],{"class":348},[331,2769,1087],{"class":352},[331,2771,2772],{"class":434},"pureFn",[331,2774,427],{"class":352},[331,2776,2777],{"class":348}," myFn",[331,2779,479],{"class":352},[331,2781,385],{"class":348},[331,2783,1565],{"class":352},[331,2785,2757],{"class":337},[331,2787,2788],{"class":333,"line":470},[331,2789,490],{"emptyLinePlaceholder":489},[331,2791,2792,2794,2796,2799,2801,2803,2805,2807,2809],{"class":333,"line":476},[331,2793,2726],{"class":413},[331,2795,1063],{"class":352},[331,2797,2798],{"class":348},"myFactory",[331,2800,479],{"class":352},[331,2802,2736],{"class":413},[331,2804,365],{"class":352},[331,2806,2741],{"class":356},[331,2808,353],{"class":352},[331,2810,407],{"class":352},[331,2812,2813,2815,2817,2819,2821,2823,2825,2827,2830,2832,2834,2837,2839],{"class":333,"line":486},[331,2814,345],{"class":344},[331,2816,349],{"class":348},[331,2818,353],{"class":352},[331,2820,2017],{"class":356},[331,2822,353],{"class":352},[331,2824,362],{"class":352},[331,2826,365],{"class":352},[331,2828,2829],{"class":356},"fn",[331,2831,353],{"class":352},[331,2833,362],{"class":352},[331,2835,2836],{"class":348}," myFactory)",[331,2838,1565],{"class":352},[331,2840,2841],{"class":337}," \u002F\u002F ❌ Error: argument \"myFactory\" is imported from another module\n",[201,2843,2844],{},[205,2845,2846],{},"Invalid serverMapFrom mappers:",[322,2848,2850],{"className":324,"code":2849,"language":326,"meta":327,"style":327},"\u002F\u002F serverMapFrom() mapper follows the same purity rules — closure variables are not allowed\nconst MULTIPLIER = 5;\nserverMapFrom(someSubRequest, (x: number) => x * MULTIPLIER); \u002F\u002F ❌ Error: Closure variable \"MULTIPLIER\" is not allowed\n\n\u002F\u002F Forbidden identifiers not allowed in serverMapFrom() mapper\nserverMapFrom(someSubRequest, (url: string) => fetch(url)); \u002F\u002F ❌ Error: \"fetch\" is not allowed\n\n\u002F\u002F Imported mapper not allowed — must be defined inline\nimport {myMapper} from '.\u002Fhelpers.ts';\nserverMapFrom(someSubRequest, myMapper); \u002F\u002F ❌ Error: argument \"myMapper\" is imported from another module\n",[248,2851,2852,2857,2871,2903,2907,2912,2940,2944,2949,2970],{"__ignoreMap":327},[331,2853,2854],{"class":333,"line":334},[331,2855,2856],{"class":337},"\u002F\u002F serverMapFrom() mapper follows the same purity rules — closure variables are not allowed\n",[331,2858,2859,2861,2864,2866,2869],{"class":333,"line":341},[331,2860,704],{"class":375},[331,2862,2863],{"class":348}," MULTIPLIER ",[331,2865,710],{"class":352},[331,2867,2868],{"class":403}," 5",[331,2870,407],{"class":352},[331,2872,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891,2893,2895,2898,2900],{"class":333,"line":391},[331,2874,2146],{"class":344},[331,2876,2149],{"class":348},[331,2878,362],{"class":352},[331,2880,379],{"class":352},[331,2882,720],{"class":382},[331,2884,427],{"class":352},[331,2886,725],{"class":430},[331,2888,385],{"class":352},[331,2890,621],{"class":375},[331,2892,732],{"class":348},[331,2894,735],{"class":352},[331,2896,2897],{"class":348}," MULTIPLIER)",[331,2899,1565],{"class":352},[331,2901,2902],{"class":337}," \u002F\u002F ❌ Error: Closure variable \"MULTIPLIER\" is not allowed\n",[331,2904,2905],{"class":333,"line":410},[331,2906,490],{"emptyLinePlaceholder":489},[331,2908,2909],{"class":333,"line":442},[331,2910,2911],{"class":337},"\u002F\u002F Forbidden identifiers not allowed in serverMapFrom() mapper\n",[331,2913,2914,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938],{"class":333,"line":470},[331,2915,2146],{"class":344},[331,2917,2149],{"class":348},[331,2919,362],{"class":352},[331,2921,379],{"class":352},[331,2923,2464],{"class":382},[331,2925,427],{"class":352},[331,2927,906],{"class":430},[331,2929,385],{"class":352},[331,2931,621],{"class":375},[331,2933,2475],{"class":344},[331,2935,2478],{"class":348},[331,2937,1565],{"class":352},[331,2939,2483],{"class":337},[331,2941,2942],{"class":333,"line":476},[331,2943,490],{"emptyLinePlaceholder":489},[331,2945,2946],{"class":333,"line":486},[331,2947,2948],{"class":337},"\u002F\u002F Imported mapper not allowed — must be defined inline\n",[331,2950,2951,2953,2955,2958,2960,2962,2964,2966,2968],{"class":333,"line":493},[331,2952,2726],{"class":413},[331,2954,1063],{"class":352},[331,2956,2957],{"class":348},"myMapper",[331,2959,479],{"class":352},[331,2961,2736],{"class":413},[331,2963,365],{"class":352},[331,2965,2741],{"class":356},[331,2967,353],{"class":352},[331,2969,407],{"class":352},[331,2971,2972,2974,2976,2978,2981,2983],{"class":333,"line":499},[331,2973,2146],{"class":344},[331,2975,2149],{"class":348},[331,2977,362],{"class":352},[331,2979,2980],{"class":348}," myMapper)",[331,2982,1565],{"class":352},[331,2984,2985],{"class":337}," \u002F\u002F ❌ Error: argument \"myMapper\" is imported from another module\n",[210,2987,2989],{"id":2988},"non-vite-clients-named-pure-functions","Non-Vite Clients (Named Pure Functions)",[201,2991,2992,2993,2996,2997,2999],{},"When the client is ",[205,2994,2995],{},"not"," built with Vite (e.g., Next.js with Turbopack), the automatic hash injection cannot run. Instead, you provide an explicit ",[205,2998,1301],{}," as a string literal argument:",[322,3001,3005],{"className":3002,"code":3003,"language":3004,"meta":327,"style":327},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {pureServerFn} from '@mionjs\u002Fcore';\nimport {serverMapFrom} from '@mionjs\u002Fclient';\n\n\u002F\u002F Name replaces the auto-generated SHA-256 hash\nconst addOne = pureServerFn((x: number) => x + 1, 'addOne');\nconst userToId = serverMapFrom(userSub, (user) => user.id, 'userToId');\n","typescript",[248,3006,3007,3028,3049,3053,3058,3102],{"__ignoreMap":327},[331,3008,3009,3011,3013,3015,3017,3019,3021,3024,3026],{"class":333,"line":334},[331,3010,2726],{"class":413},[331,3012,1063],{"class":352},[331,3014,1050],{"class":348},[331,3016,479],{"class":352},[331,3018,2736],{"class":413},[331,3020,365],{"class":352},[331,3022,3023],{"class":356},"@mionjs\u002Fcore",[331,3025,353],{"class":352},[331,3027,407],{"class":352},[331,3029,3030,3032,3034,3036,3038,3040,3042,3045,3047],{"class":333,"line":341},[331,3031,2726],{"class":413},[331,3033,1063],{"class":352},[331,3035,2146],{"class":348},[331,3037,479],{"class":352},[331,3039,2736],{"class":413},[331,3041,365],{"class":352},[331,3043,3044],{"class":356},"@mionjs\u002Fclient",[331,3046,353],{"class":352},[331,3048,407],{"class":352},[331,3050,3051],{"class":333,"line":391},[331,3052,490],{"emptyLinePlaceholder":489},[331,3054,3055],{"class":333,"line":410},[331,3056,3057],{"class":337},"\u002F\u002F Name replaces the auto-generated SHA-256 hash\n",[331,3059,3060,3062,3065,3067,3069,3071,3073,3075,3077,3079,3081,3083,3085,3087,3089,3091,3093,3096,3098,3100],{"class":333,"line":442},[331,3061,704],{"class":375},[331,3063,3064],{"class":348}," addOne ",[331,3066,710],{"class":352},[331,3068,713],{"class":344},[331,3070,349],{"class":348},[331,3072,349],{"class":352},[331,3074,720],{"class":382},[331,3076,427],{"class":352},[331,3078,725],{"class":430},[331,3080,385],{"class":352},[331,3082,621],{"class":375},[331,3084,732],{"class":348},[331,3086,1505],{"class":352},[331,3088,800],{"class":403},[331,3090,362],{"class":352},[331,3092,365],{"class":352},[331,3094,3095],{"class":356},"addOne",[331,3097,353],{"class":352},[331,3099,385],{"class":348},[331,3101,407],{"class":352},[331,3103,3104,3106,3109,3111,3113,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3139,3141,3143],{"class":333,"line":470},[331,3105,704],{"class":375},[331,3107,3108],{"class":348}," userToId ",[331,3110,710],{"class":352},[331,3112,1161],{"class":344},[331,3114,3115],{"class":348},"(userSub",[331,3117,362],{"class":352},[331,3119,379],{"class":352},[331,3121,2188],{"class":382},[331,3123,385],{"class":352},[331,3125,621],{"class":375},[331,3127,2214],{"class":348},[331,3129,451],{"class":352},[331,3131,2251],{"class":348},[331,3133,362],{"class":352},[331,3135,365],{"class":352},[331,3137,3138],{"class":356},"userToId",[331,3140,353],{"class":352},[331,3142,385],{"class":348},[331,3144,407],{"class":352},[201,3146,3147],{},"The name serves as the lookup key between client and server. Both the client runtime and the server extraction use this value directly, so no Vite transform is needed.",[201,3149,3150],{},"To enforce this at build time and lint time:",[3152,3153,3154,3168],"ul",{},[975,3155,3156,3157,3160,3161,3164,3165],{},"Enable ",[248,3158,3159],{},"noViteClient: true"," in the server's ",[248,3162,3163],{},"serverPureFunctions"," config — see ",[1546,3166,144],{"href":3167},".\u002Fvite-config#non-vite-clients-nextjs-turbopack-etc",[975,3169,3170,3171,3174,3175],{},"Enable the ",[248,3172,3173],{},"@mionjs\u002Fno-vite-client"," ESLint rule — see ",[1546,3176,140],{"href":3177},".\u002Feslint-rules#mionjsno-vite-client",[3179,3180,3181,3183,3184,3187],"warning",{},[248,3182,250],{}," requires Vite build-time transforms and ",[205,3185,3186],{},"cannot be used"," in non-Vite environments.",[210,3189,3191],{"id":3190},"eslint-integration","ESLint Integration",[201,3193,1004,3194,3197,3198,3200,3201,3204],{},[248,3195,3196],{},"@mionjs\u002Fpure-functions"," ESLint rule validates purity at lint time, catching violations before they reach the build step. For non-Vite clients, the ",[248,3199,3173],{}," rule enforces explicit name arguments. See the ",[1546,3202,140],{"href":3203},".\u002Feslint-rules"," page for details.",[3206,3207,3208],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}","Learn about pure functions — registerPureFnFactory for server-to-client sharing, and pureServerFn\u002FserverMapFrom for client-to-server injection.","md",null,{"toc":26},{"title":136,"description":3209},"bQCFCMBUAYXxzT4k5BDLGBolUe8kniIQbZUXMNqOqug",[3216,3218],{"title":132,"path":133,"stem":134,"description":3217,"children":-1},"Learn how Ahead-of-Time (AOT) compilation works in mion using the Vite plugin and virtual modules.",{"title":140,"path":141,"stem":142,"description":3219,"children":-1},"ESLint rules specific for mion that ensure RunTypes works properly.",1778674529554]