[{"data":1,"prerenderedAt":939},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fguides\u002Fconfig":5,"docs-nav":738},{"items":4},[],{"id":6,"title":7,"body":8,"description":731,"extension":732,"meta":733,"navigation":114,"path":734,"seo":735,"stem":736,"__hash__":737},"docs\u002Fdocs\u002F1.guides\u002F4.config.md","Choose how it runs",{"type":9,"value":10,"toc":725},"minimark",[11,15,28,265,268,273,279,308,311,338,348,361,365,376,439,449,489,498,504,508,514,620,637,643,647,653,712,715,721],[12,13,7],"h1",{"id":14},"choose-how-it-runs",[16,17,18,19,23,24,27],"p",{},"The code of the shop names no process, no provider, no database and no protocol. Those\nchoices live in one file at the root of the project, ",[20,21,22],"code",{},"fougere.config.ts",", and none of them\nchanges a line under ",[20,25,26],{},"fronds\u002F",".",[29,30,35],"pre",{"className":31,"code":32,"language":33,"meta":34,"style":34},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F fougere.config.ts\nimport '@fougere\u002Fadapter-sql';\nimport '@fougere\u002Fadapter-rest';\nimport { defineFougere } from '@fougere\u002Fcore';\n\nexport default defineFougere({\n  fronds: { catalog: 'http:\u002F\u002F127.0.0.1:4620' },\n  ports: { Payment: 'StripePayment' },\n  sources: { main: { type: 'sqlite', path: '.data\u002Fshop.db' } },\n  protocols: { rest: {} },\n});\n","ts","",[20,36,37,46,68,82,109,116,135,162,186,234,254],{"__ignoreMap":34},[38,39,42],"span",{"class":40,"line":41},"line",1,[38,43,45],{"class":44},"skXKP","\u002F\u002F fougere.config.ts\n",[38,47,49,53,57,61,64],{"class":40,"line":48},2,[38,50,52],{"class":51},"sK6XW","import",[38,54,56],{"class":55},"sDDC1"," '",[38,58,60],{"class":59},"sN-8n","@fougere\u002Fadapter-sql",[38,62,63],{"class":55},"'",[38,65,67],{"class":66},"s15xx",";\n",[38,69,71,73,75,78,80],{"class":40,"line":70},3,[38,72,52],{"class":51},[38,74,56],{"class":55},[38,76,77],{"class":59},"@fougere\u002Fadapter-rest",[38,79,63],{"class":55},[38,81,67],{"class":66},[38,83,85,87,90,94,97,100,102,105,107],{"class":40,"line":84},4,[38,86,52],{"class":51},[38,88,89],{"class":66}," {",[38,91,93],{"class":92},"sPEhv"," defineFougere",[38,95,96],{"class":66}," }",[38,98,99],{"class":51}," from",[38,101,56],{"class":55},[38,103,104],{"class":59},"@fougere\u002Fcore",[38,106,63],{"class":55},[38,108,67],{"class":66},[38,110,112],{"class":40,"line":111},5,[38,113,115],{"emptyLinePlaceholder":114},true,"\n",[38,117,119,122,125,128,132],{"class":40,"line":118},6,[38,120,121],{"class":51},"export",[38,123,124],{"class":51}," default",[38,126,93],{"class":127},"s4mR9",[38,129,131],{"class":130},"srlTG","(",[38,133,134],{"class":66},"{\n",[38,136,138,142,145,147,150,152,154,157,159],{"class":40,"line":137},7,[38,139,141],{"class":140},"sHtqg","  fronds",[38,143,144],{"class":66},":",[38,146,89],{"class":66},[38,148,149],{"class":140}," catalog",[38,151,144],{"class":66},[38,153,56],{"class":55},[38,155,156],{"class":59},"http:\u002F\u002F127.0.0.1:4620",[38,158,63],{"class":55},[38,160,161],{"class":66}," },\n",[38,163,165,168,170,172,175,177,179,182,184],{"class":40,"line":164},8,[38,166,167],{"class":140},"  ports",[38,169,144],{"class":66},[38,171,89],{"class":66},[38,173,174],{"class":140}," Payment",[38,176,144],{"class":66},[38,178,56],{"class":55},[38,180,181],{"class":59},"StripePayment",[38,183,63],{"class":55},[38,185,161],{"class":66},[38,187,189,192,194,196,199,201,203,206,208,210,213,215,218,221,223,225,228,230,232],{"class":40,"line":188},9,[38,190,191],{"class":140},"  sources",[38,193,144],{"class":66},[38,195,89],{"class":66},[38,197,198],{"class":140}," main",[38,200,144],{"class":66},[38,202,89],{"class":66},[38,204,205],{"class":140}," type",[38,207,144],{"class":66},[38,209,56],{"class":55},[38,211,212],{"class":59},"sqlite",[38,214,63],{"class":55},[38,216,217],{"class":66},",",[38,219,220],{"class":140}," path",[38,222,144],{"class":66},[38,224,56],{"class":55},[38,226,227],{"class":59},".data\u002Fshop.db",[38,229,63],{"class":55},[38,231,96],{"class":66},[38,233,161],{"class":66},[38,235,237,240,242,244,247,249,252],{"class":40,"line":236},10,[38,238,239],{"class":140},"  protocols",[38,241,144],{"class":66},[38,243,89],{"class":66},[38,245,246],{"class":140}," rest",[38,248,144],{"class":66},[38,250,251],{"class":66}," {}",[38,253,161],{"class":66},[38,255,257,260,263],{"class":40,"line":256},11,[38,258,259],{"class":66},"}",[38,261,262],{"class":130},")",[38,264,67],{"class":66},[16,266,267],{},"Each section below is one of these keys. Leave a key out and you get the default: every\nfrond in the app's process, the only implementation of each port, rows kept in memory (a\nwarning says so), and no REST or GraphQL. The imports at the top are what make a source type\nor a protocol available: nothing is imported for you, and naming one that is not imported\nrefuses the boot, naming the import.",[269,270,272],"h2",{"id":271},"where-each-frond-runs","Where each frond runs",[16,274,275,278],{},[20,276,277],{},"fronds:"," gives a frond an address. Start the catalog alone:",[29,280,284],{"className":281,"code":282,"language":283,"meta":34,"style":34},"language-bash shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","fougere dev catalog --port 4620       # in production: fougere build, then fougere serve\n","bash",[20,285,286],{"__ignoreMap":34},[38,287,288,292,295,297,301,305],{"class":40,"line":41},[38,289,291],{"class":290},"sV8pK","fougere",[38,293,294],{"class":59}," dev",[38,296,149],{"class":59},[38,298,300],{"class":299},"svHQO"," --port",[38,302,304],{"class":303},"s3dPA"," 4620",[38,306,307],{"class":44},"       # in production: fougere build, then fougere serve\n",[16,309,310],{},"and name that address:",[29,312,314],{"className":31,"code":313,"language":33,"meta":34,"style":34},"fronds: { catalog: 'http:\u002F\u002F127.0.0.1:4620' },\n",[20,315,316],{"__ignoreMap":34},[38,317,318,322,324,326,328,330,332,334,336],{"class":40,"line":41},[38,319,321],{"class":320},"sWI7z","fronds",[38,323,144],{"class":66},[38,325,89],{"class":66},[38,327,149],{"class":320},[38,329,144],{"class":66},[38,331,56],{"class":55},[38,333,156],{"class":59},[38,335,63],{"class":55},[38,337,161],{"class":66},[16,339,340,343,344,347],{},[20,341,342],{},"PriceHandler"," keeps calling ",[20,345,346],{},"this.catalog.list()","; the call now crosses the network.\nRemove the line and the catalog runs in the app's process again.",[16,349,350,351,356,357],{},"→ ",[352,353,355],"a",{"href":354},"\u002Fdocs\u002Fguides\u002Ftopology#moving-a-frond","Shape your topology"," · ",[352,358,360],{"href":359},"\u002Fdocs\u002Finfra\u002Fgradient","The gradient",[269,362,364],{"id":363},"what-answers-a-port","What answers a port",[16,366,367,368,371,372,375],{},"When two classes extend ",[20,369,370],{},"Payment",", the app stops at boot until ",[20,373,374],{},"ports:"," says which one\nanswers:",[29,377,379],{"className":31,"code":378,"language":33,"meta":34,"style":34},"ports: { Payment: process.env.NODE_ENV === 'production' ? 'StripePayment' : 'FakePayment' },\n",[20,380,381],{"__ignoreMap":34},[38,382,383,386,388,390,392,394,397,399,403,405,408,411,413,416,418,421,423,425,427,430,432,435,437],{"class":40,"line":41},[38,384,385],{"class":320},"ports",[38,387,144],{"class":66},[38,389,89],{"class":66},[38,391,174],{"class":320},[38,393,144],{"class":66},[38,395,396],{"class":92}," process",[38,398,27],{"class":66},[38,400,402],{"class":401},"sy9f4","env",[38,404,27],{"class":66},[38,406,407],{"class":401},"NODE_ENV",[38,409,410],{"class":66}," ===",[38,412,56],{"class":55},[38,414,415],{"class":59},"production",[38,417,63],{"class":55},[38,419,420],{"class":66}," ?",[38,422,56],{"class":55},[38,424,181],{"class":59},[38,426,63],{"class":55},[38,428,429],{"class":66}," :",[38,431,56],{"class":55},[38,433,434],{"class":59},"FakePayment",[38,436,63],{"class":55},[38,438,161],{"class":66},[16,440,441,442,445,446,448],{},"The same key stacks classes in front of it, from the outside in. ",[20,443,444],{},"RetryingPayment"," extends\n",[20,447,370],{}," and asks for one, so it wraps whatever comes after it in the list:",[29,450,452],{"className":31,"code":451,"language":33,"meta":34,"style":34},"ports: { Payment: ['RetryingPayment', 'StripePayment'] },\n",[20,453,454],{"__ignoreMap":34},[38,455,456,458,460,462,464,466,470,472,474,476,478,480,482,484,487],{"class":40,"line":41},[38,457,385],{"class":320},[38,459,144],{"class":66},[38,461,89],{"class":66},[38,463,174],{"class":320},[38,465,144],{"class":66},[38,467,469],{"class":468},"spAFX"," [",[38,471,63],{"class":55},[38,473,444],{"class":59},[38,475,63],{"class":55},[38,477,217],{"class":66},[38,479,56],{"class":55},[38,481,181],{"class":59},[38,483,63],{"class":55},[38,485,486],{"class":468},"]",[38,488,161],{"class":66},[16,490,491,494,495,497],{},[20,492,493],{},"CheckoutHandler"," still asks for ",[20,496,370],{},", and never learns which one it got.",[16,499,350,500],{},[352,501,503],{"href":502},"\u002Fdocs\u002Fbusiness\u002Fports","Ports",[269,505,507],{"id":506},"where-rows-live","Where rows live",[16,509,510,513],{},[20,511,512],{},"sources:"," names each place rows live. The one entry that lists no entities holds every\nentity the others do not; an entry that lists some moves them elsewhere: another database, a\ndirectory of JSON files, or memory.",[29,515,517],{"className":31,"code":516,"language":33,"meta":34,"style":34},"sources: {\n  main: { type: 'sqlite', path: '.data\u002Fshop.db' },\n  archive: { type: 'file', path: '.\u002Farchive', entities: ['Order'] },\n},\n",[20,518,519,529,562,615],{"__ignoreMap":34},[38,520,521,524,526],{"class":40,"line":41},[38,522,523],{"class":320},"sources",[38,525,144],{"class":66},[38,527,528],{"class":66}," {\n",[38,530,531,534,536,538,540,542,544,546,548,550,552,554,556,558,560],{"class":40,"line":48},[38,532,533],{"class":320},"  main",[38,535,144],{"class":66},[38,537,89],{"class":66},[38,539,205],{"class":320},[38,541,144],{"class":66},[38,543,56],{"class":55},[38,545,212],{"class":59},[38,547,63],{"class":55},[38,549,217],{"class":66},[38,551,220],{"class":320},[38,553,144],{"class":66},[38,555,56],{"class":55},[38,557,227],{"class":59},[38,559,63],{"class":55},[38,561,161],{"class":66},[38,563,564,567,569,571,573,575,577,580,582,584,586,588,590,593,595,597,600,602,604,606,609,611,613],{"class":40,"line":70},[38,565,566],{"class":320},"  archive",[38,568,144],{"class":66},[38,570,89],{"class":66},[38,572,205],{"class":320},[38,574,144],{"class":66},[38,576,56],{"class":55},[38,578,579],{"class":59},"file",[38,581,63],{"class":55},[38,583,217],{"class":66},[38,585,220],{"class":320},[38,587,144],{"class":66},[38,589,56],{"class":55},[38,591,592],{"class":59},".\u002Farchive",[38,594,63],{"class":55},[38,596,217],{"class":66},[38,598,599],{"class":320}," entities",[38,601,144],{"class":66},[38,603,469],{"class":468},[38,605,63],{"class":55},[38,607,608],{"class":59},"Order",[38,610,63],{"class":55},[38,612,486],{"class":468},[38,614,161],{"class":66},[38,616,617],{"class":40,"line":84},[38,618,619],{"class":66},"},\n",[16,621,622,624,625,628,629,632,633,636],{},[20,623,608],{}," is now read and written as files under ",[20,626,627],{},"archive\u002F"," (with ",[20,630,631],{},"import '@fougere\u002Fadapter-file'","\nat the top); every other entity stays in ",[20,634,635],{},"main",". The repository a handler asks for is the same\neither way.",[16,638,350,639],{},[352,640,642],{"href":641},"\u002Fdocs\u002Finfra\u002Fsources","Sources",[269,644,646],{"id":645},"what-the-app-serves","What the app serves",[16,648,649,652],{},[20,650,651],{},"protocols:"," says which APIs the app answers on, beside the calls its own pages make. The\noperations are served on each one:",[29,654,656],{"className":31,"code":655,"language":33,"meta":34,"style":34},"import '@fougere\u002Fadapter-rest';\nimport '@fougere\u002Fadapter-graphql';\n\nprotocols: { rest: {}, graphql: {} },\n",[20,657,658,670,683,687],{"__ignoreMap":34},[38,659,660,662,664,666,668],{"class":40,"line":41},[38,661,52],{"class":51},[38,663,56],{"class":55},[38,665,77],{"class":59},[38,667,63],{"class":55},[38,669,67],{"class":66},[38,671,672,674,676,679,681],{"class":40,"line":48},[38,673,52],{"class":51},[38,675,56],{"class":55},[38,677,678],{"class":59},"@fougere\u002Fadapter-graphql",[38,680,63],{"class":55},[38,682,67],{"class":66},[38,684,685],{"class":40,"line":70},[38,686,115],{"emptyLinePlaceholder":114},[38,688,689,692,694,696,698,700,703,706,708,710],{"class":40,"line":84},[38,690,691],{"class":320},"protocols",[38,693,144],{"class":66},[38,695,89],{"class":66},[38,697,246],{"class":320},[38,699,144],{"class":66},[38,701,702],{"class":66}," {},",[38,704,705],{"class":320}," graphql",[38,707,144],{"class":66},[38,709,251],{"class":66},[38,711,161],{"class":66},[16,713,714],{},"Importing the adapter makes a protocol available; naming it here is what serves it — a helper\nimported from the package anywhere else opens nothing.",[16,716,350,717],{},[352,718,720],{"href":719},"\u002Fdocs\u002Finfra\u002Fsurfaces","Surfaces",[722,723,724],"style",{},"html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--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 .sV8pK, html code.shiki .sV8pK{--shiki-light:#E2931D;--shiki-default:#C9B6EA;--shiki-dark:#FFCB6B}html pre.shiki code .svHQO, html code.shiki .svHQO{--shiki-light:#91B859;--shiki-default:#8FCF86;--shiki-dark:#C3E88D}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}",{"title":34,"searchDepth":48,"depth":48,"links":726},[727,728,729,730],{"id":271,"depth":48,"text":272},{"id":363,"depth":48,"text":364},{"id":506,"depth":48,"text":507},{"id":645,"depth":48,"text":646},"One file decides where each frond runs, what answers each port, where rows live and what the app serves.","md",{},"\u002Fdocs\u002Fguides\u002Fconfig",{"title":7,"description":731},"docs\u002F1.guides\u002F4.config","ACAX_gR2l3fNtmViIIyxO0EXxh-FafQjJV3ivXN70yI",[739],{"title":740,"path":741,"stem":742,"children":743,"page":-1},"Docs","\u002Fdocs","docs",[744,747,751,755,759,763,767,785,806,831,878,903],{"title":745,"path":741,"stem":746},"What is Fougere","docs\u002Findex",{"title":748,"path":749,"stem":750},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":752,"path":753,"stem":754},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":756,"path":757,"stem":758},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":760,"path":761,"stem":762},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":764,"path":765,"stem":766},"Demos","\u002Fdocs\u002Fdemos","docs\u002F05.demos",{"title":768,"path":769,"stem":770,"children":771,"page":784},"Guides","\u002Fdocs\u002Fguides","docs\u002F1.guides",[772,776,780,783],{"title":773,"path":774,"stem":775},"Handle your business logic","\u002Fdocs\u002Fguides\u002Fbusiness-logic","docs\u002F1.guides\u002F1.business-logic",{"title":777,"path":778,"stem":779},"Store your data","\u002Fdocs\u002Fguides\u002Fdata","docs\u002F1.guides\u002F2.data",{"title":355,"path":781,"stem":782},"\u002Fdocs\u002Fguides\u002Ftopology","docs\u002F1.guides\u002F3.topology",{"title":7,"path":734,"stem":736},false,{"title":786,"path":787,"stem":788,"children":789,"page":784},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[790,794,798,802],{"title":791,"path":792,"stem":793},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":795,"path":796,"stem":797},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":799,"path":800,"stem":801},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":803,"path":804,"stem":805},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",{"title":807,"path":808,"stem":809,"children":810,"page":784},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[811,815,819,823,827],{"title":812,"path":813,"stem":814},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":816,"path":817,"stem":818},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":820,"path":821,"stem":822},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":824,"path":825,"stem":826},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":828,"path":829,"stem":830},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":832,"path":833,"stem":834,"children":835,"page":784},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[836,840,842,846,850,854,858,862,866,870,874],{"title":837,"path":838,"stem":839},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":503,"path":502,"stem":841},"docs\u002F4.business\u002F10.ports",{"title":843,"path":844,"stem":845},"Caller state","\u002Fdocs\u002Fbusiness\u002Fstate","docs\u002F4.business\u002F11.state",{"title":847,"path":848,"stem":849},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":851,"path":852,"stem":853},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":855,"path":856,"stem":857},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":859,"path":860,"stem":861},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":863,"path":864,"stem":865},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":867,"path":868,"stem":869},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":871,"path":872,"stem":873},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":875,"path":876,"stem":877},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":879,"path":880,"stem":881,"children":882,"page":784},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[883,887,891,895,899],{"title":884,"path":885,"stem":886},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":888,"path":889,"stem":890},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":892,"path":893,"stem":894},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":896,"path":897,"stem":898},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":900,"path":901,"stem":902},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":904,"path":905,"stem":906,"children":907,"page":784},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[908,910,913,917,921,923,927,931,935],{"title":360,"path":359,"stem":909},"docs\u002F6.infra\u002F1.gradient",{"title":911,"path":719,"stem":912},"Surfaces — REST & GraphQL","docs\u002F6.infra\u002F2.surfaces",{"title":914,"path":915,"stem":916},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":918,"path":919,"stem":920},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":642,"path":641,"stem":922},"docs\u002F6.infra\u002F5.sources",{"title":924,"path":925,"stem":926},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":928,"path":929,"stem":930},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":932,"path":933,"stem":934},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":936,"path":937,"stem":938},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",1792704168333]