[{"data":1,"prerenderedAt":982},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage":189},[4],{"title":5,"path":6,"stem":7,"children":8,"page":52},"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,31,53,78,123,148],{"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},"Une app que vous avez déjà","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"Apportez votre schéma","\u002Ffr\u002Fdocs\u002Fbring-your-schema","fr\u002Fdocs\u002F03.bring-your-schema",{"title":28,"path":29,"stem":30},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F04.cli",{"title":32,"path":33,"stem":34,"children":35,"page":52},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[36,40,44,48],{"title":37,"path":38,"stem":39},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":41,"path":42,"stem":43},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":45,"path":46,"stem":47},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",{"title":49,"path":50,"stem":51},"Le socle","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base","fr\u002Fdocs\u002F2.concepts\u002F4.the-base",false,{"title":54,"path":55,"stem":56,"children":57,"page":52},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":63,"path":64,"stem":65},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":67,"path":68,"stem":69},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":71,"path":72,"stem":73},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":75,"path":76,"stem":77},"Comment un schéma bouge","\u002Ffr\u002Fdocs\u002Fschema\u002Fevolution","fr\u002Fdocs\u002F3.schema\u002F5.evolution",{"title":79,"path":80,"stem":81,"children":82,"page":52},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":88,"path":89,"stem":90},"Les ports","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fports","fr\u002Fdocs\u002F4.business\u002F10.ports",{"title":92,"path":93,"stem":94},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":96,"path":97,"stem":98},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":100,"path":101,"stem":102},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":104,"path":105,"stem":106},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":108,"path":109,"stem":110},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":112,"path":113,"stem":114},"Le port Storage","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage","fr\u002Fdocs\u002F4.business\u002F7.storage",{"title":116,"path":117,"stem":118},"Des écritures qui tiennent ou tombent ensemble","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ftogether","fr\u002Fdocs\u002F4.business\u002F8.together",{"title":120,"path":121,"stem":122},"Les repositories","\u002Ffr\u002Fdocs\u002Fbusiness\u002Frepositories","fr\u002Fdocs\u002F4.business\u002F9.repositories",{"title":124,"path":125,"stem":126,"children":127,"page":52},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":133,"path":134,"stem":135},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":137,"path":138,"stem":139},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":141,"path":142,"stem":143},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":145,"path":146,"stem":147},"Back-office","\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin","fr\u002Fdocs\u002F5.client\u002F5.admin",{"title":149,"path":150,"stem":151,"children":152,"page":52},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[153,157,161,165,169,173,177,181,185],{"title":154,"path":155,"stem":156},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":158,"path":159,"stem":160},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":162,"path":163,"stem":164},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":166,"path":167,"stem":168},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"title":170,"path":171,"stem":172},"Les sources","\u002Ffr\u002Fdocs\u002Finfra\u002Fsources","fr\u002Fdocs\u002F6.infra\u002F5.sources",{"title":174,"path":175,"stem":176},"Le cycle de vie","\u002Ffr\u002Fdocs\u002Finfra\u002Flifecycle","fr\u002Fdocs\u002F6.infra\u002F6.lifecycle",{"title":178,"path":179,"stem":180},"L'identité entre Fronds","\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity","fr\u002Fdocs\u002F6.infra\u002F7.identity",{"title":182,"path":183,"stem":184},"Observabilité","\u002Ffr\u002Fdocs\u002Finfra\u002Fobservability","fr\u002Fdocs\u002F6.infra\u002F8.observability",{"title":186,"path":187,"stem":188},"Tests","\u002Ffr\u002Fdocs\u002Finfra\u002Ftesting","fr\u002Fdocs\u002F6.infra\u002F9.testing",{"id":190,"title":112,"body":191,"description":977,"extension":978,"meta":979,"navigation":289,"path":113,"seo":980,"stem":114,"__hash__":981},"docs_fr\u002Ffr\u002Fdocs\u002F4.business\u002F7.storage.md",{"type":192,"value":193,"toc":969},"minimark",[194,198,211,222,381,399,408,413,585,589,603,723,733,739,804,811,821,825,835,888,891,906,910,921,927,936,951,960,965],[195,196,112],"h1",{"id":197},"le-port-storage",[199,200,201,205,206,210],"p",{},[202,203,204],"code",{},"Storage\u003CPost>"," est le jeu de gestes auquel les lignes de Post répondent. C'est un\n",[207,208,209],"strong",{},"port"," : fixe, sans parfum de domaine, implémenté par le stockage que l'application a\nrésolu.",[199,212,213,216,217,221],{},[207,214,215],{},"Vous ne le demandez pas par son nom."," Un handler, un presenter et un collector\natteignent le stockage par un ",[218,219,220],"a",{"href":121},"repository",", qui transmet\ntous les gestes ci-dessous et est enregistré que le fichier ait été écrit ou non :",[223,224,229],"pre",{"className":225,"code":226,"language":227,"meta":228,"style":228},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","export default class PostHandler {\n  constructor(private posts: PostRepository) {}\n\n  async recent() { return this.posts.list({ orderBy: 'publishedAt', order: 'desc' }); }\n}\n","ts","",[202,230,231,255,284,291,375],{"__ignoreMap":228},[232,233,236,240,243,247,251],"span",{"class":234,"line":235},"line",1,[232,237,239],{"class":238},"sVHd0","export",[232,241,242],{"class":238}," default",[232,244,246],{"class":245},"sbsja"," class",[232,248,250],{"class":249},"sbgvK"," PostHandler",[232,252,254],{"class":253},"sP7_E"," {\n",[232,256,258,261,264,267,271,275,278,281],{"class":234,"line":257},2,[232,259,260],{"class":245},"  constructor",[232,262,263],{"class":253},"(",[232,265,266],{"class":245},"private",[232,268,270],{"class":269},"s99_P"," posts",[232,272,274],{"class":273},"smGrS",":",[232,276,277],{"class":249}," PostRepository",[232,279,280],{"class":253},")",[232,282,283],{"class":253}," {}\n",[232,285,287],{"class":234,"line":286},3,[232,288,290],{"emptyLinePlaceholder":289},true,"\n",[232,292,294,297,301,304,307,310,314,317,321,323,327,330,333,336,338,342,346,349,352,355,357,359,362,364,367,369,372],{"class":234,"line":293},4,[232,295,296],{"class":245},"  async",[232,298,300],{"class":299},"sVXei"," recent",[232,302,303],{"class":253},"()",[232,305,306],{"class":253}," {",[232,308,309],{"class":238}," return",[232,311,313],{"class":312},"s39Yj"," this",[232,315,316],{"class":253},".",[232,318,320],{"class":319},"su5hD","posts",[232,322,316],{"class":253},[232,324,326],{"class":325},"sGLFI","list",[232,328,263],{"class":329},"skxfh",[232,331,332],{"class":253},"{",[232,334,335],{"class":329}," orderBy",[232,337,274],{"class":253},[232,339,341],{"class":340},"sjJ54"," '",[232,343,345],{"class":344},"s_sjI","publishedAt",[232,347,348],{"class":340},"'",[232,350,351],{"class":253},",",[232,353,354],{"class":329}," order",[232,356,274],{"class":253},[232,358,341],{"class":340},[232,360,361],{"class":344},"desc",[232,363,348],{"class":340},[232,365,366],{"class":253}," }",[232,368,280],{"class":329},[232,370,371],{"class":253},";",[232,373,374],{"class":253}," }\n",[232,376,378],{"class":234,"line":377},5,[232,379,380],{"class":253},"}\n",[199,382,383,384,387,388,391,392,398],{},"Nommer le port dans l'un de ces trois est refusé au boot. Un seul chemin, et un seul mot\npour le dire — de sorte qu'une entité qui appartiendra plus tard à un\n",[218,385,386],{"href":121},"agrégat"," ne fait bouger aucun appel. L'exception est un\n",[207,389,390],{},"détenteur"," : une classe qu'un prefab a bâtie sur son entité — un\n",[218,393,395],{"href":394},"\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base#mirror--une-copie-locale-de-lignes-quon-ne-peut-pas-interroger",[202,396,397],{},"Mirror"," — peut nommer le port de cette entité,\nparce que tenir le stockage est sa raison d'être.",[199,400,401,402,407],{},"Un handler ",[218,403,404],{"href":85},[202,405,406],{},"Crud(Post)"," reçoit son repository\nautomatiquement. Une requête qui mérite un nom vit sur ce repository, pas épelée sur le\nsite d'appel.",[409,410,412],"h2",{"id":411},"les-gestes","Les gestes",[414,415,416,427],"table",{},[417,418,419],"thead",{},[420,421,422,425],"tr",{},[423,424],"th",{},[423,426],{},[428,429,430,457,470,484,501,519,529,539,549,562,575],"tbody",{},[420,431,432,438],{},[433,434,435],"td",{},[202,436,437],{},"list(options?)",[433,439,440,441,444,445,444,448,444,451,444,454],{},"une page, avec ",[202,442,443],{},"where",", ",[202,446,447],{},"orderBy",[202,449,450],{},"limit",[202,452,453],{},"offset",[202,455,456],{},"count",[420,458,459,464],{},[433,460,461],{},[202,462,463],{},"findById(id)",[433,465,466,467],{},"une ligne, ou ",[202,468,469],{},"undefined",[420,471,472,481],{},[433,473,474,477,478],{},[202,475,476],{},"findBy(criteria)"," \u002F ",[202,479,480],{},"findAllBy(criteria)",[433,482,483],{},"une ligne, ou toutes, par égalité",[420,485,486,491],{},[433,487,488],{},[202,489,490],{},"findByKeys(ids)",[433,492,493,494,497,498],{},"un ",[207,495,496],{},"ensemble"," de lignes par clé, en ",[202,499,500],{},"Map",[420,502,503,508],{},[433,504,505],{},[202,506,507],{},"findAllByKeys(field, keys)",[433,509,510,511,515,516,518],{},"son dual : les lignes qui pointent ",[512,513,514],"em",{},"vers"," chaque clé, en ",[202,517,500],{}," de listes",[420,520,521,526],{},[433,522,523],{},[202,524,525],{},"create(input)",[433,527,528],{},"insère, et rend la ligne complète",[420,530,531,536],{},[433,532,533],{},[202,534,535],{},"upsert(input)",[433,537,538],{},"écrit la ligne, ou fait ressembler l'existante à celle-ci",[420,540,541,546],{},[433,542,543],{},[202,544,545],{},"upsertAll(inputs)",[433,547,548],{},"une page entière en une instruction, répond combien de lignes ont été écrites",[420,550,551,559],{},[433,552,553,477,556],{},[202,554,555],{},"update(id, input)",[202,557,558],{},"delete(id)",[433,560,561],{},"par clé",[420,563,564,569],{},[433,565,566],{},[202,567,568],{},"output(view)",[433,570,571,572],{},"un storage restreint aux champs d'une ",[218,573,574],{"href":64},"vue",[420,576,577,582],{},[433,578,579],{},[202,580,581],{},"client",[433,583,584],{},"ce que le port enveloppe — voir l'avertissement plus bas",[409,586,588],{"id":587},"lire-un-ensemble-pas-une-ligne-à-la-fois","Lire un ensemble, pas une ligne à la fois",[199,590,591,594,595,598,599,602],{},[202,592,593],{},"findAllBy"," compare avec ",[202,596,597],{},"=",", donc on ne pouvait pas lui passer une liste d'identifiants :\nle seul moyen de lire N lignes était ",[202,600,601],{},"list()"," puis un filtre en mémoire. C'est invisible sur\nun fichier SQLite local, et c'est la table entière le jour où les lignes ne sont plus là.",[223,604,606],{"className":225,"code":605,"language":227,"meta":228,"style":228},"const authors = await authorStorage.findByKeys(posts.map((p) => p.authorId));\nreturn posts.map((post) => ({ ...post, author: authors.get(post.authorId) }));\n",[202,607,608,661],{"__ignoreMap":228},[232,609,610,613,617,620,623,626,628,631,634,636,639,641,643,645,647,650,653,655,658],{"class":234,"line":235},[232,611,612],{"class":245},"const",[232,614,616],{"class":615},"s_hVV"," authors",[232,618,619],{"class":273}," =",[232,621,622],{"class":238}," await",[232,624,625],{"class":319}," authorStorage",[232,627,316],{"class":253},[232,629,630],{"class":325},"findByKeys",[232,632,633],{"class":319},"(posts",[232,635,316],{"class":253},[232,637,638],{"class":325},"map",[232,640,263],{"class":319},[232,642,263],{"class":253},[232,644,199],{"class":269},[232,646,280],{"class":253},[232,648,649],{"class":245}," =>",[232,651,652],{"class":319}," p",[232,654,316],{"class":253},[232,656,657],{"class":319},"authorId))",[232,659,660],{"class":253},";\n",[232,662,663,666,668,670,672,674,676,679,681,683,686,688,691,693,695,698,700,702,704,707,710,712,715,718,721],{"class":234,"line":257},[232,664,665],{"class":238},"return",[232,667,270],{"class":319},[232,669,316],{"class":253},[232,671,638],{"class":325},[232,673,263],{"class":319},[232,675,263],{"class":253},[232,677,678],{"class":269},"post",[232,680,280],{"class":253},[232,682,649],{"class":245},[232,684,685],{"class":319}," (",[232,687,332],{"class":253},[232,689,690],{"class":273}," ...",[232,692,678],{"class":319},[232,694,351],{"class":253},[232,696,697],{"class":329}," author",[232,699,274],{"class":253},[232,701,616],{"class":319},[232,703,316],{"class":253},[232,705,706],{"class":325},"get",[232,708,709],{"class":319},"(post",[232,711,316],{"class":253},[232,713,714],{"class":319},"authorId) ",[232,716,717],{"class":253},"}",[232,719,720],{"class":319},"))",[232,722,660],{"class":253},[199,724,725,726,728,729,732],{},"Il répond une ",[207,727,500],{},", parce que l'appelant tient des clés et non des positions. Une absence\nest l'absence d'une clé, une clé répétée est une entrée, et une page se rapproche par\n",[202,730,731],{},"get(row.authorId)",". Une liste ne pouvait pas promettre ce rapprochement — laisser tomber\nune absence décale toutes les positions suivantes — donc chaque appelant reconstruisait\nl'index que l'implémentation venait de jeter.",[199,734,735,738],{},[202,736,737],{},"findAllByKeys"," est l'autre direction de la même relation :",[223,740,742],{"className":225,"code":741,"language":227,"meta":228,"style":228},"\u002F\u002F tous les commentaires de tous les posts de la page, en une requête\nconst byPost = await commentStorage.findAllByKeys('postId', posts.map((p) => p.id));\n",[202,743,744,750],{"__ignoreMap":228},[232,745,746],{"class":234,"line":235},[232,747,749],{"class":748},"sutJx","\u002F\u002F tous les commentaires de tous les posts de la page, en une requête\n",[232,751,752,754,757,759,761,764,766,768,770,772,775,777,779,781,783,785,787,789,791,793,795,797,799,802],{"class":234,"line":257},[232,753,612],{"class":245},[232,755,756],{"class":615}," byPost",[232,758,619],{"class":273},[232,760,622],{"class":238},[232,762,763],{"class":319}," commentStorage",[232,765,316],{"class":253},[232,767,737],{"class":325},[232,769,263],{"class":319},[232,771,348],{"class":340},[232,773,774],{"class":344},"postId",[232,776,348],{"class":340},[232,778,351],{"class":253},[232,780,270],{"class":319},[232,782,316],{"class":253},[232,784,638],{"class":325},[232,786,263],{"class":319},[232,788,263],{"class":253},[232,790,199],{"class":269},[232,792,280],{"class":253},[232,794,649],{"class":245},[232,796,652],{"class":319},[232,798,316],{"class":253},[232,800,801],{"class":319},"id))",[232,803,660],{"class":253},[199,805,806,807,810],{},"Une clé sans ligne est simplement absente. Ensemble, les deux couvrent les deux côtés d'une\nrelation, chacun en une requête — c'est ce qui permet à un\n",[218,808,809],{"href":93},"presenter"," de recevoir la page et de n'émettre qu'une lecture\npour elle.",[812,813,814],"warning",{},[199,815,816,817,820],{},"La forme force la requête, pas le corps. ",[202,818,819],{},"Promise.all(rows.map(...))"," dans un champ calculé\német toujours une lecture par ligne, et rien ne le dit.",[409,822,824],{"id":823},"écrire-une-page","Écrire une page",[199,826,827,830,831,834],{},[202,828,829],{},"create"," lève à la deuxième passe, donc relire une source imposait de supprimer d'abord.\n",[202,832,833],{},"upsert"," écrit la ligne ou fait ressembler l'existante à celle-ci, en une instruction :",[223,836,838],{"className":225,"code":837,"language":227,"meta":228,"style":228},"await storage.upsert({ id: 'isbn-9782070423200', title: 'La Peste' });\n",[202,839,840],{"__ignoreMap":228},[232,841,842,845,848,850,852,854,856,859,861,863,866,868,870,873,875,877,880,882,884,886],{"class":234,"line":235},[232,843,844],{"class":238},"await",[232,846,847],{"class":319}," storage",[232,849,316],{"class":253},[232,851,833],{"class":325},[232,853,263],{"class":319},[232,855,332],{"class":253},[232,857,858],{"class":329}," id",[232,860,274],{"class":253},[232,862,341],{"class":340},[232,864,865],{"class":344},"isbn-9782070423200",[232,867,348],{"class":340},[232,869,351],{"class":253},[232,871,872],{"class":329}," title",[232,874,274],{"class":253},[232,876,341],{"class":340},[232,878,879],{"class":344},"La Peste",[232,881,348],{"class":340},[232,883,366],{"class":253},[232,885,280],{"class":319},[232,887,660],{"class":253},[199,889,890],{},"La clé et les marques de création survivent à l'écrasement — une ligne garde le moment où\nelle est apparue. Un moteur sans clause d'upsert refuse par son nom plutôt que d'en émuler\nune avec une lecture devant, ce qui promettrait une atomicité qu'il n'a pas.",[199,892,893,896,897,900,901,905],{},[202,894,895],{},"upsertAll"," prend une page et répond ",[207,898,899],{},"combien de lignes ont été écrites",", pas les lignes :\nun import n'agit sur aucune, et relire une page pour une symétrie que personne n'utilise\ndoublerait le travail. C'est ce à travers quoi\n",[218,902,903],{"href":394},[202,904,397],{},"\nécrit.",[409,907,909],{"id":908},"toute-écriture-par-le-port-est-jugée","Toute écriture par le port est jugée",[199,911,912,913,916,917,920],{},"Un handler écrit librement parce qu'il en est l'auteur, mais le port reste une sortie : une\nvaleur que l'entité interdit est refusée ici comme elle l'est à la façade. Les règles de\ncycle de vie sont réalisées à l'entrée — ",[202,914,915],{},"created()"," est estampillé, ",[202,918,919],{},"update: 'forbidden'","\nest appliqué — donc un handler ne les remplit jamais à la main.",[409,922,924,926],{"id":923},"client-et-ce-quil-coûte",[202,925,581],{}," — et ce qu'il coûte",[199,928,929,931,932,935],{},[202,930,581],{}," est l'instance sous-jacente : celle de Kysely pour l'adapter SQL, autre chose\nailleurs. Il est typé ",[202,933,934],{},"unknown"," volontairement — le rétrécir, c'est l'appelant qui dit tout\nhaut sur quelle implémentation il se tient.",[812,937,938],{},[199,939,940,943,944,946,947,950],{},[207,941,942],{},"Tous les juges sont posés sur les méthodes du port."," Une instruction émise par ",[202,945,581],{},"\nn'en rencontre aucun : une valeur que l'entité refuse atterrit dans la table sans un mot. La\nportée reste honnête — ",[202,948,949],{},"productStorage.client"," atteint les produits, pas toute la base — mais le\njuge ne tourne pas.",[199,952,953,954,959],{},"Pour « débiter A et créditer B, ou ni l'un ni l'autre », prendre\n",[218,955,956],{"href":117},[202,957,958],{},"Together"," : le même port, jugé de la même façon, avec un bloc\npour unité au lieu d'une instruction.",[199,961,962,963,316],{},"Suite : ",[218,964,116],{"href":117},[966,967,968],"style",{},"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 .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 .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .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 .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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}",{"title":228,"searchDepth":257,"depth":257,"links":970},[971,972,973,974,975],{"id":411,"depth":257,"text":412},{"id":587,"depth":257,"text":588},{"id":823,"depth":257,"text":824},{"id":908,"depth":257,"text":909},{"id":923,"depth":257,"text":976},"client — et ce qu'il coûte","Storage — les gestes que tout stockage répond, pourquoi un ensemble se lit en une requête, et la trappe de sortie qui éteint le juge.","md",{},{"title":112,"description":977},"hV_rfvOxeVAJJzWXM1oO4teNsvAvvQlxi2Y6OyRuSlc",1788598419401]