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