[{"data":1,"prerenderedAt":1103},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fextending\u002Fextension-points":6,"docs-uses":793,"docs-nav":965},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":783,"extension":784,"forms":785,"kind":786,"meta":787,"navigation":788,"path":789,"seo":790,"stem":791,"step":785,"uses":785,"__hash__":792},"docs\u002Fdocs\u002F8.extending\u002F4.extension-points.md","Registries and extension points",{"type":10,"value":11,"toc":777},"minimark",[12,16,51,56,197,220,224,259,272,275,279,301,308,312,315,336,466,483,536,546,605,612,626,761,773],[13,14,15],"p",{},"Fougere is extended in two ways, and every point of extension is one or the other.",[17,18,19,39],"ul",{},[20,21,22,26,27,31,32,31,35,38],"li",{},[23,24,25],"strong",{},"By name — a registry."," A package registers a word, and config or an entity names it:\n",[28,29,30],"code",{},"sources: { main: { type: 'sqlite' } }",", ",[28,33,34],{},"protocols: { rest: {} }",[28,36,37],{},"format: 'slug'",".",[20,40,41,44,45,31,48,38],{},[23,42,43],{},"By type — a port."," A class extends a port, or stands in front of it, and what asks for the port\nreceives it: ",[28,46,47],{},"class StripePayment extends Payment",[28,49,50],{},"class Audit implements Partial\u003CDispatcher>",[52,53,55],"h2",{"id":54},"registries","Registries",[57,58,59,75],"table",{},[60,61,62],"thead",{},[63,64,65,69,72],"tr",{},[66,67,68],"th",{},"Registry",[66,70,71],{},"The word it answers",[66,73,74],{},"Registered by",[76,77,78,115,138,161,184],"tbody",{},[63,79,80,86,96],{},[81,82,83],"td",{},[28,84,85],{},"Sources",[81,87,88,91,92,95],{},[28,89,90],{},"type:"," of a ",[28,93,94],{},"sources:"," entry",[81,97,98,31,103,31,107,31,111],{},[99,100,102],"a",{"href":101},"\u002Freference\u002Fpackages\u002Fadapter-sql","adapter-sql",[99,104,106],{"href":105},"\u002Freference\u002Fpackages\u002Fadapter-file","adapter-file",[99,108,110],{"href":109},"\u002Freference\u002Fpackages\u002Fadapter-memory","adapter-memory",[99,112,114],{"href":113},"\u002Freference\u002Fpackages\u002Fadapter-env","adapter-env",[63,116,117,122,128],{},[81,118,119],{},[28,120,121],{},"Protocols",[81,123,124,125],{},"a key of ",[28,126,127],{},"protocols:",[81,129,130,31,134],{},[99,131,133],{"href":132},"\u002Freference\u002Fpackages\u002Fadapter-rest","adapter-rest",[99,135,137],{"href":136},"\u002Freference\u002Fpackages\u002Fadapter-graphql","adapter-graphql",[63,139,140,145,151],{},[81,141,142],{},[28,143,144],{},"States",[81,146,147,148],{},"a way to keep a name of ",[28,149,150],{},"state:",[81,152,153,31,157],{},[99,154,156],{"href":155},"\u002Freference\u002Fpackages\u002Fstate-cookie","state-cookie",[99,158,160],{"href":159},"\u002Freference\u002Fpackages\u002Fstate-session","state-session",[63,162,163,174,177],{},[81,164,165,31,168,31,171],{},[28,166,167],{},"StringFormats",[28,169,170],{},"Generators",[28,172,173],{},"Verbs",[81,175,176],{},"a word of an entity",[81,178,179,180],{},"your ",[99,181,183],{"href":182},"\u002Fdocs\u002Fextending\u002Fvocabulary","vocabulary",[63,185,186,191,194],{},[81,187,188],{},[28,189,190],{},"Axes",[81,192,193],{},"a fifth axis of a field",[81,195,196],{},"a package",[13,198,199,200,203,204,207,208,211,212,215,216,38],{},"A word has ",[23,201,202],{},"one"," answer per process: the same answer registered twice is harmless, a different one\nis refused, naming the registry. A package that registers when it is imported says so in its\n",[28,205,206],{},"package.json"," (",[28,209,210],{},"sideEffects","), or a bundler drops the import. Each word also has a type, added to an\nempty interface of core with ",[28,213,214],{},"declare module"," — that is what lets the editor refuse a misspelled\nword: see ",[99,217,219],{"href":218},"\u002Freference\u002Finterfaces","Interfaces to extend",[52,221,223],{"id":222},"ports","Ports",[13,225,226,227,31,230,31,233,31,236,31,239,31,242,245,246,249,250,254,255,38],{},"Every port Fougere opens — ",[28,228,229],{},"Dispatcher",[28,231,232],{},"Rest",[28,234,235],{},"Collect\u003CT>",[28,237,238],{},"Present\u003CT>",[28,240,241],{},"Env\u003CT>",[28,243,244],{},"Storage",",\n",[28,247,248],{},"Logger"," — is extended the way your own are: see ",[99,251,253],{"href":252},"\u002Fdocs\u002Fconcepts\u002Fport#the-ports-fougere-opens","Port","\nand the ",[99,256,258],{"href":257},"\u002Freference\u002Fports","reference",[13,260,261,263,264,266,267,271],{},[28,262,244],{}," is the one whose realization is handed in rather than written: the source builds a storage\nper entity, and no class declares it. So a class extending ",[28,265,244],{}," can only stand in front of it —\n",[99,268,270],{"href":269},"\u002Fdocs\u002Fconcepts\u002Fport#in-front-of-the-rows","in front of the rows"," — and it covers every entity of its\nown frond. No key widens that reach: a link sits beside the code it changes and goes where that code\ngoes, so moving a frond to another process cannot quietly leave a link behind. What must be in every\nprocess is a frond every process holds, which an extension brings.",[13,273,274],{},"The check stays outside the chain: a row the entity refuses never reaches a link, and what a link\nreceives is the value the schema already parsed.",[52,276,278],{"id":277},"seeing-what-answers","Seeing what answers",[280,281,286],"pre",{"className":282,"code":283,"language":284,"meta":285,"style":285},"language-bash shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","fougere ports\n","bash","",[28,287,288],{"__ignoreMap":285},[289,290,293,297],"span",{"class":291,"line":292},"line",1,[289,294,296],{"class":295},"sV8pK","fougere",[289,298,300],{"class":299},"sN-8n"," ports\n",[13,302,303,304,307],{},"prints every point of this app — each registry with the words it answers, each port with its links in\norder and the realization they reach — booting the app with no schema check and no seeds. In code,\n",[28,305,306],{},"app.extensionPoints()"," answers the same list.",[52,309,311],{"id":310},"a-transport-and-http","A transport, and HTTP",[13,313,314],{},"Neither is a host port, and neither leaves you without a way in.",[13,316,317,318,321,322,325,326,245,329,31,332,335],{},"A ",[23,319,320],{},"transport"," is named by the scheme of the address ",[28,323,324],{},"fronds:"," gives — ",[28,327,328],{},"http:\u002F\u002F",[28,330,331],{},"https:\u002F\u002F",[28,333,334],{},"binding:\u002F\u002F"," for a Cloudflare service binding — and answered by the package\nthat registers it, the way a source type is:",[280,337,341],{"className":338,"code":339,"language":340,"meta":285,"style":285},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","Transports.register('tcp', { open: (address) => mySocketTransport(Number(address.port)) });\n\u002F\u002F fougere.config.ts\nfronds: { sensors: { remote: 'tcp:\u002F\u002F127.0.0.1:4700' } },\n","ts",[28,342,343,423,430],{"__ignoreMap":285},[289,344,345,349,352,356,360,364,367,369,372,375,378,381,383,387,390,394,397,399,402,404,406,408,412,415,418,420],{"class":291,"line":292},[289,346,348],{"class":347},"sPEhv","Transports",[289,350,38],{"class":351},"s15xx",[289,353,355],{"class":354},"s4mR9","register",[289,357,359],{"class":358},"srlTG","(",[289,361,363],{"class":362},"sDDC1","'",[289,365,366],{"class":299},"tcp",[289,368,363],{"class":362},[289,370,371],{"class":351},",",[289,373,374],{"class":351}," {",[289,376,377],{"class":354}," open",[289,379,380],{"class":351},":",[289,382,207],{"class":351},[289,384,386],{"class":385},"shDUQ","address",[289,388,389],{"class":351},")",[289,391,393],{"class":392},"scTuO"," =>",[289,395,396],{"class":354}," mySocketTransport",[289,398,359],{"class":358},[289,400,401],{"class":354},"Number",[289,403,359],{"class":358},[289,405,386],{"class":347},[289,407,38],{"class":351},[289,409,411],{"class":410},"sy9f4","port",[289,413,414],{"class":358},"))",[289,416,417],{"class":351}," }",[289,419,389],{"class":358},[289,421,422],{"class":351},";\n",[289,424,426],{"class":291,"line":425},2,[289,427,429],{"class":428},"skXKP","\u002F\u002F fougere.config.ts\n",[289,431,433,437,439,441,444,446,448,451,453,456,459,461,463],{"class":291,"line":432},3,[289,434,436],{"class":435},"sWI7z","fronds",[289,438,380],{"class":351},[289,440,374],{"class":351},[289,442,443],{"class":435}," sensors",[289,445,380],{"class":351},[289,447,374],{"class":351},[289,449,450],{"class":435}," remote",[289,452,380],{"class":351},[289,454,455],{"class":362}," '",[289,457,458],{"class":299},"tcp:\u002F\u002F127.0.0.1:4700",[289,460,363],{"class":362},[289,462,417],{"class":351},[289,464,465],{"class":351}," },\n",[13,467,468,471,472,31,475,478,479,482],{},[28,469,470],{},"@fougere\u002Ftransport-http"," registers ",[28,473,474],{},"http",[28,476,477],{},"https"," and ",[28,480,481],{},"binding",". A scheme nothing\nregistered refuses the boot, naming the entry and the schemes this process knows. A host\nmay still swap the transport whole, and then no scheme is read:",[280,484,486],{"className":338,"code":485,"language":340,"meta":285,"style":285},"boot({ root, createContainer, remoteTransport: (url) => mySocketTransport(url) });\n",[28,487,488],{"__ignoreMap":285},[289,489,490,493,495,498,501,503,506,508,511,513,515,518,520,522,524,526,528,530,532,534],{"class":291,"line":292},[289,491,492],{"class":354},"boot",[289,494,359],{"class":358},[289,496,497],{"class":351},"{",[289,499,500],{"class":347}," root",[289,502,371],{"class":351},[289,504,505],{"class":347}," createContainer",[289,507,371],{"class":351},[289,509,510],{"class":354}," remoteTransport",[289,512,380],{"class":351},[289,514,207],{"class":351},[289,516,517],{"class":385},"url",[289,519,389],{"class":351},[289,521,393],{"class":392},[289,523,396],{"class":354},[289,525,359],{"class":358},[289,527,517],{"class":347},[289,529,389],{"class":358},[289,531,417],{"class":351},[289,533,389],{"class":358},[289,535,422],{"class":351},[13,537,538,539,541,542,545],{},"And an outgoing call to a frond behind ",[28,540,324],{}," already runs through the app's\nmiddlewares before it reaches the wire, so retrying, timing or logging one is a\nhost middleware (",[28,543,544],{},"app.use","), not a transport:",[280,547,549],{"className":338,"code":548,"language":340,"meta":285,"style":285},"app.use(async (ctx, next) => { \u002F* ctx.address, ctx.operation *\u002F return next(); });\n",[28,550,551],{"__ignoreMap":285},[289,552,553,556,558,561,563,567,569,572,574,577,579,581,583,586,590,592,596,599,601,603],{"class":291,"line":292},[289,554,555],{"class":347},"app",[289,557,38],{"class":351},[289,559,560],{"class":354},"use",[289,562,359],{"class":358},[289,564,566],{"class":565},"s76I7","async",[289,568,207],{"class":351},[289,570,571],{"class":385},"ctx",[289,573,371],{"class":351},[289,575,576],{"class":385}," next",[289,578,389],{"class":351},[289,580,393],{"class":392},[289,582,374],{"class":351},[289,584,585],{"class":428}," \u002F* ctx.address, ctx.operation *\u002F",[289,587,589],{"class":588},"sK6XW"," return",[289,591,576],{"class":354},[289,593,595],{"class":594},"spAFX","()",[289,597,598],{"class":351},";",[289,600,417],{"class":351},[289,602,389],{"class":358},[289,604,422],{"class":351},[13,606,607,608,611],{},"What that does ",[23,609,610],{},"not"," reach is the envelope itself — the encoding, the headers, the\nconnection. For those you are the transport, and you swap it.",[13,613,614,617,618,621,622,625],{},[23,615,616],{},"HTTP"," is the engine's from start to finish: the app mounts on it with ",[28,619,620],{},"answer(app, request)",",\nand the engine's own middleware stands around it. Leaving a route out is a middleware answering\nbefore ",[28,623,624],{},"answer"," does:",[280,627,629],{"className":338,"code":628,"language":340,"meta":285,"style":285},"hono.delete('\u002Fapi\u002F*', (c) => c.text('Method Not Allowed', 405));\nhono.all('\u002Fapi\u002F*', async (c) => (await answer(app, c.req.raw)) ?? c.notFound());\n",[28,630,631,688],{"__ignoreMap":285},[289,632,633,636,638,641,643,645,648,650,652,654,657,659,661,664,666,669,671,673,676,678,680,684,686],{"class":291,"line":292},[289,634,635],{"class":347},"hono",[289,637,38],{"class":351},[289,639,640],{"class":354},"delete",[289,642,359],{"class":358},[289,644,363],{"class":362},[289,646,647],{"class":299},"\u002Fapi\u002F*",[289,649,363],{"class":362},[289,651,371],{"class":351},[289,653,207],{"class":351},[289,655,656],{"class":385},"c",[289,658,389],{"class":351},[289,660,393],{"class":392},[289,662,663],{"class":347}," c",[289,665,38],{"class":351},[289,667,668],{"class":354},"text",[289,670,359],{"class":358},[289,672,363],{"class":362},[289,674,675],{"class":299},"Method Not Allowed",[289,677,363],{"class":362},[289,679,371],{"class":351},[289,681,683],{"class":682},"s3dPA"," 405",[289,685,414],{"class":358},[289,687,422],{"class":351},[289,689,690,692,694,697,699,701,703,705,707,710,712,714,716,718,720,723,726,728,730,732,734,736,739,741,744,746,749,751,753,756,759],{"class":291,"line":425},[289,691,635],{"class":347},[289,693,38],{"class":351},[289,695,696],{"class":354},"all",[289,698,359],{"class":358},[289,700,363],{"class":362},[289,702,647],{"class":299},[289,704,363],{"class":362},[289,706,371],{"class":351},[289,708,709],{"class":565}," async",[289,711,207],{"class":351},[289,713,656],{"class":385},[289,715,389],{"class":351},[289,717,393],{"class":392},[289,719,207],{"class":358},[289,721,722],{"class":588},"await",[289,724,725],{"class":354}," answer",[289,727,359],{"class":358},[289,729,555],{"class":347},[289,731,371],{"class":351},[289,733,663],{"class":347},[289,735,38],{"class":351},[289,737,738],{"class":410},"req",[289,740,38],{"class":351},[289,742,743],{"class":410},"raw",[289,745,414],{"class":358},[289,747,748],{"class":351}," ??",[289,750,663],{"class":347},[289,752,38],{"class":351},[289,754,755],{"class":354},"notFound",[289,757,758],{"class":358},"())",[289,760,422],{"class":351},[13,762,763,764,767,768,772],{},"Where an op answers is the frond's to say, in its ",[28,765,766],{},"frond.config.ts"," — see\n",[99,769,771],{"href":770},"\u002Fdocs\u002Fserve\u002Frest-graphql","surfaces"," for the three parts of a URL and who sets each one.",[774,775,776],"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 .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 .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--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 .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 .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 .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}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 .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}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 .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}",{"title":285,"searchDepth":425,"depth":425,"links":778},[779,780,781,782],{"id":54,"depth":425,"text":55},{"id":222,"depth":425,"text":223},{"id":277,"depth":425,"text":278},{"id":310,"depth":425,"text":311},"Answered by name or by type, and the ports Fougere opens itself.","md",null,"extending",{},true,"\u002Fdocs\u002Fextending\u002Fextension-points",{"title":8,"description":783},"docs\u002F8.extending\u002F4.extension-points","pUDPH7UxJroidVdFv70-OJgVY2aTBX3A0kpHNFAbYi8",[794,797,800,803,806,809,812,814,817,822,828,833,837,841,845,849,853,858,862,866,871,874,879,883,887,891,895,899,903,907,911,915,919,923,927,931,935,938,941,944,947,948,950,953,956,959,962],{"path":795,"title":796,"uses":785},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":798,"title":799,"uses":785},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":801,"title":802,"uses":785},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":804,"title":805,"uses":785},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":807,"title":808,"uses":785},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":810,"title":811,"uses":785},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":813,"title":253,"uses":785},"\u002Fdocs\u002Fconcepts\u002Fport",{"path":815,"title":816,"uses":785},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":818,"title":819,"uses":820},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[411,821],"frond",{"path":823,"title":824,"uses":825},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[826,827],"configuration","handler",{"path":829,"title":830,"uses":831},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[832,826],"entity",{"path":834,"title":835,"uses":836},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[826,832],{"path":838,"title":839,"uses":840},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[832,411],{"path":842,"title":843,"uses":844},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[832],{"path":846,"title":847,"uses":848},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[832],{"path":850,"title":851,"uses":852},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[832,826],{"path":854,"title":855,"uses":856},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[857],"repository",{"path":859,"title":860,"uses":861},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[857],{"path":863,"title":864,"uses":865},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[411,821],{"path":867,"title":868,"uses":869},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[870],"fact",{"path":770,"title":872,"uses":873},"REST, OpenAPI, GraphQL",[827,826],{"path":875,"title":876,"uses":877},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[827,878],"facade",{"path":880,"title":881,"uses":882},"\u002Fdocs\u002Fserve\u002Fforms","A form",[832],{"path":884,"title":885,"uses":886},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[827],{"path":888,"title":889,"uses":890},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[826,821],{"path":892,"title":893,"uses":894},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[826,821],{"path":896,"title":897,"uses":898},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[826],{"path":900,"title":901,"uses":902},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[826,827],{"path":904,"title":905,"uses":906},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[827],{"path":908,"title":909,"uses":910},"\u002Fdocs\u002Frun\u002Ftest","Test",[832,411],{"path":912,"title":913,"uses":914},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[821,826],{"path":916,"title":917,"uses":918},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[821,826],{"path":920,"title":921,"uses":922},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[832],{"path":924,"title":925,"uses":926},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[826],{"path":928,"title":929,"uses":930},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[878,821],{"path":932,"title":933,"uses":934},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":936,"title":937,"uses":785},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":939,"title":940,"uses":785},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":942,"title":943,"uses":785},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":945,"title":946,"uses":785},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":789,"title":8,"uses":785},{"path":182,"title":949,"uses":785},"Teach a word",{"path":951,"title":952,"uses":785},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":954,"title":955,"uses":785},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":957,"title":958,"uses":785},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":960,"title":961,"uses":785},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":963,"title":964,"uses":785},"\u002Fdocs","What is Fougere",[966],{"title":967,"path":963,"stem":968,"children":969,"page":-1},"Docs","docs",[970,972,993,1002,1023,1032,1045,1062,1079],{"title":964,"path":963,"stem":971},"docs\u002Findex",{"title":973,"path":974,"stem":975,"children":976,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[977,979,981,983,985,987,989,991],{"title":796,"path":795,"stem":978},"docs\u002F1.concepts\u002F1.entity",{"title":799,"path":798,"stem":980},"docs\u002F1.concepts\u002F2.handler",{"title":802,"path":801,"stem":982},"docs\u002F1.concepts\u002F3.repository",{"title":805,"path":804,"stem":984},"docs\u002F1.concepts\u002F4.frond",{"title":808,"path":807,"stem":986},"docs\u002F1.concepts\u002F5.facade",{"title":811,"path":810,"stem":988},"docs\u002F1.concepts\u002F6.fact",{"title":253,"path":813,"stem":990},"docs\u002F1.concepts\u002F7.port",{"title":816,"path":815,"stem":992},"docs\u002F1.concepts\u002F8.configuration",{"title":994,"path":995,"stem":996,"children":997,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[998,1000],{"title":819,"path":818,"stem":999},"docs\u002F2.access\u002F1.authentication",{"title":824,"path":823,"stem":1001},"docs\u002F2.access\u002F2.state",{"title":1003,"path":1004,"stem":1005,"children":1006,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[1007,1009,1011,1013,1015,1017,1019,1021],{"title":830,"path":829,"stem":1008},"docs\u002F3.data\u002F1.sql",{"title":835,"path":834,"stem":1010},"docs\u002F3.data\u002F2.several-databases",{"title":839,"path":838,"stem":1012},"docs\u002F3.data\u002F3.computed-field",{"title":843,"path":842,"stem":1014},"docs\u002F3.data\u002F4.evolve",{"title":847,"path":846,"stem":1016},"docs\u002F3.data\u002F5.seeds",{"title":851,"path":850,"stem":1018},"docs\u002F3.data\u002F6.values",{"title":855,"path":854,"stem":1020},"docs\u002F3.data\u002F7.mirror",{"title":860,"path":859,"stem":1022},"docs\u002F3.data\u002F8.together",{"title":1024,"path":1025,"stem":1026,"children":1027,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[1028,1030],{"title":864,"path":863,"stem":1029},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":868,"path":867,"stem":1031},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":1033,"path":1034,"stem":1035,"children":1036,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[1037,1039,1041,1043],{"title":872,"path":770,"stem":1038},"docs\u002F5.serve\u002F1.rest-graphql",{"title":876,"path":875,"stem":1040},"docs\u002F5.serve\u002F2.pages",{"title":881,"path":880,"stem":1042},"docs\u002F5.serve\u002F3.forms",{"title":885,"path":884,"stem":1044},"docs\u002F5.serve\u002F4.admin",{"title":1046,"path":1047,"stem":1048,"children":1049,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[1050,1052,1054,1056,1058,1060],{"title":889,"path":888,"stem":1051},"docs\u002F6.run\u002F1.deploy",{"title":893,"path":892,"stem":1053},"docs\u002F6.run\u002F2.secure",{"title":897,"path":896,"stem":1055},"docs\u002F6.run\u002F3.lifecycle",{"title":901,"path":900,"stem":1057},"docs\u002F6.run\u002F4.observe",{"title":905,"path":904,"stem":1059},"docs\u002F6.run\u002F5.dev-panel",{"title":909,"path":908,"stem":1061},"docs\u002F6.run\u002F6.test",{"title":1063,"path":1064,"stem":1065,"children":1066,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[1067,1069,1071,1073,1075,1077],{"title":913,"path":912,"stem":1068},"docs\u002F7.adopt\u002F1.new-project",{"title":917,"path":916,"stem":1070},"docs\u002F7.adopt\u002F2.existing-app",{"title":921,"path":920,"stem":1072},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":925,"path":924,"stem":1074},"docs\u002F7.adopt\u002F4.hosts",{"title":929,"path":928,"stem":1076},"docs\u002F7.adopt\u002F5.another-repository",{"title":933,"path":932,"stem":1078},"docs\u002F7.adopt\u002F6.demos",{"title":1080,"path":1081,"stem":1082,"children":1083,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[1084,1086,1088,1090,1092,1093,1095,1097,1099,1101],{"title":937,"path":936,"stem":1085},"docs\u002F8.extending\u002F1.scan",{"title":940,"path":939,"stem":1087},"docs\u002F8.extending\u002F10.without-compiler",{"title":943,"path":942,"stem":1089},"docs\u002F8.extending\u002F2.boot",{"title":946,"path":945,"stem":1091},"docs\u002F8.extending\u002F3.card-and-wire",{"title":8,"path":789,"stem":791},{"title":949,"path":182,"stem":1094},"docs\u002F8.extending\u002F5.vocabulary",{"title":952,"path":951,"stem":1096},"docs\u002F8.extending\u002F6.extensions",{"title":955,"path":954,"stem":1098},"docs\u002F8.extending\u002F7.source-adapter",{"title":958,"path":957,"stem":1100},"docs\u002F8.extending\u002F8.surface",{"title":961,"path":960,"stem":1102},"docs\u002F8.extending\u002F9.foreign-frond",1794396615332]