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