[{"data":1,"prerenderedAt":1019},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Finfra\u002Fhosts":186},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,50,75,120,145],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":25,"path":26,"stem":27},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":29,"path":30,"stem":31,"children":32,"page":49},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[33,37,41,45],{"title":34,"path":35,"stem":36},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":38,"path":39,"stem":40},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":42,"path":43,"stem":44},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":46,"path":47,"stem":48},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[55,59,63,67,71],{"title":56,"path":57,"stem":58},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":60,"path":61,"stem":62},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":64,"path":65,"stem":66},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":68,"path":69,"stem":70},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":72,"path":73,"stem":74},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":76,"path":77,"stem":78,"children":79,"page":49},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[80,84,88,92,96,100,104,108,112,116],{"title":81,"path":82,"stem":83},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":85,"path":86,"stem":87},"Ports","\u002Fdocs\u002Fbusiness\u002Fports","docs\u002F4.business\u002F10.ports",{"title":89,"path":90,"stem":91},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":93,"path":94,"stem":95},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":97,"path":98,"stem":99},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":101,"path":102,"stem":103},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":105,"path":106,"stem":107},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":109,"path":110,"stem":111},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":113,"path":114,"stem":115},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":117,"path":118,"stem":119},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":121,"path":122,"stem":123,"children":124,"page":49},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[125,129,133,137,141],{"title":126,"path":127,"stem":128},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":130,"path":131,"stem":132},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":134,"path":135,"stem":136},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":138,"path":139,"stem":140},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":142,"path":143,"stem":144},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":146,"path":147,"stem":148,"children":149,"page":49},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":155,"path":156,"stem":157},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":159,"path":160,"stem":161},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":163,"path":164,"stem":165},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":167,"path":168,"stem":169},"Sources","\u002Fdocs\u002Finfra\u002Fsources","docs\u002F6.infra\u002F5.sources",{"title":171,"path":172,"stem":173},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":175,"path":176,"stem":177},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":179,"path":180,"stem":181},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":183,"path":184,"stem":185},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",{"id":187,"title":163,"body":188,"description":1014,"extension":1015,"meta":1016,"navigation":694,"path":164,"seo":1017,"stem":165,"__hash__":1018},"docs_en\u002Fdocs\u002F6.infra\u002F4.hosts.md",{"type":189,"value":190,"toc":1006},"minimark",[191,195,216,223,228,339,360,364,383,491,507,514,517,521,528,534,620,642,654,766,773,778,782,797,818,821,825,832,840,856,901,971,974,980,984,1002],[192,193,163],"h1",{"id":194},"hosts",[196,197,198,199,203,204,208,209,211,212,215],"p",{},"A ",[200,201,202],"strong",{},"host"," is whatever serves HTTP: Nuxt, Next, TanStack Start, React Router, SvelteKit,\nExpress. A Frond does not know which one it runs under, and nothing in ",[205,206,207],"code",{},"fronds\u002F"," imports\none — the five demos serving the same blog under Next, TanStack Start, React Router,\nSvelteKit and Express share a ",[205,210,207],{}," directory that is identical byte for byte.\n(",[205,213,214],{},"demos\u002Fnuxt-blog"," is the flagship and carries more: presenters, collectors, a named\nsurface.)",[196,217,218,219,222],{},"What a host does is mount three doors and, if it renders pages, offer the four client\nprimitives. Everything else — the boot, the judge, the REST table, the form contract —\nlives in ",[205,220,221],{},"@fougere\u002Fapp"," and is the same everywhere.",[224,225,227],"h2",{"id":226},"what-each-host-costs","What each host costs",[229,230,231,247],"table",{},[232,233,234],"thead",{},[235,236,237,241,244],"tr",{},[238,239,240],"th",{},"Host",[238,242,243],{},"Package",[238,245,246],{},"What you write",[248,249,250,267,283,297,309,325],"tbody",{},[235,251,252,256,261],{},[253,254,255],"td",{},"Nuxt",[253,257,258],{},[205,259,260],{},"@fougere\u002Fnuxt",[253,262,263,264],{},"one line in ",[205,265,266],{},"nuxt.config",[235,268,269,272,277],{},[253,270,271],{},"Next",[253,273,274],{},[205,275,276],{},"@fougere\u002Fnext",[253,278,279,280],{},"three one-line route files + ",[205,281,282],{},"withFougere()",[235,284,285,288,294],{},[253,286,287],{},"TanStack Start",[253,289,290],{},[291,292,293],"em",{},"none",[253,295,296],{},"three route files + the Vite plugin",[235,298,299,302,306],{},[253,300,301],{},"React Router",[253,303,304],{},[291,305,293],{},[253,307,308],{},"three resource routes + the Vite plugin",[235,310,311,314,318],{},[253,312,313],{},"SvelteKit",[253,315,316],{},[291,317,293],{},[253,319,320,321,324],{},"three ",[205,322,323],{},"+server.ts"," + the Vite plugin",[235,326,327,330,334],{},[253,328,329],{},"Express",[253,331,332],{},[291,333,293],{},[253,335,336],{},[205,337,338],{},"app.use(fougere())",[196,340,341,342,345,346,349,350,352,353,356,357,359],{},"Three hosts need no package of their own, and that is not an accident: they serve\nWeb-standard ",[205,343,344],{},"Request","\u002F",[205,347,348],{},"Response",", so the doors go in unchanged. ",[205,351,276],{}," exists\nbecause Next has ",[205,354,355],{},"next\u002Fheaders"," — one import — and Nuxt's module is larger because an h3\nevent is not a ",[205,358,344],{},".",[224,361,363],{"id":362},"what-an-app-publishes","What an app publishes",[196,365,366,367,370,371,374,375,378,379,382],{},"Which protocol adapters are served is a fact about the ",[200,368,369],{},"app",", declared once beside\n",[205,372,373],{},"db",", ",[205,376,377],{},"remotes"," and ",[205,380,381],{},"auth",":",[384,385,390],"pre",{"className":386,"code":387,"language":388,"meta":389,"style":389},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fougere.config.ts\nexport default defineFougere({\n  db: 'sqlite',\n  adapters: { rest: true, graphql: true },\n});\n","ts","",[205,391,392,401,423,446,479],{"__ignoreMap":389},[393,394,397],"span",{"class":395,"line":396},"line",1,[393,398,400],{"class":399},"sutJx","\u002F\u002F fougere.config.ts\n",[393,402,404,408,411,415,419],{"class":395,"line":403},2,[393,405,407],{"class":406},"sVHd0","export",[393,409,410],{"class":406}," default",[393,412,414],{"class":413},"sGLFI"," defineFougere",[393,416,418],{"class":417},"su5hD","(",[393,420,422],{"class":421},"sP7_E","{\n",[393,424,426,430,432,436,440,443],{"class":395,"line":425},3,[393,427,429],{"class":428},"skxfh","  db",[393,431,382],{"class":421},[393,433,435],{"class":434},"sjJ54"," '",[393,437,439],{"class":438},"s_sjI","sqlite",[393,441,442],{"class":434},"'",[393,444,445],{"class":421},",\n",[393,447,449,452,454,457,460,462,466,469,472,474,476],{"class":395,"line":448},4,[393,450,451],{"class":428},"  adapters",[393,453,382],{"class":421},[393,455,456],{"class":421}," {",[393,458,459],{"class":428}," rest",[393,461,382],{"class":421},[393,463,465],{"class":464},"syTEX"," true",[393,467,468],{"class":421},",",[393,470,471],{"class":428}," graphql",[393,473,382],{"class":421},[393,475,465],{"class":464},[393,477,478],{"class":421}," },\n",[393,480,482,485,488],{"class":395,"line":481},5,[393,483,484],{"class":421},"}",[393,486,487],{"class":417},")",[393,489,490],{"class":421},";\n",[196,492,493,496,497,374,500,378,503,506],{},[205,494,495],{},"graphql: true"," is the whole GraphQL setup: the schema is built from the entities the\napp already scanned, so there is no builder to construct and no types to register.\n",[205,498,499],{},"@fougere\u002Fadapter-graphql",[205,501,502],{},"@pothos\u002Fcore",[205,504,505],{},"graphql"," are imported only when you\ndeclare it — an app that serves none does not carry a schema builder to find that out.",[196,508,509,510,513],{},"Absent means not served. The door may be mounted — the route file exists, the\nmiddleware is installed — and it will still decline, because the host does not get to\nmake this decision. ",[205,511,512],{},"serveRest"," reads the declaration itself, so all six hosts inherit\none answer instead of each spelling it their own way.",[196,515,516],{},"The call envelope is not listed there: it is the wire the client primitives use, not a\nprojection an app chooses to publish.",[224,518,520],{"id":519},"mounting-the-doors","Mounting the doors",[196,522,523,524,527],{},"Mounting a door is not the same as publishing an adapter: what you write below puts\nthe door in place, and ",[205,525,526],{},"adapters:"," decides whether it serves anything.",[196,529,530,533],{},[200,531,532],{},"A Web-standard host"," — Next, TanStack Start, React Router, SvelteKit — mounts the\nhandlers directly:",[384,535,537],{"className":386,"code":536,"language":388,"meta":389,"style":389},"\u002F\u002F SvelteKit — src\u002Froutes\u002F_fougere\u002Fcall\u002F+server.ts\nimport { fougereCall } from '@fougere\u002Fapp\u002Fweb';\nexport const POST = ({ request }: { request: Request }) => fougereCall(request);\n",[205,538,539,544,569],{"__ignoreMap":389},[393,540,541],{"class":395,"line":396},[393,542,543],{"class":399},"\u002F\u002F SvelteKit — src\u002Froutes\u002F_fougere\u002Fcall\u002F+server.ts\n",[393,545,546,549,551,554,557,560,562,565,567],{"class":395,"line":403},[393,547,548],{"class":406},"import",[393,550,456],{"class":421},[393,552,553],{"class":417}," fougereCall",[393,555,556],{"class":421}," }",[393,558,559],{"class":406}," from",[393,561,435],{"class":434},[393,563,564],{"class":438},"@fougere\u002Fapp\u002Fweb",[393,566,442],{"class":434},[393,568,490],{"class":421},[393,570,571,573,577,581,585,588,592,594,596,598,601,603,607,610,613,615,618],{"class":395,"line":425},[393,572,407],{"class":406},[393,574,576],{"class":575},"sbsja"," const",[393,578,580],{"class":579},"sfCm-"," POST",[393,582,584],{"class":583},"smGrS"," =",[393,586,587],{"class":421}," ({",[393,589,591],{"class":590},"s99_P"," request",[393,593,556],{"class":421},[393,595,382],{"class":583},[393,597,456],{"class":421},[393,599,591],{"class":600},"sucvu",[393,602,382],{"class":583},[393,604,606],{"class":605},"sbgvK"," Request",[393,608,609],{"class":421}," })",[393,611,612],{"class":575}," =>",[393,614,553],{"class":413},[393,616,617],{"class":417},"(request)",[393,619,490],{"class":421},[196,621,622,374,625,378,628,631,632,634,635,637,638,641],{},[205,623,624],{},"fougereCall",[205,626,627],{},"fougereRest",[205,629,630],{},"fougereSession"," take a ",[205,633,344],{}," and return a\n",[205,636,348],{},". The file you create ",[291,639,640],{},"is"," the consent: no file, no door.",[196,643,644,646,647,650,651,382],{},[200,645,329],{}," adds them as middlewares, like ",[205,648,649],{},"express.json()"," or ",[205,652,653],{},"cors()",[384,655,657],{"className":386,"code":656,"language":388,"meta":389,"style":389},"import { fougere, fougereCall, fougereRest } from '@fougere\u002Fapp\u002Fexpress';\n\napp.use(fougere());                 \u002F\u002F the three doors\napp.use(fougereCall());             \u002F\u002F or one at a time — the envelope serves your\napp.use('\u002Fadmin', fougereRest());   \u002F\u002F pages, REST is public. Not one decision.\n",[205,658,659,690,696,719,738],{"__ignoreMap":389},[393,660,661,663,665,668,670,672,674,677,679,681,683,686,688],{"class":395,"line":396},[393,662,548],{"class":406},[393,664,456],{"class":421},[393,666,667],{"class":417}," fougere",[393,669,468],{"class":421},[393,671,553],{"class":417},[393,673,468],{"class":421},[393,675,676],{"class":417}," fougereRest",[393,678,556],{"class":421},[393,680,559],{"class":406},[393,682,435],{"class":434},[393,684,685],{"class":438},"@fougere\u002Fapp\u002Fexpress",[393,687,442],{"class":434},[393,689,490],{"class":421},[393,691,692],{"class":395,"line":403},[393,693,695],{"emptyLinePlaceholder":694},true,"\n",[393,697,698,700,702,705,707,710,713,716],{"class":395,"line":425},[393,699,369],{"class":417},[393,701,359],{"class":421},[393,703,704],{"class":413},"use",[393,706,418],{"class":417},[393,708,709],{"class":413},"fougere",[393,711,712],{"class":417},"())",[393,714,715],{"class":421},";",[393,717,718],{"class":399},"                 \u002F\u002F the three doors\n",[393,720,721,723,725,727,729,731,733,735],{"class":395,"line":448},[393,722,369],{"class":417},[393,724,359],{"class":421},[393,726,704],{"class":413},[393,728,418],{"class":417},[393,730,624],{"class":413},[393,732,712],{"class":417},[393,734,715],{"class":421},[393,736,737],{"class":399},"             \u002F\u002F or one at a time — the envelope serves your\n",[393,739,740,742,744,746,748,750,753,755,757,759,761,763],{"class":395,"line":481},[393,741,369],{"class":417},[393,743,359],{"class":421},[393,745,704],{"class":413},[393,747,418],{"class":417},[393,749,442],{"class":434},[393,751,752],{"class":438},"\u002Fadmin",[393,754,442],{"class":434},[393,756,468],{"class":421},[393,758,676],{"class":413},[393,760,712],{"class":417},[393,762,715],{"class":421},[393,764,765],{"class":399},"   \u002F\u002F pages, REST is public. Not one decision.\n",[196,767,768,769,772],{},"A path Fougere does not serve calls ",[205,770,771],{},"next()",", so an app's own routes keep answering\nwhether they were registered before or after.",[196,774,775,777],{},[200,776,255],{}," mounts them itself — its module has an API for that, and adds the composables\nat the same time.",[224,779,781],{"id":780},"the-client-primitives","The client primitives",[196,783,784,374,787,374,790,378,793,796],{},[205,785,786],{},"useQuery",[205,788,789],{},"useCommand",[205,791,792],{},"useFormFor",[205,794,795],{},"useCurrentUser"," exist per UI framework, not\nper host:",[798,799,800,807,813],"ul",{},[801,802,803,806],"li",{},[205,804,805],{},"@fougere\u002Freact"," — React, whatever renders it",[801,808,809,812],{},[205,810,811],{},"@fougere\u002Fsvelte"," — Svelte, as stores",[801,814,815,817],{},[205,816,260],{}," — Vue, through Nuxt's own data layer",[196,819,820],{},"The rules they obey are shared: designation is class + verb, and a command on an entity\nrevalidates every mounted query on that entity. Only the state model differs.",[224,822,824],{"id":823},"the-one-thing-every-bundler-must-be-told","The one thing every bundler must be told",[196,826,827,828,831],{},"Designation reads the entity's class name, and that name travels — it is the JSON-RPC\nmethod (",[205,829,830],{},"post.list",") and the REST path. A minifier renames classes, so a production build\nwould designate an entity nobody hosts:",[384,833,838],{"className":834,"code":836,"language":837},[835],"language-text","Entity 'j' is not hosted here. Hosted here: post.\n","text",[205,839,836],{"__ignoreMap":389},[196,841,842,843,378,845,848,849,852,853,855],{},"You do not have to declare anything for this. ",[205,844,260],{},[205,846,847],{},"@fougere\u002Fvite"," reserve\nthe entity names for you — the first from the scan it just ran, the second by reading\n",[205,850,851],{},"fronds\u002F\u003Cfrond>\u002Fentities\u002F",". On Next, ",[205,854,282],{}," does the same through webpack:",[384,857,859],{"className":386,"code":858,"language":388,"meta":389,"style":389},"\u002F\u002F next.config.mjs\nimport { withFougere } from '@fougere\u002Fnext\u002Fconfig';\nexport default withFougere();\n",[205,860,861,866,888],{"__ignoreMap":389},[393,862,863],{"class":395,"line":396},[393,864,865],{"class":399},"\u002F\u002F next.config.mjs\n",[393,867,868,870,872,875,877,879,881,884,886],{"class":395,"line":403},[393,869,548],{"class":406},[393,871,456],{"class":421},[393,873,874],{"class":417}," withFougere",[393,876,556],{"class":421},[393,878,559],{"class":406},[393,880,435],{"class":434},[393,882,883],{"class":438},"@fougere\u002Fnext\u002Fconfig",[393,885,442],{"class":434},[393,887,490],{"class":421},[393,889,890,892,894,896,899],{"class":395,"line":425},[393,891,407],{"class":406},[393,893,410],{"class":406},[393,895,874],{"class":413},[393,897,898],{"class":417},"()",[393,900,490],{"class":421},[384,902,904],{"className":386,"code":903,"language":388,"meta":389,"style":389},"\u002F\u002F vite.config.ts — TanStack Start, React Router, SvelteKit\nimport { fougere } from '@fougere\u002Fvite';\nexport default defineConfig({ plugins: [fougere(), sveltekit()] });\n",[205,905,906,911,931],{"__ignoreMap":389},[393,907,908],{"class":395,"line":396},[393,909,910],{"class":399},"\u002F\u002F vite.config.ts — TanStack Start, React Router, SvelteKit\n",[393,912,913,915,917,919,921,923,925,927,929],{"class":395,"line":403},[393,914,548],{"class":406},[393,916,456],{"class":421},[393,918,667],{"class":417},[393,920,556],{"class":421},[393,922,559],{"class":406},[393,924,435],{"class":434},[393,926,847],{"class":438},[393,928,442],{"class":434},[393,930,490],{"class":421},[393,932,933,935,937,940,942,945,948,950,953,955,957,959,962,965,967,969],{"class":395,"line":425},[393,934,407],{"class":406},[393,936,410],{"class":406},[393,938,939],{"class":413}," defineConfig",[393,941,418],{"class":417},[393,943,944],{"class":421},"{",[393,946,947],{"class":428}," plugins",[393,949,382],{"class":421},[393,951,952],{"class":417}," [",[393,954,709],{"class":413},[393,956,898],{"class":417},[393,958,468],{"class":421},[393,960,961],{"class":413}," sveltekit",[393,963,964],{"class":417},"()] ",[393,966,484],{"class":421},[393,968,487],{"class":417},[393,970,490],{"class":421},[196,972,973],{},"Express needs none of this: it runs your sources, nothing is minified.",[975,976,977],"callout",{},[196,978,979],{},"An app that minifies without one of these will build cleanly and fail on the first call.\nThe failure is loud — the server says which entity it does host — but it happens in\nproduction, not at build time.",[224,981,983],{"id":982},"two-hosts-at-once","Two hosts at once",[196,985,986,987,990,991,994,995,1001],{},"Nothing stops a Frond from being served by more than one host: run it in its own process\nwith ",[205,988,989],{},"serve()"," and let the others reach it through ",[205,992,993],{},"remotes:",". That is the\n",[291,996,997],{},[998,999,1000],"a",{"href":152},"gradient",", and the host is not part of the decision.",[1003,1004,1005],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":389,"searchDepth":403,"depth":403,"links":1007},[1008,1009,1010,1011,1012,1013],{"id":226,"depth":403,"text":227},{"id":362,"depth":403,"text":363},{"id":519,"depth":403,"text":520},{"id":780,"depth":403,"text":781},{"id":823,"depth":403,"text":824},{"id":982,"depth":403,"text":983},"Run the same Frond under Nuxt, Next, TanStack Start, React Router, SvelteKit or Express.","md",{},{"title":163,"description":1014},"wuqdV_ha-KHoXd0KbW11uAhNRk-1tJr9G2snT6mQnjE",1788560230883]