[{"data":1,"prerenderedAt":824},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Fbusiness\u002Fseeds":186},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,50,75,120,145],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":25,"path":26,"stem":27},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":29,"path":30,"stem":31,"children":32,"page":49},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[33,37,41,45],{"title":34,"path":35,"stem":36},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":38,"path":39,"stem":40},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":42,"path":43,"stem":44},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":46,"path":47,"stem":48},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[55,59,63,67,71],{"title":56,"path":57,"stem":58},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":60,"path":61,"stem":62},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":64,"path":65,"stem":66},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":68,"path":69,"stem":70},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":72,"path":73,"stem":74},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":76,"path":77,"stem":78,"children":79,"page":49},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[80,84,88,92,96,100,104,108,112,116],{"title":81,"path":82,"stem":83},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":85,"path":86,"stem":87},"Ports","\u002Fdocs\u002Fbusiness\u002Fports","docs\u002F4.business\u002F10.ports",{"title":89,"path":90,"stem":91},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":93,"path":94,"stem":95},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":97,"path":98,"stem":99},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":101,"path":102,"stem":103},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":105,"path":106,"stem":107},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":109,"path":110,"stem":111},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":113,"path":114,"stem":115},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":117,"path":118,"stem":119},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":121,"path":122,"stem":123,"children":124,"page":49},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[125,129,133,137,141],{"title":126,"path":127,"stem":128},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":130,"path":131,"stem":132},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":134,"path":135,"stem":136},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":138,"path":139,"stem":140},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":142,"path":143,"stem":144},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":146,"path":147,"stem":148,"children":149,"page":49},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":155,"path":156,"stem":157},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":159,"path":160,"stem":161},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":163,"path":164,"stem":165},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":167,"path":168,"stem":169},"Sources","\u002Fdocs\u002Finfra\u002Fsources","docs\u002F6.infra\u002F5.sources",{"title":171,"path":172,"stem":173},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":175,"path":176,"stem":177},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":179,"path":180,"stem":181},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":183,"path":184,"stem":185},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",{"id":187,"title":101,"body":188,"description":819,"extension":820,"meta":821,"navigation":298,"path":102,"seo":822,"stem":103,"__hash__":823},"docs_en\u002Fdocs\u002F4.business\u002F5.seeds.md",{"type":189,"value":190,"toc":816},"minimark",[191,195,208,745,750,802,805,812],[192,193,101],"h1",{"id":194},"seeds",[196,197,198,199,203,204,207],"p",{},"A seed is a file in a Frond's ",[200,201,202],"code",{},"seeds\u002F"," directory, run at startup after migration. It\nreceives ",[200,205,206],{},"resolve"," and calls the same façades as the application.",[209,210,215],"pre",{"className":211,"code":212,"language":213,"meta":214,"style":214},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fronds\u002Fblog\u002Fseeds\u002FPost.seed.ts\ntype Facade = Record\u003Cstring, (inv?: Record\u003Cstring, unknown>) => Promise\u003Cany>>;\n\nexport default async (resolve: \u003CT>(name: string) => T) => {\n  const posts = resolve\u003CFacade>('post');\n\n  \u002F\u002F This seed runs only when the database is empty.\n  const existing = await posts.list();\n  if (existing.length > 0) return [];\n\n  const created = await posts.create({\n    params: {}, query: {},\n    body: { slug: 'hello', title: 'Hello', body: '…' },\n    state: { user: { id: 'seed-author' } },   \u002F\u002F identity used by the seed\n  });\n\n  \u002F\u002F The transition uses the publish operation.\n  await posts.publish({ params: { id: created.id }, query: {}, body: undefined,\n                        state: { user: { id: 'seed-author' } } });\n\n  return [];   \u002F\u002F nothing left for the boot loop\n};\n","ts","",[200,216,217,226,293,300,353,395,400,406,433,467,472,496,515,570,608,618,623,629,684,720,725,739],{"__ignoreMap":214},[218,219,222],"span",{"class":220,"line":221},"line",1,[218,223,225],{"class":224},"sutJx","\u002F\u002F fronds\u002Fblog\u002Fseeds\u002FPost.seed.ts\n",[218,227,229,233,237,241,244,248,252,255,258,262,265,267,269,271,273,276,279,282,285,287,290],{"class":220,"line":228},2,[218,230,232],{"class":231},"sbsja","type",[218,234,236],{"class":235},"sbgvK"," Facade",[218,238,240],{"class":239},"smGrS"," =",[218,242,243],{"class":235}," Record",[218,245,247],{"class":246},"sP7_E","\u003C",[218,249,251],{"class":250},"sZMiF","string",[218,253,254],{"class":246},",",[218,256,257],{"class":246}," (",[218,259,261],{"class":260},"s99_P","inv",[218,263,264],{"class":239},"?:",[218,266,243],{"class":235},[218,268,247],{"class":246},[218,270,251],{"class":250},[218,272,254],{"class":246},[218,274,275],{"class":250}," unknown",[218,277,278],{"class":246},">)",[218,280,281],{"class":231}," =>",[218,283,284],{"class":235}," Promise",[218,286,247],{"class":246},[218,288,289],{"class":250},"any",[218,291,292],{"class":246},">>;\n",[218,294,296],{"class":220,"line":295},3,[218,297,299],{"emptyLinePlaceholder":298},true,"\n",[218,301,303,307,310,313,315,318,321,324,327,330,333,335,338,341,343,346,348,350],{"class":220,"line":302},4,[218,304,306],{"class":305},"sVHd0","export",[218,308,309],{"class":305}," default",[218,311,312],{"class":231}," async",[218,314,257],{"class":246},[218,316,206],{"class":317},"sGLFI",[218,319,320],{"class":239},":",[218,322,323],{"class":246}," \u003C",[218,325,326],{"class":235},"T",[218,328,329],{"class":246},">(",[218,331,332],{"class":260},"name",[218,334,320],{"class":239},[218,336,337],{"class":250}," string",[218,339,340],{"class":246},")",[218,342,281],{"class":231},[218,344,345],{"class":235}," T",[218,347,340],{"class":246},[218,349,281],{"class":231},[218,351,352],{"class":246}," {\n",[218,354,356,359,363,365,368,370,373,376,380,384,388,390,392],{"class":220,"line":355},5,[218,357,358],{"class":231},"  const",[218,360,362],{"class":361},"s_hVV"," posts",[218,364,240],{"class":239},[218,366,367],{"class":317}," resolve",[218,369,247],{"class":246},[218,371,372],{"class":235},"Facade",[218,374,375],{"class":246},">",[218,377,379],{"class":378},"skxfh","(",[218,381,383],{"class":382},"sjJ54","'",[218,385,387],{"class":386},"s_sjI","post",[218,389,383],{"class":382},[218,391,340],{"class":378},[218,393,394],{"class":246},";\n",[218,396,398],{"class":220,"line":397},6,[218,399,299],{"emptyLinePlaceholder":298},[218,401,403],{"class":220,"line":402},7,[218,404,405],{"class":224},"  \u002F\u002F This seed runs only when the database is empty.\n",[218,407,409,411,414,416,419,422,425,428,431],{"class":220,"line":408},8,[218,410,358],{"class":231},[218,412,413],{"class":361}," existing",[218,415,240],{"class":239},[218,417,418],{"class":305}," await",[218,420,362],{"class":421},"su5hD",[218,423,424],{"class":246},".",[218,426,427],{"class":317},"list",[218,429,430],{"class":378},"()",[218,432,394],{"class":246},[218,434,436,439,441,444,446,449,452,456,459,462,465],{"class":220,"line":435},9,[218,437,438],{"class":305},"  if",[218,440,257],{"class":378},[218,442,443],{"class":421},"existing",[218,445,424],{"class":246},[218,447,448],{"class":361},"length",[218,450,451],{"class":239}," >",[218,453,455],{"class":454},"srdBf"," 0",[218,457,458],{"class":378},") ",[218,460,461],{"class":305},"return",[218,463,464],{"class":378}," []",[218,466,394],{"class":246},[218,468,470],{"class":220,"line":469},10,[218,471,299],{"emptyLinePlaceholder":298},[218,473,475,477,480,482,484,486,488,491,493],{"class":220,"line":474},11,[218,476,358],{"class":231},[218,478,479],{"class":361}," created",[218,481,240],{"class":239},[218,483,418],{"class":305},[218,485,362],{"class":421},[218,487,424],{"class":246},[218,489,490],{"class":317},"create",[218,492,379],{"class":378},[218,494,495],{"class":246},"{\n",[218,497,499,502,504,507,510,512],{"class":220,"line":498},12,[218,500,501],{"class":378},"    params",[218,503,320],{"class":246},[218,505,506],{"class":246}," {},",[218,508,509],{"class":378}," query",[218,511,320],{"class":246},[218,513,514],{"class":246}," {},\n",[218,516,518,521,523,526,529,531,534,537,539,541,544,546,548,551,553,555,558,560,562,565,567],{"class":220,"line":517},13,[218,519,520],{"class":378},"    body",[218,522,320],{"class":246},[218,524,525],{"class":246}," {",[218,527,528],{"class":378}," slug",[218,530,320],{"class":246},[218,532,533],{"class":382}," '",[218,535,536],{"class":386},"hello",[218,538,383],{"class":382},[218,540,254],{"class":246},[218,542,543],{"class":378}," title",[218,545,320],{"class":246},[218,547,533],{"class":382},[218,549,550],{"class":386},"Hello",[218,552,383],{"class":382},[218,554,254],{"class":246},[218,556,557],{"class":378}," body",[218,559,320],{"class":246},[218,561,533],{"class":382},[218,563,564],{"class":386},"…",[218,566,383],{"class":382},[218,568,569],{"class":246}," },\n",[218,571,573,576,578,580,583,585,587,590,592,594,597,599,602,605],{"class":220,"line":572},14,[218,574,575],{"class":378},"    state",[218,577,320],{"class":246},[218,579,525],{"class":246},[218,581,582],{"class":378}," user",[218,584,320],{"class":246},[218,586,525],{"class":246},[218,588,589],{"class":378}," id",[218,591,320],{"class":246},[218,593,533],{"class":382},[218,595,596],{"class":386},"seed-author",[218,598,383],{"class":382},[218,600,601],{"class":246}," }",[218,603,604],{"class":246}," },",[218,606,607],{"class":224},"   \u002F\u002F identity used by the seed\n",[218,609,611,614,616],{"class":220,"line":610},15,[218,612,613],{"class":246},"  }",[218,615,340],{"class":378},[218,617,394],{"class":246},[218,619,621],{"class":220,"line":620},16,[218,622,299],{"emptyLinePlaceholder":298},[218,624,626],{"class":220,"line":625},17,[218,627,628],{"class":224},"  \u002F\u002F The transition uses the publish operation.\n",[218,630,632,635,637,639,642,644,647,650,652,654,656,658,660,662,665,667,669,671,673,675,677,681],{"class":220,"line":631},18,[218,633,634],{"class":305},"  await",[218,636,362],{"class":421},[218,638,424],{"class":246},[218,640,641],{"class":317},"publish",[218,643,379],{"class":378},[218,645,646],{"class":246},"{",[218,648,649],{"class":378}," params",[218,651,320],{"class":246},[218,653,525],{"class":246},[218,655,589],{"class":378},[218,657,320],{"class":246},[218,659,479],{"class":421},[218,661,424],{"class":246},[218,663,664],{"class":421},"id",[218,666,604],{"class":246},[218,668,509],{"class":378},[218,670,320],{"class":246},[218,672,506],{"class":246},[218,674,557],{"class":378},[218,676,320],{"class":246},[218,678,680],{"class":679},"s39Yj"," undefined",[218,682,683],{"class":246},",\n",[218,685,687,690,692,694,696,698,700,702,704,706,708,710,712,714,716,718],{"class":220,"line":686},19,[218,688,689],{"class":378},"                        state",[218,691,320],{"class":246},[218,693,525],{"class":246},[218,695,582],{"class":378},[218,697,320],{"class":246},[218,699,525],{"class":246},[218,701,589],{"class":378},[218,703,320],{"class":246},[218,705,533],{"class":382},[218,707,596],{"class":386},[218,709,383],{"class":382},[218,711,601],{"class":246},[218,713,601],{"class":246},[218,715,601],{"class":246},[218,717,340],{"class":378},[218,719,394],{"class":246},[218,721,723],{"class":220,"line":722},20,[218,724,299],{"emptyLinePlaceholder":298},[218,726,728,731,733,736],{"class":220,"line":727},21,[218,729,730],{"class":305},"  return",[218,732,464],{"class":378},[218,734,735],{"class":246},";",[218,737,738],{"class":224},"   \u002F\u002F nothing left for the boot loop\n",[218,740,742],{"class":220,"line":741},22,[218,743,744],{"class":246},"};\n",[746,747,749],"h2",{"id":748},"the-contract","The contract",[751,752,753,769,780,792],"ul",{},[754,755,756,760,761,764,765,768],"li",{},[757,758,759],"strong",{},"Export",": ",[200,762,763],{},"default async (resolve) => rows[]",". Returning ",[200,766,767],{},"[]"," means \"done here\".",[754,770,771,776,777,424],{},[757,772,773],{},[200,774,775],{},"resolve('\u003Centity>')"," returns the entity's façade — each operation takes a full\ninvocation ",[200,778,779],{},"{ params, query, body, state }",[754,781,782,788,789,791],{},[757,783,784,787],{},[200,785,786],{},"state"," is set by the seed",": because it runs server-side, it can provide the identity\nexpected by operations. The ",[200,790,641],{}," call above therefore still performs its author\ncheck.",[754,793,794,797,798,801],{},[757,795,796],{},"Idempotence"," is the seed's responsibility; the guard is one ",[200,799,800],{},"list()"," + early return.",[196,803,804],{},"Going through the façade applies the same validation, lifecycle rules, and errors used by\napplication calls.",[196,806,807,808,811],{},"Next: ",[809,810,126],"a",{"href":127}," — the client couple.",[813,814,815],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}",{"title":214,"searchDepth":228,"depth":228,"links":817},[818],{"id":748,"depth":228,"text":749},"Initialize data at startup by calling the Frond's operations.","md",{},{"title":101,"description":819},"yTZlyRVGO53PFEap4L0_GZYP--Lu7zfNGkN_ByaDmfw",1788560230751]