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