[{"data":1,"prerenderedAt":1019},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fdata\u002Fseveral-databases":6,"docs-uses":708,"docs-nav":881},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":694,"extension":695,"forms":696,"kind":698,"meta":699,"navigation":434,"path":700,"seo":701,"stem":702,"step":703,"uses":704,"__hash__":707},"docs\u002Fdocs\u002F3.data\u002F2.several-databases.md","Several databases",{"type":10,"value":11,"toc":688},"minimark",[12,16,21,29,181,188,192,212,219,297,300,372,387,542,545,585,599,603,609,615,633,642,646,684],[13,14,15],"p",{},"Most apps have one database and declare nothing. When there are several — a legacy database beside the main one, files for an archive — each entity says where its rows live, and a frond can still read across them.",[17,18,20],"h2",{"id":19},"one-table-a-view-per-frond","One table, a view per frond",[13,22,23,24,28],{},"Two fronds may both declare an ",[25,26,27],"code",{},"Author"," in one source. Each declares the fields it cares about, and\nthe table is their union:",[30,31,36],"pre",{"className":32,"code":33,"language":34,"meta":35,"style":35},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F fronds\u002Fblog\u002Fentities\u002FAuthor.ts        what blog knows of it\nclass Author extends entity({ id: primary(), name: text(), pen: text() }) {}\n\u002F\u002F fronds\u002Fshop\u002Fentities\u002FAuthor.ts        what shop knows of it\nclass Author extends entity({ id: primary(), name: text(), vat: text() }) {}\n\u002F\u002F table authors                         id, name, pen, vat — derived, nothing to write\n","ts","",[25,37,38,47,119,125,175],{"__ignoreMap":35},[39,40,43],"span",{"class":41,"line":42},"line",1,[39,44,46],{"class":45},"skXKP","\u002F\u002F fronds\u002Fblog\u002Fentities\u002FAuthor.ts        what blog knows of it\n",[39,48,50,54,58,61,65,69,73,77,80,83,86,89,92,94,97,99,101,104,106,108,110,113,116],{"class":41,"line":49},2,[39,51,53],{"class":52},"s76I7","class",[39,55,57],{"class":56},"sBZYL"," Author",[39,59,60],{"class":52}," extends",[39,62,64],{"class":63},"s4mR9"," entity",[39,66,68],{"class":67},"srlTG","(",[39,70,72],{"class":71},"s15xx","{",[39,74,76],{"class":75},"sHtqg"," id",[39,78,79],{"class":71},":",[39,81,82],{"class":63}," primary",[39,84,85],{"class":67},"()",[39,87,88],{"class":71},",",[39,90,91],{"class":75}," name",[39,93,79],{"class":71},[39,95,96],{"class":63}," text",[39,98,85],{"class":67},[39,100,88],{"class":71},[39,102,103],{"class":75}," pen",[39,105,79],{"class":71},[39,107,96],{"class":63},[39,109,85],{"class":67},[39,111,112],{"class":71}," }",[39,114,115],{"class":67},")",[39,117,118],{"class":71}," {}\n",[39,120,122],{"class":41,"line":121},3,[39,123,124],{"class":45},"\u002F\u002F fronds\u002Fshop\u002Fentities\u002FAuthor.ts        what shop knows of it\n",[39,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,163,165,167,169,171,173],{"class":41,"line":127},4,[39,129,53],{"class":52},[39,131,57],{"class":56},[39,133,60],{"class":52},[39,135,64],{"class":63},[39,137,68],{"class":67},[39,139,72],{"class":71},[39,141,76],{"class":75},[39,143,79],{"class":71},[39,145,82],{"class":63},[39,147,85],{"class":67},[39,149,88],{"class":71},[39,151,91],{"class":75},[39,153,79],{"class":71},[39,155,96],{"class":63},[39,157,85],{"class":67},[39,159,88],{"class":71},[39,161,162],{"class":75}," vat",[39,164,79],{"class":71},[39,166,96],{"class":63},[39,168,85],{"class":67},[39,170,112],{"class":71},[39,172,115],{"class":67},[39,174,118],{"class":71},[39,176,178],{"class":41,"line":177},5,[39,179,180],{"class":45},"\u002F\u002F table authors                         id, name, pen, vat — derived, nothing to write\n",[13,182,183,184,187],{},"Each writes and reads its own columns, and never sees the other's. A column one view leaves out is\noptional in the table, since what is required is each frond's to judge on its own writes. A field both\ndeclare must be declared the same way — one column has one shape — or the boot refuses, naming it and\nboth fronds (",[25,185,186],{},"table-contradicted","). In two sources, they are two tables and nothing is shared.",[17,189,191],{"id":190},"reading-across-them","Reading across them",[13,193,194,195,202,203,207,208,211],{},"Reads by key (",[196,197,199],"a",{"href":198},"\u002Fdocs\u002Fextending\u002Fsource-adapter#reading-a-set-not-a-row-at-a-time",[25,200,201],{},"findByKeys",") can\n",[204,205,206],"strong",{},"complete"," a page — \"I hold these rows, give me the related ones\" — but cannot ",[204,209,210],{},"choose"," one. Filtering, sorting, paginating or counting on the other side collapses into\nreading that side whole — and \"my loans, newest book first\" crosses.",[13,213,214,215,218],{},"That is what ",[25,216,217],{},"@fougere\u002Fadapter-duckdb"," closes. Install it with DuckDB, its peer:",[220,221,225,248,265,281],"code-group",{"className":222,"sync":224},[223],"managers","pm",[30,226,231],{"className":227,"code":228,"filename":229,"language":230,"meta":35,"style":35},"language-bash shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","npm install @fougere\u002Fadapter-duckdb @duckdb\u002Fnode-api\n","npm","bash",[25,232,233],{"__ignoreMap":35},[39,234,235,238,242,245],{"class":41,"line":42},[39,236,229],{"class":237},"sV8pK",[39,239,241],{"class":240},"sN-8n"," install",[39,243,244],{"class":240}," @fougere\u002Fadapter-duckdb",[39,246,247],{"class":240}," @duckdb\u002Fnode-api\n",[30,249,252],{"className":227,"code":250,"filename":251,"language":230,"meta":35,"style":35},"pnpm add @fougere\u002Fadapter-duckdb @duckdb\u002Fnode-api\n","pnpm",[25,253,254],{"__ignoreMap":35},[39,255,256,258,261,263],{"class":41,"line":42},[39,257,251],{"class":237},[39,259,260],{"class":240}," add",[39,262,244],{"class":240},[39,264,247],{"class":240},[30,266,269],{"className":227,"code":267,"filename":268,"language":230,"meta":35,"style":35},"bun add @fougere\u002Fadapter-duckdb @duckdb\u002Fnode-api\n","bun",[25,270,271],{"__ignoreMap":35},[39,272,273,275,277,279],{"class":41,"line":42},[39,274,268],{"class":237},[39,276,260],{"class":240},[39,278,244],{"class":240},[39,280,247],{"class":240},[30,282,285],{"className":227,"code":283,"filename":284,"language":230,"meta":35,"style":35},"yarn add @fougere\u002Fadapter-duckdb @duckdb\u002Fnode-api\n","yarn",[25,286,287],{"__ignoreMap":35},[39,288,289,291,293,295],{"class":41,"line":42},[39,290,284],{"class":237},[39,292,260],{"class":240},[39,294,244],{"class":240},[39,296,247],{"class":240},[13,298,299],{},"A frond declares what it reads:",[30,301,303],{"className":32,"code":302,"language":34,"meta":35,"style":35},"\u002F\u002F fronds\u002Flibrary\u002Ffrond.config.ts\nexport default defineFrond({\n  reads: ['Loan', 'Book'],\n});\n",[25,304,305,310,327,362],{"__ignoreMap":35},[39,306,307],{"class":41,"line":42},[39,308,309],{"class":45},"\u002F\u002F fronds\u002Flibrary\u002Ffrond.config.ts\n",[39,311,312,316,319,322,324],{"class":41,"line":49},[39,313,315],{"class":314},"sK6XW","export",[39,317,318],{"class":314}," default",[39,320,321],{"class":63}," defineFrond",[39,323,68],{"class":67},[39,325,326],{"class":71},"{\n",[39,328,329,332,334,337,341,344,346,348,351,354,356,359],{"class":41,"line":121},[39,330,331],{"class":75},"  reads",[39,333,79],{"class":71},[39,335,336],{"class":67}," [",[39,338,340],{"class":339},"sDDC1","'",[39,342,343],{"class":240},"Loan",[39,345,340],{"class":339},[39,347,88],{"class":71},[39,349,350],{"class":339}," '",[39,352,353],{"class":240},"Book",[39,355,340],{"class":339},[39,357,358],{"class":67},"]",[39,360,361],{"class":71},",\n",[39,363,364,367,369],{"class":41,"line":127},[39,365,366],{"class":71},"}",[39,368,115],{"class":67},[39,370,371],{"class":71},";\n",[13,373,374,375,378,379,382,383,386],{},"Declaring it is what makes ",[25,376,377],{},"Reads"," injectable, and it also ",[204,380,381],{},"bounds what gets attached",":\na source holding none of these is never opened, so its tables do not exist in the\nconnection. ",[25,384,385],{},"reads:"," may name any entity of the app, not only the frond's own.",[30,388,390],{"className":32,"code":389,"language":34,"meta":35,"style":35},"export default class LibraryHandler {\n  constructor(private reads: Reads) {}\n\n  async loansByLanguage() {\n    return this.reads.read(LoansByLanguage)`\n      select b.language, count(*) as loans\n      from ${Loan} l join ${Book} b on b.id = l.book_id\n      group by b.language\n      order by b.language`;\n  }\n}\n",[25,391,392,407,430,436,449,482,488,513,519,530,536],{"__ignoreMap":35},[39,393,394,396,398,401,404],{"class":41,"line":42},[39,395,315],{"class":314},[39,397,318],{"class":314},[39,399,400],{"class":52}," class",[39,402,403],{"class":56}," LibraryHandler",[39,405,406],{"class":71}," {\n",[39,408,409,412,414,417,421,423,426,428],{"class":41,"line":49},[39,410,411],{"class":52},"  constructor",[39,413,68],{"class":71},[39,415,416],{"class":52},"private",[39,418,420],{"class":419},"shDUQ"," reads",[39,422,79],{"class":71},[39,424,425],{"class":56}," Reads",[39,427,115],{"class":71},[39,429,118],{"class":71},[39,431,432],{"class":41,"line":121},[39,433,435],{"emptyLinePlaceholder":434},true,"\n",[39,437,438,441,445,447],{"class":41,"line":127},[39,439,440],{"class":52},"  async",[39,442,444],{"class":443},"shDkW"," loansByLanguage",[39,446,85],{"class":71},[39,448,406],{"class":71},[39,450,451,454,458,461,465,467,470,473,477,479],{"class":41,"line":177},[39,452,453],{"class":314},"    return",[39,455,457],{"class":456},"sxG60"," this",[39,459,460],{"class":71},".",[39,462,464],{"class":463},"sy9f4","reads",[39,466,460],{"class":71},[39,468,469],{"class":63},"read",[39,471,68],{"class":472},"spAFX",[39,474,476],{"class":475},"sPEhv","LoansByLanguage",[39,478,115],{"class":472},[39,480,481],{"class":339},"`\n",[39,483,485],{"class":41,"line":484},6,[39,486,487],{"class":240},"      select b.language, count(*) as loans\n",[39,489,491,494,497,499,501,504,506,508,510],{"class":41,"line":490},7,[39,492,493],{"class":240},"      from ",[39,495,496],{"class":71},"${",[39,498,343],{"class":475},[39,500,366],{"class":71},[39,502,503],{"class":240}," l join ",[39,505,496],{"class":71},[39,507,353],{"class":475},[39,509,366],{"class":71},[39,511,512],{"class":240}," b on b.id = l.book_id\n",[39,514,516],{"class":41,"line":515},8,[39,517,518],{"class":240},"      group by b.language\n",[39,520,522,525,528],{"class":41,"line":521},9,[39,523,524],{"class":240},"      order by b.language",[39,526,527],{"class":339},"`",[39,529,371],{"class":71},[39,531,533],{"class":41,"line":532},10,[39,534,535],{"class":71},"  }\n",[39,537,539],{"class":41,"line":538},11,[39,540,541],{"class":71},"}\n",[13,543,544],{},"Two things are held by the types rather than asked for:",[546,547,548,568],"ul",{},[549,550,551,554,555,559,560,563,564,567],"li",{},[204,552,553],{},"The shape names the answer."," The tag is only reachable ",[556,557,558],"em",{},"through"," a shape, so there is\nno query without a declared output. A raw ",[25,561,562],{},"select *"," would return the fields\n",[25,565,566],{},"boundary.out: 'closed'"," promises never leave; the projection is the fence. A column the\nshape does not name never comes out, and a shape declaring a field the query does not\nanswer fails by name rather than yielding nulls.",[549,569,570,573,574,577,578,581,582,584],{},[204,571,572],{},"Only an entity may be interpolated."," ",[25,575,576],{},"${Book}"," becomes ",[25,579,580],{},"\"archive\".\"books\""," — the alias\nand the table from one declaration. Naming an entity outside ",[25,583,385],{}," is refused, because\nits table genuinely is not in this connection.",[13,586,587,588,591,592,598],{},"Every attach is ",[25,589,590],{},"READ_ONLY",", and it is the engine that enforces it. This facade reads across\nthe app's whole storage, so it reaches as far as ",[196,593,595],{"href":594},"\u002Fdocs\u002Fextending\u002Fsource-adapter#client-and-what-it-costs",[25,596,597],{},"storage.client","\ndoes, and a write through it would meet no validator at all.",[17,600,602],{"id":601},"what-it-is-not","What it is not",[13,604,605,608],{},[204,606,607],{},"Not a query builder."," A builder across sources would promise that any query composes over any\nengine, which the engines cannot keep. The query stays SQL. What Fougere\ncontributes is the three derivations a hand-written one would duplicate: where each entity\nlives, what its table and columns are called, and the shape of the answer.",[13,610,611,614],{},[204,612,613],{},"Not the ordinary read path."," At page size DuckDB is about 100× slower than two indexed\nreads — roughly 7 ms per query, however small. Use it where a\nquestion genuinely crosses, never to fetch a page.",[13,616,617,618,621,622,625,626,632],{},"Nothing is copied. Attaching Postgres pushes the filter down — ",[25,619,620],{},"Filters: lang='fr'"," reaches\nit over 100 000 rows — so a real database is queried where it is. For a source with ",[204,623,624],{},"no","\nalgebra at all (an HTTP API, a partner's catalog), the answer is\n",[196,627,629],{"href":628},"\u002Fdocs\u002Fdata\u002Fmirror",[25,630,631],{},"Mirror"," instead.",[634,635,636],"warning",{},[13,637,638,641],{},[204,639,640],{},"There is no parameter binding."," A value goes into the query text you write, so do not\nbuild that text from user input. Filter the result, or keep the varying part out of the\nstring.",[17,643,645],{"id":644},"limits","Limits",[546,647,648,678],{},[549,649,650,653,654,657,658,661,662,665,666,669,670,673,674,677],{},[204,651,652],{},"SQL Server cannot be attached"," — no ",[25,655,656],{},"sqlserver"," extension exists for DuckDB. The\nattachable types are ",[25,659,660],{},"sqlite",", ",[25,663,664],{},"pg"," and ",[25,667,668],{},"mysql",", read off the entry as it is: a ",[25,671,672],{},"path"," for the\nfirst, a ",[25,675,676],{},"url"," for the other two. Files, memory and D1 cannot be attached either.",[549,679,680,681,683],{},"A ",[25,682,385],{}," no boot can serve is reported rather than ignored.",[685,686,687],"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 .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}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 .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}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 .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}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 .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .shDkW, html code.shiki .shDkW{--shiki-light:#E53935;--shiki-default:#C9B6EA;--shiki-dark:#F07178}html pre.shiki code .sxG60, html code.shiki .sxG60{--shiki-light:#39ADB5;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:inherit}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}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}",{"title":35,"searchDepth":49,"depth":49,"links":689},[690,691,692,693],{"id":19,"depth":49,"text":20},{"id":190,"depth":49,"text":191},{"id":601,"depth":49,"text":602},{"id":644,"depth":49,"text":645},"A second database beside the first, and one query across them.","md",[697,385],"sources.*.rows","task",{},"\u002Fdocs\u002Fdata\u002Fseveral-databases",{"title":8,"description":694},"docs\u002F3.data\u002F2.several-databases",null,[705,706],"configuration","entity","DYcqCCsiPx6PKdWGeN6mNpP_3pDH8vlFyuMg29xyCus",[709,712,715,718,721,724,727,730,733,739,744,748,750,754,758,762,766,770,774,778,783,787,792,796,800,804,808,812,816,820,824,828,832,836,840,844,848,851,854,857,860,863,866,869,872,875,878],{"path":710,"title":711,"uses":703},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":713,"title":714,"uses":703},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":716,"title":717,"uses":703},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":719,"title":720,"uses":703},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":722,"title":723,"uses":703},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":725,"title":726,"uses":703},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":728,"title":729,"uses":703},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":731,"title":732,"uses":703},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":734,"title":735,"uses":736},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[737,738],"port","frond",{"path":740,"title":741,"uses":742},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[705,743],"handler",{"path":745,"title":746,"uses":747},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[706,705],{"path":700,"title":8,"uses":749},[705,706],{"path":751,"title":752,"uses":753},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[706,737],{"path":755,"title":756,"uses":757},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[706],{"path":759,"title":760,"uses":761},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[706],{"path":763,"title":764,"uses":765},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[706,705],{"path":628,"title":767,"uses":768},"Mirror a source you cannot query",[769],"repository",{"path":771,"title":772,"uses":773},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[769],{"path":775,"title":776,"uses":777},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[737,738],{"path":779,"title":780,"uses":781},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[782],"fact",{"path":784,"title":785,"uses":786},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[743,705],{"path":788,"title":789,"uses":790},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[743,791],"facade",{"path":793,"title":794,"uses":795},"\u002Fdocs\u002Fserve\u002Fforms","A form",[706],{"path":797,"title":798,"uses":799},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[743],{"path":801,"title":802,"uses":803},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[705,738],{"path":805,"title":806,"uses":807},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[705,738],{"path":809,"title":810,"uses":811},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[705],{"path":813,"title":814,"uses":815},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[705,743],{"path":817,"title":818,"uses":819},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[743],{"path":821,"title":822,"uses":823},"\u002Fdocs\u002Frun\u002Ftest","Test",[706,737],{"path":825,"title":826,"uses":827},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[738,705],{"path":829,"title":830,"uses":831},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[738,705],{"path":833,"title":834,"uses":835},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[706],{"path":837,"title":838,"uses":839},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[705],{"path":841,"title":842,"uses":843},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[791,738],{"path":845,"title":846,"uses":847},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":849,"title":850,"uses":703},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":852,"title":853,"uses":703},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":855,"title":856,"uses":703},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":858,"title":859,"uses":703},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":861,"title":862,"uses":703},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":864,"title":865,"uses":703},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":867,"title":868,"uses":703},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":870,"title":871,"uses":703},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":873,"title":874,"uses":703},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":876,"title":877,"uses":703},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":879,"title":880,"uses":703},"\u002Fdocs","What is Fougere",[882],{"title":883,"path":879,"stem":884,"children":885,"page":-1},"Docs","docs",[886,888,909,918,938,947,960,977,994],{"title":880,"path":879,"stem":887},"docs\u002Findex",{"title":889,"path":890,"stem":891,"children":892,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[893,895,897,899,901,903,905,907],{"title":711,"path":710,"stem":894},"docs\u002F1.concepts\u002F1.entity",{"title":714,"path":713,"stem":896},"docs\u002F1.concepts\u002F2.handler",{"title":717,"path":716,"stem":898},"docs\u002F1.concepts\u002F3.repository",{"title":720,"path":719,"stem":900},"docs\u002F1.concepts\u002F4.frond",{"title":723,"path":722,"stem":902},"docs\u002F1.concepts\u002F5.facade",{"title":726,"path":725,"stem":904},"docs\u002F1.concepts\u002F6.fact",{"title":729,"path":728,"stem":906},"docs\u002F1.concepts\u002F7.port",{"title":732,"path":731,"stem":908},"docs\u002F1.concepts\u002F8.configuration",{"title":910,"path":911,"stem":912,"children":913,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[914,916],{"title":735,"path":734,"stem":915},"docs\u002F2.access\u002F1.authentication",{"title":741,"path":740,"stem":917},"docs\u002F2.access\u002F2.state",{"title":919,"path":920,"stem":921,"children":922,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[923,925,926,928,930,932,934,936],{"title":746,"path":745,"stem":924},"docs\u002F3.data\u002F1.sql",{"title":8,"path":700,"stem":702},{"title":752,"path":751,"stem":927},"docs\u002F3.data\u002F3.computed-field",{"title":756,"path":755,"stem":929},"docs\u002F3.data\u002F4.evolve",{"title":760,"path":759,"stem":931},"docs\u002F3.data\u002F5.seeds",{"title":764,"path":763,"stem":933},"docs\u002F3.data\u002F6.values",{"title":767,"path":628,"stem":935},"docs\u002F3.data\u002F7.mirror",{"title":772,"path":771,"stem":937},"docs\u002F3.data\u002F8.together",{"title":939,"path":940,"stem":941,"children":942,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[943,945],{"title":776,"path":775,"stem":944},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":780,"path":779,"stem":946},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":948,"path":949,"stem":950,"children":951,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[952,954,956,958],{"title":785,"path":784,"stem":953},"docs\u002F5.serve\u002F1.rest-graphql",{"title":789,"path":788,"stem":955},"docs\u002F5.serve\u002F2.pages",{"title":794,"path":793,"stem":957},"docs\u002F5.serve\u002F3.forms",{"title":798,"path":797,"stem":959},"docs\u002F5.serve\u002F4.admin",{"title":961,"path":962,"stem":963,"children":964,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[965,967,969,971,973,975],{"title":802,"path":801,"stem":966},"docs\u002F6.run\u002F1.deploy",{"title":806,"path":805,"stem":968},"docs\u002F6.run\u002F2.secure",{"title":810,"path":809,"stem":970},"docs\u002F6.run\u002F3.lifecycle",{"title":814,"path":813,"stem":972},"docs\u002F6.run\u002F4.observe",{"title":818,"path":817,"stem":974},"docs\u002F6.run\u002F5.dev-panel",{"title":822,"path":821,"stem":976},"docs\u002F6.run\u002F6.test",{"title":978,"path":979,"stem":980,"children":981,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[982,984,986,988,990,992],{"title":826,"path":825,"stem":983},"docs\u002F7.adopt\u002F1.new-project",{"title":830,"path":829,"stem":985},"docs\u002F7.adopt\u002F2.existing-app",{"title":834,"path":833,"stem":987},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":838,"path":837,"stem":989},"docs\u002F7.adopt\u002F4.hosts",{"title":842,"path":841,"stem":991},"docs\u002F7.adopt\u002F5.another-repository",{"title":846,"path":845,"stem":993},"docs\u002F7.adopt\u002F6.demos",{"title":995,"path":996,"stem":997,"children":998,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[999,1001,1003,1005,1007,1009,1011,1013,1015,1017],{"title":850,"path":849,"stem":1000},"docs\u002F8.extending\u002F1.scan",{"title":853,"path":852,"stem":1002},"docs\u002F8.extending\u002F10.without-compiler",{"title":856,"path":855,"stem":1004},"docs\u002F8.extending\u002F2.boot",{"title":859,"path":858,"stem":1006},"docs\u002F8.extending\u002F3.card-and-wire",{"title":862,"path":861,"stem":1008},"docs\u002F8.extending\u002F4.extension-points",{"title":865,"path":864,"stem":1010},"docs\u002F8.extending\u002F5.vocabulary",{"title":868,"path":867,"stem":1012},"docs\u002F8.extending\u002F6.extensions",{"title":871,"path":870,"stem":1014},"docs\u002F8.extending\u002F7.source-adapter",{"title":874,"path":873,"stem":1016},"docs\u002F8.extending\u002F8.surface",{"title":877,"path":876,"stem":1018},"docs\u002F8.extending\u002F9.foreign-frond",1794396613801]