[{"data":1,"prerenderedAt":1229},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fdata\u002Fvalues":6,"docs-uses":918,"docs-nav":1091},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":904,"extension":905,"forms":906,"kind":908,"meta":909,"navigation":162,"path":910,"seo":911,"stem":912,"step":913,"uses":914,"__hash__":917},"docs\u002Fdocs\u002F3.data\u002F6.values.md","Read settings and secrets",{"type":10,"value":11,"toc":898},"minimark",[12,16,214,228,385,400,405,498,518,521,600,604,610,844,856,860,863,871,874,881,885,894],[13,14,15],"p",{},"Most entities are rows: there are many posts, and a handler reads them through a repository.\nSome entities have exactly one instance: the address and key of a search engine, the settings\nof a catalog. Such an entity is declared like any other and asked for by its type:",[17,18,23],"pre",{"className":19,"code":20,"language":21,"meta":22,"style":22},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F entities\u002FMeili.ts\nexport default class Meili extends entity({\n  url: url(),\n  key: text(),\n  timeoutMs: number({ integer: true, default: 2000 }),\n}) {}\n\n\u002F\u002F services\u002FSearch.ts\nexport default class Search {\n  constructor(private meili: Meili) {}\n}\n","ts","",[24,25,26,35,68,87,102,146,157,164,170,185,208],"code",{"__ignoreMap":22},[27,28,31],"span",{"class":29,"line":30},"line",1,[27,32,34],{"class":33},"skXKP","\u002F\u002F entities\u002FMeili.ts\n",[27,36,38,42,45,49,53,56,60,64],{"class":29,"line":37},2,[27,39,41],{"class":40},"sK6XW","export",[27,43,44],{"class":40}," default",[27,46,48],{"class":47},"s76I7"," class",[27,50,52],{"class":51},"sBZYL"," Meili",[27,54,55],{"class":47}," extends",[27,57,59],{"class":58},"s4mR9"," entity",[27,61,63],{"class":62},"srlTG","(",[27,65,67],{"class":66},"s15xx","{\n",[27,69,71,75,78,81,84],{"class":29,"line":70},3,[27,72,74],{"class":73},"sHtqg","  url",[27,76,77],{"class":66},":",[27,79,80],{"class":58}," url",[27,82,83],{"class":62},"()",[27,85,86],{"class":66},",\n",[27,88,90,93,95,98,100],{"class":29,"line":89},4,[27,91,92],{"class":73},"  key",[27,94,77],{"class":66},[27,96,97],{"class":58}," text",[27,99,83],{"class":62},[27,101,86],{"class":66},[27,103,105,108,110,113,115,118,121,123,127,130,132,134,138,141,144],{"class":29,"line":104},5,[27,106,107],{"class":73},"  timeoutMs",[27,109,77],{"class":66},[27,111,112],{"class":58}," number",[27,114,63],{"class":62},[27,116,117],{"class":66},"{",[27,119,120],{"class":73}," integer",[27,122,77],{"class":66},[27,124,126],{"class":125},"slmMI"," true",[27,128,129],{"class":66},",",[27,131,44],{"class":73},[27,133,77],{"class":66},[27,135,137],{"class":136},"s3dPA"," 2000",[27,139,140],{"class":66}," }",[27,142,143],{"class":62},")",[27,145,86],{"class":66},[27,147,149,152,154],{"class":29,"line":148},6,[27,150,151],{"class":66},"}",[27,153,143],{"class":62},[27,155,156],{"class":66}," {}\n",[27,158,160],{"class":29,"line":159},7,[27,161,163],{"emptyLinePlaceholder":162},true,"\n",[27,165,167],{"class":29,"line":166},8,[27,168,169],{"class":33},"\u002F\u002F services\u002FSearch.ts\n",[27,171,173,175,177,179,182],{"class":29,"line":172},9,[27,174,41],{"class":40},[27,176,44],{"class":40},[27,178,48],{"class":47},[27,180,181],{"class":51}," Search",[27,183,184],{"class":66}," {\n",[27,186,188,191,193,196,200,202,204,206],{"class":29,"line":187},10,[27,189,190],{"class":47},"  constructor",[27,192,63],{"class":66},[27,194,195],{"class":47},"private",[27,197,199],{"class":198},"shDUQ"," meili",[27,201,77],{"class":66},[27,203,52],{"class":51},[27,205,143],{"class":66},[27,207,156],{"class":66},[27,209,211],{"class":29,"line":210},11,[27,212,213],{"class":66},"}\n",[13,215,216,219,220,223,224,227],{},[24,217,218],{},"Search"," receives ",[24,221,222],{},"{ url, key, timeoutMs }",". The code names no variable and no file: where the\nvalue comes from is said in ",[24,225,226],{},"fougere.config.ts",".",[17,229,231],{"className":19,"code":230,"language":21,"meta":22,"style":22},"import '@fougere\u002Fadapter-sql';\nimport '@fougere\u002Fadapter-env';\n\nexport default defineFougere({\n  sources: {\n    main: { type: 'sqlite', path: '.data\u002Fapp.db' },\n    env: { type: 'env', values: ['Meili'] },\n  },\n});\n",[24,232,233,252,265,269,282,291,330,372,377],{"__ignoreMap":22},[27,234,235,238,242,246,249],{"class":29,"line":30},[27,236,237],{"class":40},"import",[27,239,241],{"class":240},"sDDC1"," '",[27,243,245],{"class":244},"sN-8n","@fougere\u002Fadapter-sql",[27,247,248],{"class":240},"'",[27,250,251],{"class":66},";\n",[27,253,254,256,258,261,263],{"class":29,"line":37},[27,255,237],{"class":40},[27,257,241],{"class":240},[27,259,260],{"class":244},"@fougere\u002Fadapter-env",[27,262,248],{"class":240},[27,264,251],{"class":66},[27,266,267],{"class":29,"line":70},[27,268,163],{"emptyLinePlaceholder":162},[27,270,271,273,275,278,280],{"class":29,"line":89},[27,272,41],{"class":40},[27,274,44],{"class":40},[27,276,277],{"class":58}," defineFougere",[27,279,63],{"class":62},[27,281,67],{"class":66},[27,283,284,287,289],{"class":29,"line":104},[27,285,286],{"class":73},"  sources",[27,288,77],{"class":66},[27,290,184],{"class":66},[27,292,293,296,298,301,304,306,308,311,313,315,318,320,322,325,327],{"class":29,"line":148},[27,294,295],{"class":73},"    main",[27,297,77],{"class":66},[27,299,300],{"class":66}," {",[27,302,303],{"class":73}," type",[27,305,77],{"class":66},[27,307,241],{"class":240},[27,309,310],{"class":244},"sqlite",[27,312,248],{"class":240},[27,314,129],{"class":66},[27,316,317],{"class":73}," path",[27,319,77],{"class":66},[27,321,241],{"class":240},[27,323,324],{"class":244},".data\u002Fapp.db",[27,326,248],{"class":240},[27,328,329],{"class":66}," },\n",[27,331,332,335,337,339,341,343,345,348,350,352,355,357,360,362,365,367,370],{"class":29,"line":159},[27,333,334],{"class":73},"    env",[27,336,77],{"class":66},[27,338,300],{"class":66},[27,340,303],{"class":73},[27,342,77],{"class":66},[27,344,241],{"class":240},[27,346,347],{"class":244},"env",[27,349,248],{"class":240},[27,351,129],{"class":66},[27,353,354],{"class":73}," values",[27,356,77],{"class":66},[27,358,359],{"class":62}," [",[27,361,248],{"class":240},[27,363,364],{"class":244},"Meili",[27,366,248],{"class":240},[27,368,369],{"class":62},"]",[27,371,329],{"class":66},[27,373,374],{"class":29,"line":166},[27,375,376],{"class":66},"  },\n",[27,378,379,381,383],{"class":29,"line":172},[27,380,151],{"class":66},[27,382,143],{"class":62},[27,384,251],{"class":66},[13,386,387,388,391,392,395,396,399],{},"An entry of ",[24,389,390],{},"sources:"," lists two kinds of entities: ",[24,393,394],{},"rows:",", the ones it keeps as rows, and\n",[24,397,398],{},"values:",", the ones it keeps as one value each. An entity is one or the other, never both.",[401,402,404],"h2",{"id":403},"where-a-value-comes-from","Where a value comes from",[406,407,408,424],"table",{},[409,410,411],"thead",{},[412,413,414,418],"tr",{},[415,416,417],"th",{},"source",[415,419,420,421,423],{},"where ",[24,422,364],{}," is read",[425,426,427,447,467],"tbody",{},[412,428,429,434],{},[430,431,432],"td",{},[24,433,347],{},[430,435,436,439,440,439,443,446],{},[24,437,438],{},"MEILI_URL",", ",[24,441,442],{},"MEILI_KEY",[24,444,445],{},"MEILI_TIMEOUT_MS"," — one variable per field, in SNAKE_CASE",[412,448,449,454],{},[430,450,451],{},[24,452,453],{},"file",[430,455,456,459,460,439,463,466],{},[24,457,458],{},"\u003Cpath>\u002Fmeili.yaml"," (or ",[24,461,462],{},".json",[24,464,465],{},".yml",") — one file, beside the directories of rows",[412,468,469,488],{},[430,470,471,439,473,439,476,439,479,439,482,439,485],{},[24,472,310],{},[24,474,475],{},"pg",[24,477,478],{},"mysql",[24,480,481],{},"mssql",[24,483,484],{},"d1",[24,486,487],{},"memory",[430,489,490,491,494,495],{},"the row ",[24,492,493],{},"meili"," of the table ",[24,496,497],{},"fougere_values",[13,499,500,501,439,504,439,507,439,510,513,514,517],{},"Text is read as the field declares: a number, a boolean (",[24,502,503],{},"true",[24,505,506],{},"false",[24,508,509],{},"1",[24,511,512],{},"0","), JSON for\nan object or a list. A table of values is part of the schema like any other table:\n",[24,515,516],{},"fougere migrate"," creates it, and the boot refuses when it is missing.",[13,519,520],{},"Production and staging are two deployments, each with its own environment, or its own\ndirectory of files:",[17,522,524],{"className":19,"code":523,"language":21,"meta":22,"style":22},"config: { type: 'file', path: `config\u002F${process.env.APP_ENV}`, values: ['Catalog'] },\n",[24,525,526],{"__ignoreMap":22},[27,527,528,532,534,536,538,540,542,544,546,548,550,552,555,558,561,565,567,570,572,575,577,580,582,584,586,589,591,594,596,598],{"class":29,"line":30},[27,529,531],{"class":530},"sWI7z","config",[27,533,77],{"class":66},[27,535,300],{"class":66},[27,537,303],{"class":530},[27,539,77],{"class":66},[27,541,241],{"class":240},[27,543,453],{"class":244},[27,545,248],{"class":240},[27,547,129],{"class":66},[27,549,317],{"class":530},[27,551,77],{"class":66},[27,553,554],{"class":240}," `",[27,556,557],{"class":244},"config\u002F",[27,559,560],{"class":66},"${",[27,562,564],{"class":563},"sPEhv","process",[27,566,227],{"class":66},[27,568,347],{"class":569},"sy9f4",[27,571,227],{"class":66},[27,573,574],{"class":569},"APP_ENV",[27,576,151],{"class":66},[27,578,579],{"class":240},"`",[27,581,129],{"class":66},[27,583,354],{"class":530},[27,585,77],{"class":66},[27,587,359],{"class":588},"spAFX",[27,590,248],{"class":240},[27,592,593],{"class":244},"Catalog",[27,595,248],{"class":240},[27,597,369],{"class":588},[27,599,329],{"class":66},[401,601,603],{"id":602},"changing-what-a-source-gave","Changing what a source gave",[13,605,606,607,77],{},"A secret kept elsewhere — a vault, a cloud's secret manager — is a link in front of where the value is\nread, ",[24,608,609],{},"Env\u003CMeili>",[17,611,613],{"className":19,"code":612,"language":21,"meta":22,"style":22},"\u002F\u002F fronds\u002Fsearch\u002Fservices\u002FMeiliFromVault.ts\nimport { Env } from '@fougere\u002Fcore';\nimport Meili from '..\u002Fentities\u002FMeili.js';\nimport Vault from '.\u002FVault.js';\n\nexport default class MeiliFromVault implements Partial\u003CEnv\u003CMeili>> {\n  constructor(private inner: Env\u003CMeili>, private vault: Vault) {}\n\n  async read() {\n    return { ...await this.inner.read(), key: await this.vault.secret('meili') };\n  }\n}\n",[24,614,615,620,643,662,680,684,716,753,757,770,834,839],{"__ignoreMap":22},[27,616,617],{"class":29,"line":30},[27,618,619],{"class":33},"\u002F\u002F fronds\u002Fsearch\u002Fservices\u002FMeiliFromVault.ts\n",[27,621,622,624,626,629,631,634,636,639,641],{"class":29,"line":37},[27,623,237],{"class":40},[27,625,300],{"class":66},[27,627,628],{"class":563}," Env",[27,630,140],{"class":66},[27,632,633],{"class":40}," from",[27,635,241],{"class":240},[27,637,638],{"class":244},"@fougere\u002Fcore",[27,640,248],{"class":240},[27,642,251],{"class":66},[27,644,645,647,650,653,655,658,660],{"class":29,"line":70},[27,646,237],{"class":40},[27,648,649],{"class":563}," Meili ",[27,651,652],{"class":40},"from",[27,654,241],{"class":240},[27,656,657],{"class":244},"..\u002Fentities\u002FMeili.js",[27,659,248],{"class":240},[27,661,251],{"class":66},[27,663,664,666,669,671,673,676,678],{"class":29,"line":89},[27,665,237],{"class":40},[27,667,668],{"class":563}," Vault ",[27,670,652],{"class":40},[27,672,241],{"class":240},[27,674,675],{"class":244},".\u002FVault.js",[27,677,248],{"class":240},[27,679,251],{"class":66},[27,681,682],{"class":29,"line":104},[27,683,163],{"emptyLinePlaceholder":162},[27,685,686,688,690,692,695,698,701,704,707,709,711,714],{"class":29,"line":148},[27,687,41],{"class":40},[27,689,44],{"class":40},[27,691,48],{"class":47},[27,693,694],{"class":51}," MeiliFromVault",[27,696,697],{"class":47}," implements",[27,699,700],{"class":51}," Partial",[27,702,703],{"class":66},"\u003C",[27,705,706],{"class":51},"Env",[27,708,703],{"class":66},[27,710,364],{"class":51},[27,712,713],{"class":66},">>",[27,715,184],{"class":66},[27,717,718,720,722,724,727,729,731,733,735,738,741,744,746,749,751],{"class":29,"line":159},[27,719,190],{"class":47},[27,721,63],{"class":66},[27,723,195],{"class":47},[27,725,726],{"class":198}," inner",[27,728,77],{"class":66},[27,730,628],{"class":51},[27,732,703],{"class":66},[27,734,364],{"class":51},[27,736,737],{"class":66},">,",[27,739,740],{"class":47}," private",[27,742,743],{"class":198}," vault",[27,745,77],{"class":66},[27,747,748],{"class":51}," Vault",[27,750,143],{"class":66},[27,752,156],{"class":66},[27,754,755],{"class":29,"line":166},[27,756,163],{"emptyLinePlaceholder":162},[27,758,759,762,766,768],{"class":29,"line":172},[27,760,761],{"class":47},"  async",[27,763,765],{"class":764},"shDkW"," read",[27,767,83],{"class":66},[27,769,184],{"class":66},[27,771,772,775,777,780,783,787,789,792,794,797,799,801,804,806,809,811,813,816,818,821,823,825,827,829,831],{"class":29,"line":187},[27,773,774],{"class":40},"    return",[27,776,300],{"class":66},[27,778,779],{"class":66}," ...",[27,781,782],{"class":40},"await",[27,784,786],{"class":785},"sxG60"," this",[27,788,227],{"class":66},[27,790,791],{"class":569},"inner",[27,793,227],{"class":66},[27,795,796],{"class":58},"read",[27,798,83],{"class":588},[27,800,129],{"class":66},[27,802,803],{"class":73}," key",[27,805,77],{"class":66},[27,807,808],{"class":40}," await",[27,810,786],{"class":785},[27,812,227],{"class":66},[27,814,815],{"class":569},"vault",[27,817,227],{"class":66},[27,819,820],{"class":58},"secret",[27,822,63],{"class":588},[27,824,248],{"class":240},[27,826,493],{"class":244},[27,828,248],{"class":240},[27,830,143],{"class":588},[27,832,833],{"class":66}," };\n",[27,835,836],{"class":29,"line":210},[27,837,838],{"class":66},"  }\n",[27,840,842],{"class":29,"line":841},12,[27,843,213],{"class":66},[13,845,846,847,849,850,852,853,855],{},"It touches ",[24,848,364],{}," and nothing else: the key is ",[24,851,609],{},", as written. What it answers is judged and\ncompleted like what the source holds, once, at boot — a class asking for ",[24,854,364],{}," receives the value, never\nthe link. The value is read once: a key that changes while the app runs is picked up at the next restart.",[401,857,859],{"id":858},"what-the-boot-checks","What the boot checks",[13,861,862],{},"The value is read once, after the schema is checked and before the seeds. The defaults of its\nfields fill what is missing, and the fields judge the rest. A value that does not hold refuses\nthe boot, one line per field, with the place to fix it:",[17,864,869],{"className":865,"code":867,"language":868},[866],"language-text","Fougere boot refused: 2 value(s) do not hold:\n  meili.url: Does not match format \"uri\" — sources.env, MEILI_URL\n  meili.key: Required — sources.env, MEILI_KEY\n","text",[24,870,867],{"__ignoreMap":22},[13,872,873],{},"A value nothing sets is not refused for being absent: it is refused for each required field\nit lacks, and a value whose fields all have defaults holds with nothing set at all.",[13,875,876,877,880],{},"A value has no repository and no table of its own. Reaching it as rows — ",[24,878,879],{},"Repository\u003CMeili>"," —\nrefuses the boot, and so does asking for a row entity as one value.",[401,882,884],{"id":883},"who-receives-it","Who receives it",[13,886,887,888,893],{},"A value is registered in the frond that declares its entity, and in the fronds under it. A\nvalue several fronds need lives in the frond they all ",[889,890,892],"a",{"href":891},"\u002Fdocs\u002Fconcepts\u002Ffrond","extend",": such a\nfrond may hold no rows, and it may hold values.",[895,896,897],"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 .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 pre.shiki code .slmMI, html code.shiki .slmMI{--shiki-light:#FF5370;--shiki-default:#EE9F6B;--shiki-dark:#FF9CAC}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}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 .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 .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 .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}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 .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}",{"title":22,"searchDepth":37,"depth":37,"links":899},[900,901,902,903],{"id":403,"depth":37,"text":404},{"id":602,"depth":37,"text":603},{"id":858,"depth":37,"text":859},{"id":883,"depth":37,"text":884},"One value read from a source, judged at boot, handed to whoever asks.","md",[398,907],"type: 'env'","task",{},"\u002Fdocs\u002Fdata\u002Fvalues",{"title":8,"description":904},"docs\u002F3.data\u002F6.values",null,[915,916],"entity","configuration","Ta7_BLpjJlrKyrtcS8bI_WS-v5Tms8CI0Onz04bkA9U",[919,922,925,928,930,933,936,939,942,948,953,957,961,965,969,973,975,980,984,988,993,997,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1061,1064,1067,1070,1073,1076,1079,1082,1085,1088],{"path":920,"title":921,"uses":913},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":923,"title":924,"uses":913},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":926,"title":927,"uses":913},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":891,"title":929,"uses":913},"Frond",{"path":931,"title":932,"uses":913},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":934,"title":935,"uses":913},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":937,"title":938,"uses":913},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":940,"title":941,"uses":913},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":943,"title":944,"uses":945},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[946,947],"port","frond",{"path":949,"title":950,"uses":951},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[916,952],"handler",{"path":954,"title":955,"uses":956},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[915,916],{"path":958,"title":959,"uses":960},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[916,915],{"path":962,"title":963,"uses":964},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[915,946],{"path":966,"title":967,"uses":968},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[915],{"path":970,"title":971,"uses":972},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[915],{"path":910,"title":8,"uses":974},[915,916],{"path":976,"title":977,"uses":978},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[979],"repository",{"path":981,"title":982,"uses":983},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[979],{"path":985,"title":986,"uses":987},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[946,947],{"path":989,"title":990,"uses":991},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[992],"fact",{"path":994,"title":995,"uses":996},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[952,916],{"path":998,"title":999,"uses":1000},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[952,1001],"facade",{"path":1003,"title":1004,"uses":1005},"\u002Fdocs\u002Fserve\u002Fforms","A form",[915],{"path":1007,"title":1008,"uses":1009},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[952],{"path":1011,"title":1012,"uses":1013},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[916,947],{"path":1015,"title":1016,"uses":1017},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[916,947],{"path":1019,"title":1020,"uses":1021},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[916],{"path":1023,"title":1024,"uses":1025},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[916,952],{"path":1027,"title":1028,"uses":1029},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[952],{"path":1031,"title":1032,"uses":1033},"\u002Fdocs\u002Frun\u002Ftest","Test",[915,946],{"path":1035,"title":1036,"uses":1037},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[947,916],{"path":1039,"title":1040,"uses":1041},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[947,916],{"path":1043,"title":1044,"uses":1045},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[915],{"path":1047,"title":1048,"uses":1049},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[916],{"path":1051,"title":1052,"uses":1053},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[1001,947],{"path":1055,"title":1056,"uses":1057},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":1059,"title":1060,"uses":913},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":1062,"title":1063,"uses":913},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":1065,"title":1066,"uses":913},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":1068,"title":1069,"uses":913},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":1071,"title":1072,"uses":913},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":1074,"title":1075,"uses":913},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":1077,"title":1078,"uses":913},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":1080,"title":1081,"uses":913},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":1083,"title":1084,"uses":913},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":1086,"title":1087,"uses":913},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":1089,"title":1090,"uses":913},"\u002Fdocs","What is Fougere",[1092],{"title":1093,"path":1089,"stem":1094,"children":1095,"page":-1},"Docs","docs",[1096,1098,1119,1128,1148,1157,1170,1187,1204],{"title":1090,"path":1089,"stem":1097},"docs\u002Findex",{"title":1099,"path":1100,"stem":1101,"children":1102,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[1103,1105,1107,1109,1111,1113,1115,1117],{"title":921,"path":920,"stem":1104},"docs\u002F1.concepts\u002F1.entity",{"title":924,"path":923,"stem":1106},"docs\u002F1.concepts\u002F2.handler",{"title":927,"path":926,"stem":1108},"docs\u002F1.concepts\u002F3.repository",{"title":929,"path":891,"stem":1110},"docs\u002F1.concepts\u002F4.frond",{"title":932,"path":931,"stem":1112},"docs\u002F1.concepts\u002F5.facade",{"title":935,"path":934,"stem":1114},"docs\u002F1.concepts\u002F6.fact",{"title":938,"path":937,"stem":1116},"docs\u002F1.concepts\u002F7.port",{"title":941,"path":940,"stem":1118},"docs\u002F1.concepts\u002F8.configuration",{"title":1120,"path":1121,"stem":1122,"children":1123,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[1124,1126],{"title":944,"path":943,"stem":1125},"docs\u002F2.access\u002F1.authentication",{"title":950,"path":949,"stem":1127},"docs\u002F2.access\u002F2.state",{"title":1129,"path":1130,"stem":1131,"children":1132,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[1133,1135,1137,1139,1141,1143,1144,1146],{"title":955,"path":954,"stem":1134},"docs\u002F3.data\u002F1.sql",{"title":959,"path":958,"stem":1136},"docs\u002F3.data\u002F2.several-databases",{"title":963,"path":962,"stem":1138},"docs\u002F3.data\u002F3.computed-field",{"title":967,"path":966,"stem":1140},"docs\u002F3.data\u002F4.evolve",{"title":971,"path":970,"stem":1142},"docs\u002F3.data\u002F5.seeds",{"title":8,"path":910,"stem":912},{"title":977,"path":976,"stem":1145},"docs\u002F3.data\u002F7.mirror",{"title":982,"path":981,"stem":1147},"docs\u002F3.data\u002F8.together",{"title":1149,"path":1150,"stem":1151,"children":1152,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[1153,1155],{"title":986,"path":985,"stem":1154},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":990,"path":989,"stem":1156},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":1158,"path":1159,"stem":1160,"children":1161,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[1162,1164,1166,1168],{"title":995,"path":994,"stem":1163},"docs\u002F5.serve\u002F1.rest-graphql",{"title":999,"path":998,"stem":1165},"docs\u002F5.serve\u002F2.pages",{"title":1004,"path":1003,"stem":1167},"docs\u002F5.serve\u002F3.forms",{"title":1008,"path":1007,"stem":1169},"docs\u002F5.serve\u002F4.admin",{"title":1171,"path":1172,"stem":1173,"children":1174,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[1175,1177,1179,1181,1183,1185],{"title":1012,"path":1011,"stem":1176},"docs\u002F6.run\u002F1.deploy",{"title":1016,"path":1015,"stem":1178},"docs\u002F6.run\u002F2.secure",{"title":1020,"path":1019,"stem":1180},"docs\u002F6.run\u002F3.lifecycle",{"title":1024,"path":1023,"stem":1182},"docs\u002F6.run\u002F4.observe",{"title":1028,"path":1027,"stem":1184},"docs\u002F6.run\u002F5.dev-panel",{"title":1032,"path":1031,"stem":1186},"docs\u002F6.run\u002F6.test",{"title":1188,"path":1189,"stem":1190,"children":1191,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[1192,1194,1196,1198,1200,1202],{"title":1036,"path":1035,"stem":1193},"docs\u002F7.adopt\u002F1.new-project",{"title":1040,"path":1039,"stem":1195},"docs\u002F7.adopt\u002F2.existing-app",{"title":1044,"path":1043,"stem":1197},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":1048,"path":1047,"stem":1199},"docs\u002F7.adopt\u002F4.hosts",{"title":1052,"path":1051,"stem":1201},"docs\u002F7.adopt\u002F5.another-repository",{"title":1056,"path":1055,"stem":1203},"docs\u002F7.adopt\u002F6.demos",{"title":1205,"path":1206,"stem":1207,"children":1208,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[1209,1211,1213,1215,1217,1219,1221,1223,1225,1227],{"title":1060,"path":1059,"stem":1210},"docs\u002F8.extending\u002F1.scan",{"title":1063,"path":1062,"stem":1212},"docs\u002F8.extending\u002F10.without-compiler",{"title":1066,"path":1065,"stem":1214},"docs\u002F8.extending\u002F2.boot",{"title":1069,"path":1068,"stem":1216},"docs\u002F8.extending\u002F3.card-and-wire",{"title":1072,"path":1071,"stem":1218},"docs\u002F8.extending\u002F4.extension-points",{"title":1075,"path":1074,"stem":1220},"docs\u002F8.extending\u002F5.vocabulary",{"title":1078,"path":1077,"stem":1222},"docs\u002F8.extending\u002F6.extensions",{"title":1081,"path":1080,"stem":1224},"docs\u002F8.extending\u002F7.source-adapter",{"title":1084,"path":1083,"stem":1226},"docs\u002F8.extending\u002F8.surface",{"title":1087,"path":1086,"stem":1228},"docs\u002F8.extending\u002F9.foreign-frond",1794396613574]