[{"data":1,"prerenderedAt":4332},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-third-party-with-graphql":342,"-fr-third-party-with-graphql-surround":4327},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Prise en main","i-lucide-rocket","/fr/getting-started","fr/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Qu'est-ce que Qora ?","/fr/getting-started/what-is-qora","fr/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/fr/getting-started/installation","fr/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Démarrage rapide","/fr/getting-started/quick-start","fr/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparaison","/fr/getting-started/comparison","fr/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Venant de TanStack Query","/fr/getting-started/coming-from-tanstack-query","fr/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrer depuis d'Autres Librairies","/fr/getting-started/migrating-from-other-libraries","fr/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"Assistants IA","/fr/getting-started/ai-assistants","fr/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Concepts clés","i-lucide-book-open","/fr/core-concepts","fr/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Requêtes","/fr/core-concepts/queries","fr/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Clés de requête","/fr/core-concepts/query-keys","fr/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"États des requêtes","/fr/core-concepts/query-states","fr/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Cache","/fr/core-concepts/caching","fr/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/fr/core-concepts/stale-while-revalidate","fr/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Déduplication","/fr/core-concepts/deduplication","fr/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations et invalidation","/fr/core-concepts/mutations","fr/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Hors-ligne et réseau","/fr/core-concepts/offline","fr/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Usage avec Flutter","i-lucide-smartphone","/fr/flutter-integration","fr/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Configuration","/fr/flutter-integration/setup","fr/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/fr/flutter-integration/qora-scope","fr/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/fr/flutter-integration/qora-builder","fr/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/fr/flutter-integration/qora-mutation-builder","fr/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/fr/flutter-integration/infinite-query-builder","fr/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/fr/flutter-integration/hooks","fr/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Widgets de statut réseau","/fr/flutter-integration/network-status","fr/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Bonnes pratiques","/fr/flutter-integration/best-practices","fr/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Guides Pratiques","i-lucide-chef-hat","/fr/recipes","fr/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/fr/recipes/mutations","fr/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Mises à jour optimistes","/fr/recipes/optimistic-updates","fr/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistance","/fr/recipes/persistence","fr/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Réseau adaptatif","/fr/recipes/network-aware","fr/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Requêtes infinies","/fr/recipes/infinite-queries","fr/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Requêtes dépendantes","/fr/recipes/dependent-queries","fr/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Annulation","/fr/recipes/cancel-token","fr/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"Hydratation SSR","/fr/recipes/ssr-hydration","fr/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Gestion des erreurs","/fr/recipes/error-handling","fr/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Tests","/fr/recipes/testing","fr/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Prefetch au Niveau des Routes","/fr/recipes/prefetch","fr/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"Référence de l'API","i-lucide-file-code","/fr/api-reference","fr/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/fr/api-reference/qora-client","fr/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/fr/api-reference/qora-key","fr/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/fr/api-reference/qora-state","fr/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/fr/api-reference/qora-options","fr/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/fr/api-reference/qora-client-config","fr/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"API Mutation","/fr/api-reference/qora-mutation","fr/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/fr/api-reference/persist-qora-client","fr/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Requête infinie","/fr/api-reference/infinite-query","fr/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"Outils de debug","i-lucide-bug","/fr/devtools","fr/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Vue d'ensemble","/fr/devtools/overview","fr/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"Overlay intégré","/fr/devtools/overlay","fr/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Sérialisation des données","/fr/devtools/data-display","fr/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Intégrations tierces","i-lucide-puzzle","/fr/third-party","fr/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"Avec Provider","/fr/third-party/with-provider","fr/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"Avec BLoC","/fr/third-party/with-bloc","fr/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"Avec Riverpod","/fr/third-party/with-riverpod","fr/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"Avec RxDart","/fr/third-party/with-rxdart","fr/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"Avec Dio","/fr/third-party/with-dio","fr/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"Avec GraphQL","/fr/third-party/with-graphql","fr/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Exemples","/fr/examples","fr/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Étude de cas : Liste et détail utilisateur","/fr/examples/basic-query","fr/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Étude de cas : Mutations optimistes et rollback","/fr/examples/mutations-optimistic","fr/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Étude de cas : Feed à défilement infini","/fr/examples/infinite-scroll","fr/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Étude de cas : Application Todo offline-first","/fr/examples/offline-first","fr/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Étude de cas : Conscience réseau","/fr/examples/network-awareness","fr/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Étude de cas : Intégration des hooks","/fr/examples/hooks-integration","fr/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Étude de cas : Application Todo complète","/fr/examples/complete-todo-app","fr/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Aide","i-lucide-life-buoy","/fr/help","fr/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/fr/help/faq","fr/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Dépannage","/fr/help/troubleshooting","fr/09.help/2.troubleshooting",{"id":343,"title":287,"body":344,"description":4320,"extension":4321,"links":4322,"meta":4323,"navigation":4324,"path":288,"seo":4325,"stem":289,"__hash__":4326},"docs_fr/fr/07.third-party/6.with-graphql.md",{"type":345,"value":346,"toc":4302},"minimark",[347,360,363,367,418,420,424,434,632,889,1080,1085,1283,1403,1405,1409,1412,1497,1501,1922,2059,2063,2230,2529,2531,2535,2538,2542,2578,2581,2637,2641,2650,2778,2780,2784,2791,3175,3182,3237,3239,3243,3246,3537,3947,3949,3953,3956,4252,4254,4258,4298],[348,349,350,351,355,356,359],"p",{},"Les APIs GraphQL bénéficient du pattern stale-while-revalidate de Qora, de l'invalidation automatique et de l'intégration avec le cache normalisé. Ce guide couvre l'encapsulation des packages ",[352,353,354],"code",{},"graphql"," et ",[352,357,358],{},"ferry"," dans des fetchers Qora, la gestion d'erreurs et la pagination par curseur.",[361,362],"hr",{},[364,365,98],"h2",{"id":366},"configuration",[368,369,375],"pre",{"className":370,"code":371,"filename":372,"language":373,"meta":374,"style":374},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  qora: ^1.3.1\n  gql: ^1.0.0            # pour ferry: gql_http_link, ferry, ferry_cache\n","pubspec.yaml","yaml","",[352,376,377,390,403],{"__ignoreMap":374},[378,379,382,386],"span",{"class":380,"line":381},"line",1,[378,383,385],{"class":384},"swJcz","dependencies",[378,387,389],{"class":388},"sMK4o",":\n",[378,391,393,396,399],{"class":380,"line":392},2,[378,394,395],{"class":384},"  qora",[378,397,398],{"class":388},":",[378,400,402],{"class":401},"sfazB"," ^1.3.1\n",[378,404,406,409,411,414],{"class":380,"line":405},3,[378,407,408],{"class":384},"  gql",[378,410,398],{"class":388},[378,412,413],{"class":401}," ^1.0.0",[378,415,417],{"class":416},"sHwdD","            # pour ferry: gql_http_link, ferry, ferry_cache\n",[361,419],{},[364,421,423],{"id":422},"option-a-package-graphql","Option A: Package graphql",[348,425,426,427,429,430,433],{},"Le package ",[352,428,354],{}," fournit un ",[352,431,432],{},"GraphQLClient"," qui exécute les requêtes et mutations. Enveloppez chaque opération dans un fetcher Qora:",[368,435,440],{"className":436,"code":437,"filename":438,"language":439,"meta":374,"style":374},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:graphql/client.dart';\nimport 'package:qora/qora.dart';\n\nfinal gqlClient = GraphQLClient(\n  link: HttpLink('https://api.example.com/graphql'),\n  cache: GraphQLCache(),\n);\n\nfinal queryOptions = QueryOptions(\n  document: gql(r'''\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        email\n      }\n    }\n  '''),\n);\n","lib/data/graphql_client.dart","dart",[352,441,442,454,463,469,490,513,529,536,541,556,573,579,585,591,597,603,609,615,625],{"__ignoreMap":374},[378,443,444,448,451],{"class":380,"line":381},[378,445,447],{"class":446},"sbssI","import",[378,449,450],{"class":401}," 'package:graphql/client.dart'",[378,452,453],{"class":388},";\n",[378,455,456,458,461],{"class":380,"line":392},[378,457,447],{"class":446},[378,459,460],{"class":401}," 'package:qora/qora.dart'",[378,462,453],{"class":388},[378,464,465],{"class":380,"line":405},[378,466,468],{"emptyLinePlaceholder":467},true,"\n",[378,470,472,476,480,483,487],{"class":380,"line":471},4,[378,473,475],{"class":474},"spNyl","final",[378,477,479],{"class":478},"sTEyZ"," gqlClient ",[378,481,482],{"class":388},"=",[378,484,486],{"class":485},"sBMFI"," GraphQLClient",[378,488,489],{"class":478},"(\n",[378,491,493,496,498,501,504,507,510],{"class":380,"line":492},5,[378,494,495],{"class":478},"  link",[378,497,398],{"class":388},[378,499,500],{"class":485}," HttpLink",[378,502,503],{"class":478},"(",[378,505,506],{"class":401},"'https://api.example.com/graphql'",[378,508,509],{"class":478},")",[378,511,512],{"class":388},",\n",[378,514,516,519,521,524,527],{"class":380,"line":515},6,[378,517,518],{"class":478},"  cache",[378,520,398],{"class":388},[378,522,523],{"class":485}," GraphQLCache",[378,525,526],{"class":478},"()",[378,528,512],{"class":388},[378,530,532,534],{"class":380,"line":531},7,[378,533,509],{"class":478},[378,535,453],{"class":388},[378,537,539],{"class":380,"line":538},8,[378,540,468],{"emptyLinePlaceholder":467},[378,542,544,546,549,551,554],{"class":380,"line":543},9,[378,545,475],{"class":474},[378,547,548],{"class":478}," queryOptions ",[378,550,482],{"class":388},[378,552,553],{"class":485}," QueryOptions",[378,555,489],{"class":478},[378,557,559,562,564,568,570],{"class":380,"line":558},10,[378,560,561],{"class":478},"  document",[378,563,398],{"class":388},[378,565,567],{"class":566},"s2Zo4"," gql",[378,569,503],{"class":478},[378,571,572],{"class":401},"r'''\n",[378,574,576],{"class":380,"line":575},11,[378,577,578],{"class":401},"    query GetUser($id: ID!) {\n",[378,580,582],{"class":380,"line":581},12,[378,583,584],{"class":401},"      user(id: $id) {\n",[378,586,588],{"class":380,"line":587},13,[378,589,590],{"class":401},"        id\n",[378,592,594],{"class":380,"line":593},14,[378,595,596],{"class":401},"        name\n",[378,598,600],{"class":380,"line":599},15,[378,601,602],{"class":401},"        email\n",[378,604,606],{"class":380,"line":605},16,[378,607,608],{"class":401},"      }\n",[378,610,612],{"class":380,"line":611},17,[378,613,614],{"class":401},"    }\n",[378,616,618,621,623],{"class":380,"line":617},18,[378,619,620],{"class":401},"  '''",[378,622,509],{"class":478},[378,624,512],{"class":388},[378,626,628,630],{"class":380,"line":627},19,[378,629,509],{"class":478},[378,631,453],{"class":388},[368,633,636],{"className":436,"code":634,"filename":635,"language":439,"meta":374,"style":374},"class UserApi {\n  UserApi(this._client);\n  final GraphQLClient _client;\n\n  Future\u003CUser> getUser(String id) async {\n    final result = await _client.query(\n      QueryOptions(\n        document: gql(r'''\n          query GetUser($id: ID!) {\n            user(id: $id) { id name email }\n          }\n        '''),\n        variables: {'id': id},\n      ),\n    );\n\n    if (result.hasException) throw result.exception!;\n    return User.fromJson(result.data!['user']);\n  }\n}\n","lib/data/user_api.dart",[352,637,638,649,665,677,681,712,734,741,754,759,764,769,778,798,805,812,816,843,878,883],{"__ignoreMap":374},[378,639,640,643,646],{"class":380,"line":381},[378,641,642],{"class":388},"class",[378,644,645],{"class":485}," UserApi",[378,647,648],{"class":478}," {\n",[378,650,651,654,657,660,663],{"class":380,"line":392},[378,652,653],{"class":485},"  UserApi",[378,655,656],{"class":478},"(this",[378,658,659],{"class":388},".",[378,661,662],{"class":478},"_client)",[378,664,453],{"class":388},[378,666,667,670,672,675],{"class":380,"line":405},[378,668,669],{"class":474},"  final",[378,671,486],{"class":485},[378,673,674],{"class":478}," _client",[378,676,453],{"class":388},[378,678,679],{"class":380,"line":471},[378,680,468],{"emptyLinePlaceholder":467},[378,682,683,686,689,692,695,698,700,703,706,710],{"class":380,"line":492},[378,684,685],{"class":485},"  Future",[378,687,688],{"class":478},"\u003C",[378,690,691],{"class":485},"User",[378,693,694],{"class":478},"> ",[378,696,697],{"class":566},"getUser",[378,699,503],{"class":478},[378,701,702],{"class":485},"String",[378,704,705],{"class":478}," id) ",[378,707,709],{"class":708},"s7zQu","async",[378,711,648],{"class":478},[378,713,714,717,720,722,725,727,729,732],{"class":380,"line":515},[378,715,716],{"class":474},"    final",[378,718,719],{"class":478}," result ",[378,721,482],{"class":388},[378,723,724],{"class":708}," await",[378,726,674],{"class":478},[378,728,659],{"class":388},[378,730,731],{"class":566},"query",[378,733,489],{"class":478},[378,735,736,739],{"class":380,"line":531},[378,737,738],{"class":485},"      QueryOptions",[378,740,489],{"class":478},[378,742,743,746,748,750,752],{"class":380,"line":538},[378,744,745],{"class":478},"        document",[378,747,398],{"class":388},[378,749,567],{"class":566},[378,751,503],{"class":478},[378,753,572],{"class":401},[378,755,756],{"class":380,"line":543},[378,757,758],{"class":401},"          query GetUser($id: ID!) {\n",[378,760,761],{"class":380,"line":558},[378,762,763],{"class":401},"            user(id: $id) { id name email }\n",[378,765,766],{"class":380,"line":575},[378,767,768],{"class":401},"          }\n",[378,770,771,774,776],{"class":380,"line":581},[378,772,773],{"class":401},"        '''",[378,775,509],{"class":478},[378,777,512],{"class":388},[378,779,780,783,785,788,791,793,796],{"class":380,"line":587},[378,781,782],{"class":478},"        variables",[378,784,398],{"class":388},[378,786,787],{"class":478}," {",[378,789,790],{"class":401},"'id'",[378,792,398],{"class":388},[378,794,795],{"class":478}," id}",[378,797,512],{"class":388},[378,799,800,803],{"class":380,"line":593},[378,801,802],{"class":478},"      )",[378,804,512],{"class":388},[378,806,807,810],{"class":380,"line":599},[378,808,809],{"class":478},"    )",[378,811,453],{"class":388},[378,813,814],{"class":380,"line":605},[378,815,468],{"emptyLinePlaceholder":467},[378,817,818,821,824,826,829,832,835,837,840],{"class":380,"line":611},[378,819,820],{"class":708},"    if",[378,822,823],{"class":478}," (result",[378,825,659],{"class":388},[378,827,828],{"class":478},"hasException) ",[378,830,831],{"class":708},"throw",[378,833,834],{"class":478}," result",[378,836,659],{"class":388},[378,838,839],{"class":478},"exception",[378,841,842],{"class":388},"!;\n",[378,844,845,848,851,853,856,859,861,864,867,870,873,876],{"class":380,"line":617},[378,846,847],{"class":708},"    return",[378,849,850],{"class":485}," User",[378,852,659],{"class":388},[378,854,855],{"class":566},"fromJson",[378,857,858],{"class":478},"(result",[378,860,659],{"class":388},[378,862,863],{"class":478},"data",[378,865,866],{"class":388},"!",[378,868,869],{"class":478},"[",[378,871,872],{"class":401},"'user'",[378,874,875],{"class":478},"])",[378,877,453],{"class":388},[378,879,880],{"class":380,"line":627},[378,881,882],{"class":478},"  }\n",[378,884,886],{"class":380,"line":885},20,[378,887,888],{"class":478},"}\n",[368,890,893],{"className":436,"code":891,"filename":892,"language":439,"meta":374,"style":374},"QoraBuilder\u003CUser>(\n  queryKey: ['user', userId],\n  fetcher: () => userApi.getUser(userId),\n  builder: (context, state, _) => switch (state) {\n    Success(:final data) => UserCard(data),\n    Loading() => const CircularProgressIndicator(),\n    Failure(:final error) => ErrorView(error),\n    _ => const SizedBox.shrink(),\n  },\n)\n","lib/features/user_screen.dart",[352,894,895,906,926,951,979,1003,1023,1047,1068,1075],{"__ignoreMap":374},[378,896,897,899,901,903],{"class":380,"line":381},[378,898,108],{"class":485},[378,900,688],{"class":478},[378,902,691],{"class":485},[378,904,905],{"class":478},">(\n",[378,907,908,911,913,916,918,921,924],{"class":380,"line":392},[378,909,910],{"class":478},"  queryKey",[378,912,398],{"class":388},[378,914,915],{"class":478}," [",[378,917,872],{"class":401},[378,919,920],{"class":388},",",[378,922,923],{"class":478}," userId]",[378,925,512],{"class":388},[378,927,928,931,933,936,939,942,944,946,949],{"class":380,"line":405},[378,929,930],{"class":478},"  fetcher",[378,932,398],{"class":388},[378,934,935],{"class":478}," () ",[378,937,938],{"class":388},"=>",[378,940,941],{"class":478}," userApi",[378,943,659],{"class":388},[378,945,697],{"class":566},[378,947,948],{"class":478},"(userId)",[378,950,512],{"class":388},[378,952,953,956,958,961,963,966,968,971,973,976],{"class":380,"line":471},[378,954,955],{"class":478},"  builder",[378,957,398],{"class":388},[378,959,960],{"class":478}," (context",[378,962,920],{"class":388},[378,964,965],{"class":478}," state",[378,967,920],{"class":388},[378,969,970],{"class":478}," _) ",[378,972,938],{"class":388},[378,974,975],{"class":708}," switch",[378,977,978],{"class":478}," (state) {\n",[378,980,981,984,986,988,990,993,995,998,1001],{"class":380,"line":492},[378,982,983],{"class":485},"    Success",[378,985,503],{"class":478},[378,987,398],{"class":388},[378,989,475],{"class":474},[378,991,992],{"class":478}," data) ",[378,994,938],{"class":388},[378,996,997],{"class":485}," UserCard",[378,999,1000],{"class":478},"(data)",[378,1002,512],{"class":388},[378,1004,1005,1008,1011,1013,1016,1019,1021],{"class":380,"line":515},[378,1006,1007],{"class":485},"    Loading",[378,1009,1010],{"class":478},"() ",[378,1012,938],{"class":388},[378,1014,1015],{"class":474}," const",[378,1017,1018],{"class":485}," CircularProgressIndicator",[378,1020,526],{"class":478},[378,1022,512],{"class":388},[378,1024,1025,1028,1030,1032,1034,1037,1039,1042,1045],{"class":380,"line":531},[378,1026,1027],{"class":485},"    Failure",[378,1029,503],{"class":478},[378,1031,398],{"class":388},[378,1033,475],{"class":474},[378,1035,1036],{"class":478}," error) ",[378,1038,938],{"class":388},[378,1040,1041],{"class":485}," ErrorView",[378,1043,1044],{"class":478},"(error)",[378,1046,512],{"class":388},[378,1048,1049,1052,1054,1056,1059,1061,1064,1066],{"class":380,"line":538},[378,1050,1051],{"class":478},"    _ ",[378,1053,938],{"class":388},[378,1055,1015],{"class":474},[378,1057,1058],{"class":485}," SizedBox",[378,1060,659],{"class":388},[378,1062,1063],{"class":566},"shrink",[378,1065,526],{"class":478},[378,1067,512],{"class":388},[378,1069,1070,1073],{"class":380,"line":543},[378,1071,1072],{"class":478},"  }",[378,1074,512],{"class":388},[378,1076,1077],{"class":380,"line":558},[378,1078,1079],{"class":478},")\n",[1081,1082,1084],"h3",{"id":1083},"exemple-de-mutation","Exemple de Mutation",[368,1086,1088],{"className":436,"code":1087,"filename":635,"language":439,"meta":374,"style":374},"Future\u003CUser> updateUser(String id, String name) async {\n  final result = await _client.mutate(\n    MutationOptions(\n      document: gql(r'''\n        mutation UpdateUser($id: ID!, $name: String!) {\n          updateUser(id: $id, name: $name) { id name email }\n        }\n      '''),\n      variables: {'id': id, 'name': name},\n    ),\n  );\n\n  if (result.hasException) throw result.exception!;\n  return User.fromJson(result.data!['updateUser']);\n}\n",[352,1089,1090,1123,1142,1149,1162,1167,1172,1177,1186,1213,1219,1226,1230,1251,1279],{"__ignoreMap":374},[378,1091,1092,1095,1097,1099,1101,1104,1106,1108,1111,1113,1116,1119,1121],{"class":380,"line":381},[378,1093,1094],{"class":485},"Future",[378,1096,688],{"class":478},[378,1098,691],{"class":485},[378,1100,694],{"class":478},[378,1102,1103],{"class":566},"updateUser",[378,1105,503],{"class":478},[378,1107,702],{"class":485},[378,1109,1110],{"class":478}," id",[378,1112,920],{"class":388},[378,1114,1115],{"class":485}," String",[378,1117,1118],{"class":478}," name) ",[378,1120,709],{"class":708},[378,1122,648],{"class":478},[378,1124,1125,1127,1129,1131,1133,1135,1137,1140],{"class":380,"line":392},[378,1126,669],{"class":474},[378,1128,719],{"class":478},[378,1130,482],{"class":388},[378,1132,724],{"class":708},[378,1134,674],{"class":478},[378,1136,659],{"class":388},[378,1138,1139],{"class":566},"mutate",[378,1141,489],{"class":478},[378,1143,1144,1147],{"class":380,"line":405},[378,1145,1146],{"class":485},"    MutationOptions",[378,1148,489],{"class":478},[378,1150,1151,1154,1156,1158,1160],{"class":380,"line":471},[378,1152,1153],{"class":478},"      document",[378,1155,398],{"class":388},[378,1157,567],{"class":566},[378,1159,503],{"class":478},[378,1161,572],{"class":401},[378,1163,1164],{"class":380,"line":492},[378,1165,1166],{"class":401},"        mutation UpdateUser($id: ID!, $name: String!) {\n",[378,1168,1169],{"class":380,"line":515},[378,1170,1171],{"class":401},"          updateUser(id: $id, name: $name) { id name email }\n",[378,1173,1174],{"class":380,"line":531},[378,1175,1176],{"class":401},"        }\n",[378,1178,1179,1182,1184],{"class":380,"line":538},[378,1180,1181],{"class":401},"      '''",[378,1183,509],{"class":478},[378,1185,512],{"class":388},[378,1187,1188,1191,1193,1195,1197,1199,1201,1203,1206,1208,1211],{"class":380,"line":543},[378,1189,1190],{"class":478},"      variables",[378,1192,398],{"class":388},[378,1194,787],{"class":478},[378,1196,790],{"class":401},[378,1198,398],{"class":388},[378,1200,1110],{"class":478},[378,1202,920],{"class":388},[378,1204,1205],{"class":401}," 'name'",[378,1207,398],{"class":388},[378,1209,1210],{"class":478}," name}",[378,1212,512],{"class":388},[378,1214,1215,1217],{"class":380,"line":558},[378,1216,809],{"class":478},[378,1218,512],{"class":388},[378,1220,1221,1224],{"class":380,"line":575},[378,1222,1223],{"class":478},"  )",[378,1225,453],{"class":388},[378,1227,1228],{"class":380,"line":581},[378,1229,468],{"emptyLinePlaceholder":467},[378,1231,1232,1235,1237,1239,1241,1243,1245,1247,1249],{"class":380,"line":587},[378,1233,1234],{"class":708},"  if",[378,1236,823],{"class":478},[378,1238,659],{"class":388},[378,1240,828],{"class":478},[378,1242,831],{"class":708},[378,1244,834],{"class":478},[378,1246,659],{"class":388},[378,1248,839],{"class":478},[378,1250,842],{"class":388},[378,1252,1253,1256,1258,1260,1262,1264,1266,1268,1270,1272,1275,1277],{"class":380,"line":593},[378,1254,1255],{"class":708},"  return",[378,1257,850],{"class":485},[378,1259,659],{"class":388},[378,1261,855],{"class":566},[378,1263,858],{"class":478},[378,1265,659],{"class":388},[378,1267,863],{"class":478},[378,1269,866],{"class":388},[378,1271,869],{"class":478},[378,1273,1274],{"class":401},"'updateUser'",[378,1276,875],{"class":478},[378,1278,453],{"class":388},[378,1280,1281],{"class":380,"line":599},[378,1282,888],{"class":478},[368,1284,1287],{"className":436,"code":1285,"filename":1286,"language":439,"meta":374,"style":374},"QoraMutationBuilder\u003CUser, String, void>(\n  mutator: (name) => userApi.updateUser(userId, name),\n  options: MutationOptions(\n    invalidates: [['user', userId]],\n  ),\n  builder: (context, state, mutate) { ... },\n)\n","lib/features/user_edit_screen.dart",[352,1288,1289,1309,1337,1349,1368,1374,1399],{"__ignoreMap":374},[378,1290,1291,1293,1295,1297,1300,1302,1304,1307],{"class":380,"line":381},[378,1292,113],{"class":485},[378,1294,688],{"class":478},[378,1296,691],{"class":485},[378,1298,1299],{"class":478},", ",[378,1301,702],{"class":485},[378,1303,1299],{"class":478},[378,1305,1306],{"class":474},"void",[378,1308,905],{"class":478},[378,1310,1311,1314,1316,1319,1321,1323,1325,1327,1330,1332,1335],{"class":380,"line":392},[378,1312,1313],{"class":478},"  mutator",[378,1315,398],{"class":388},[378,1317,1318],{"class":478}," (name) ",[378,1320,938],{"class":388},[378,1322,941],{"class":478},[378,1324,659],{"class":388},[378,1326,1103],{"class":566},[378,1328,1329],{"class":478},"(userId",[378,1331,920],{"class":388},[378,1333,1334],{"class":478}," name)",[378,1336,512],{"class":388},[378,1338,1339,1342,1344,1347],{"class":380,"line":405},[378,1340,1341],{"class":478},"  options",[378,1343,398],{"class":388},[378,1345,1346],{"class":485}," MutationOptions",[378,1348,489],{"class":478},[378,1350,1351,1354,1356,1359,1361,1363,1366],{"class":380,"line":471},[378,1352,1353],{"class":478},"    invalidates",[378,1355,398],{"class":388},[378,1357,1358],{"class":478}," [[",[378,1360,872],{"class":401},[378,1362,920],{"class":388},[378,1364,1365],{"class":478}," userId]]",[378,1367,512],{"class":388},[378,1369,1370,1372],{"class":380,"line":492},[378,1371,1223],{"class":478},[378,1373,512],{"class":388},[378,1375,1376,1378,1380,1382,1384,1386,1388,1391,1394,1397],{"class":380,"line":515},[378,1377,955],{"class":478},[378,1379,398],{"class":388},[378,1381,960],{"class":478},[378,1383,920],{"class":388},[378,1385,965],{"class":478},[378,1387,920],{"class":388},[378,1389,1390],{"class":478}," mutate) { ",[378,1392,1393],{"class":388},"...",[378,1395,1396],{"class":478}," }",[378,1398,512],{"class":388},[378,1400,1401],{"class":380,"line":531},[378,1402,1079],{"class":478},[361,1404],{},[364,1406,1408],{"id":1407},"option-b-package-ferry","Option B: Package Ferry",[348,1410,1411],{},"Ferry fournit un client GraphQL typé et généré par code avec un cache normalisé intégré. Utilisez Qora comme couche de cache pour l'état de vue (réactivité UI, invalidation, SWR) tandis que Ferry gère le transport GraphQL et le stockage normalisé des entités:",[368,1413,1416],{"className":436,"code":1414,"filename":1415,"language":439,"meta":374,"style":374},"import 'package:ferry/ferry.dart';\nimport 'package:gql_http_link/gql_http_link.dart';\nimport 'package:qora/qora.dart';\n\nfinal ferryClient = Client(\n  link: HttpLink('https://api.example.com/graphql'),\n  cache: Cache(),\n);\n","lib/data/ferry_client.dart",[352,1417,1418,1427,1436,1444,1448,1462,1478,1491],{"__ignoreMap":374},[378,1419,1420,1422,1425],{"class":380,"line":381},[378,1421,447],{"class":446},[378,1423,1424],{"class":401}," 'package:ferry/ferry.dart'",[378,1426,453],{"class":388},[378,1428,1429,1431,1434],{"class":380,"line":392},[378,1430,447],{"class":446},[378,1432,1433],{"class":401}," 'package:gql_http_link/gql_http_link.dart'",[378,1435,453],{"class":388},[378,1437,1438,1440,1442],{"class":380,"line":405},[378,1439,447],{"class":446},[378,1441,460],{"class":401},[378,1443,453],{"class":388},[378,1445,1446],{"class":380,"line":471},[378,1447,468],{"emptyLinePlaceholder":467},[378,1449,1450,1452,1455,1457,1460],{"class":380,"line":492},[378,1451,475],{"class":474},[378,1453,1454],{"class":478}," ferryClient ",[378,1456,482],{"class":388},[378,1458,1459],{"class":485}," Client",[378,1461,489],{"class":478},[378,1463,1464,1466,1468,1470,1472,1474,1476],{"class":380,"line":515},[378,1465,495],{"class":478},[378,1467,398],{"class":388},[378,1469,500],{"class":485},[378,1471,503],{"class":478},[378,1473,506],{"class":401},[378,1475,509],{"class":478},[378,1477,512],{"class":388},[378,1479,1480,1482,1484,1487,1489],{"class":380,"line":531},[378,1481,518],{"class":478},[378,1483,398],{"class":388},[378,1485,1486],{"class":485}," Cache",[378,1488,526],{"class":478},[378,1490,512],{"class":388},[378,1492,1493,1495],{"class":380,"line":538},[378,1494,509],{"class":478},[378,1496,453],{"class":388},[1081,1498,1500],{"id":1499},"fetcher-de-requête","Fetcher de Requête",[368,1502,1504],{"className":436,"code":1503,"filename":635,"language":439,"meta":374,"style":374},"class UserApi {\n  UserApi(this._client);\n  final Client _client;\n\n  Future\u003CUser> getUser(String id) async {\n    final req = GGetUserReq((b) => b..vars.id = id);\n    final result = await _client.request(req).first;\n\n    if (result.hasErrors) {\n      throw result.graphqlErrors!.first;\n    }\n\n    return User.fromFragment(result.data!.user);\n  }\n\n  Future\u003CList\u003CUser>> listUsers({int first = 20, String? cursor}) async {\n    final req = GListUsersReq((b) => b\n      ..vars.first = first\n      ..vars.after = cursor);\n    final result = await _client.request(req).first;\n\n    if (result.hasErrors) throw result.graphqlErrors!.first;\n\n    return result.data!.users\n        .map((u) => User.fromFragment(u))\n        .toList();\n  }\n}\n",[352,1505,1506,1514,1526,1536,1540,1562,1600,1627,1631,1642,1661,1665,1669,1693,1697,1701,1748,1766,1783,1801,1825,1830,1856,1861,1877,1900,1912,1917],{"__ignoreMap":374},[378,1507,1508,1510,1512],{"class":380,"line":381},[378,1509,642],{"class":388},[378,1511,645],{"class":485},[378,1513,648],{"class":478},[378,1515,1516,1518,1520,1522,1524],{"class":380,"line":392},[378,1517,653],{"class":485},[378,1519,656],{"class":478},[378,1521,659],{"class":388},[378,1523,662],{"class":478},[378,1525,453],{"class":388},[378,1527,1528,1530,1532,1534],{"class":380,"line":405},[378,1529,669],{"class":474},[378,1531,1459],{"class":485},[378,1533,674],{"class":478},[378,1535,453],{"class":388},[378,1537,1538],{"class":380,"line":471},[378,1539,468],{"emptyLinePlaceholder":467},[378,1541,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560],{"class":380,"line":492},[378,1543,685],{"class":485},[378,1545,688],{"class":478},[378,1547,691],{"class":485},[378,1549,694],{"class":478},[378,1551,697],{"class":566},[378,1553,503],{"class":478},[378,1555,702],{"class":485},[378,1557,705],{"class":478},[378,1559,709],{"class":708},[378,1561,648],{"class":478},[378,1563,1564,1566,1569,1571,1574,1577,1579,1582,1585,1588,1590,1593,1595,1598],{"class":380,"line":515},[378,1565,716],{"class":474},[378,1567,1568],{"class":478}," req ",[378,1570,482],{"class":388},[378,1572,1573],{"class":485}," GGetUserReq",[378,1575,1576],{"class":478},"((b) ",[378,1578,938],{"class":388},[378,1580,1581],{"class":478}," b",[378,1583,1584],{"class":388},"..",[378,1586,1587],{"class":478},"vars",[378,1589,659],{"class":388},[378,1591,1592],{"class":478},"id ",[378,1594,482],{"class":388},[378,1596,1597],{"class":478}," id)",[378,1599,453],{"class":388},[378,1601,1602,1604,1606,1608,1610,1612,1614,1617,1620,1622,1625],{"class":380,"line":531},[378,1603,716],{"class":474},[378,1605,719],{"class":478},[378,1607,482],{"class":388},[378,1609,724],{"class":708},[378,1611,674],{"class":478},[378,1613,659],{"class":388},[378,1615,1616],{"class":566},"request",[378,1618,1619],{"class":478},"(req)",[378,1621,659],{"class":388},[378,1623,1624],{"class":478},"first",[378,1626,453],{"class":388},[378,1628,1629],{"class":380,"line":538},[378,1630,468],{"emptyLinePlaceholder":467},[378,1632,1633,1635,1637,1639],{"class":380,"line":543},[378,1634,820],{"class":708},[378,1636,823],{"class":478},[378,1638,659],{"class":388},[378,1640,1641],{"class":478},"hasErrors) {\n",[378,1643,1644,1647,1649,1651,1654,1657,1659],{"class":380,"line":558},[378,1645,1646],{"class":708},"      throw",[378,1648,834],{"class":478},[378,1650,659],{"class":388},[378,1652,1653],{"class":478},"graphqlErrors",[378,1655,1656],{"class":388},"!.",[378,1658,1624],{"class":478},[378,1660,453],{"class":388},[378,1662,1663],{"class":380,"line":575},[378,1664,614],{"class":478},[378,1666,1667],{"class":380,"line":581},[378,1668,468],{"emptyLinePlaceholder":467},[378,1670,1671,1673,1675,1677,1680,1682,1684,1686,1688,1691],{"class":380,"line":587},[378,1672,847],{"class":708},[378,1674,850],{"class":485},[378,1676,659],{"class":388},[378,1678,1679],{"class":566},"fromFragment",[378,1681,858],{"class":478},[378,1683,659],{"class":388},[378,1685,863],{"class":478},[378,1687,1656],{"class":388},[378,1689,1690],{"class":478},"user)",[378,1692,453],{"class":388},[378,1694,1695],{"class":380,"line":593},[378,1696,882],{"class":478},[378,1698,1699],{"class":380,"line":599},[378,1700,468],{"emptyLinePlaceholder":467},[378,1702,1703,1705,1707,1710,1712,1714,1717,1720,1723,1726,1729,1731,1734,1736,1738,1741,1744,1746],{"class":380,"line":605},[378,1704,685],{"class":485},[378,1706,688],{"class":478},[378,1708,1709],{"class":485},"List",[378,1711,688],{"class":478},[378,1713,691],{"class":485},[378,1715,1716],{"class":478},">> ",[378,1718,1719],{"class":566},"listUsers",[378,1721,1722],{"class":478},"({",[378,1724,1725],{"class":485},"int",[378,1727,1728],{"class":478}," first ",[378,1730,482],{"class":388},[378,1732,1733],{"class":446}," 20",[378,1735,920],{"class":388},[378,1737,1115],{"class":485},[378,1739,1740],{"class":388},"?",[378,1742,1743],{"class":478}," cursor}) ",[378,1745,709],{"class":708},[378,1747,648],{"class":478},[378,1749,1750,1752,1754,1756,1759,1761,1763],{"class":380,"line":611},[378,1751,716],{"class":474},[378,1753,1568],{"class":478},[378,1755,482],{"class":388},[378,1757,1758],{"class":485}," GListUsersReq",[378,1760,1576],{"class":478},[378,1762,938],{"class":388},[378,1764,1765],{"class":478}," b\n",[378,1767,1768,1771,1773,1775,1778,1780],{"class":380,"line":617},[378,1769,1770],{"class":388},"      ..",[378,1772,1587],{"class":478},[378,1774,659],{"class":388},[378,1776,1777],{"class":478},"first ",[378,1779,482],{"class":388},[378,1781,1782],{"class":478}," first\n",[378,1784,1785,1787,1789,1791,1794,1796,1799],{"class":380,"line":627},[378,1786,1770],{"class":388},[378,1788,1587],{"class":478},[378,1790,659],{"class":388},[378,1792,1793],{"class":478},"after ",[378,1795,482],{"class":388},[378,1797,1798],{"class":478}," cursor)",[378,1800,453],{"class":388},[378,1802,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823],{"class":380,"line":885},[378,1804,716],{"class":474},[378,1806,719],{"class":478},[378,1808,482],{"class":388},[378,1810,724],{"class":708},[378,1812,674],{"class":478},[378,1814,659],{"class":388},[378,1816,1616],{"class":566},[378,1818,1619],{"class":478},[378,1820,659],{"class":388},[378,1822,1624],{"class":478},[378,1824,453],{"class":388},[378,1826,1828],{"class":380,"line":1827},21,[378,1829,468],{"emptyLinePlaceholder":467},[378,1831,1833,1835,1837,1839,1842,1844,1846,1848,1850,1852,1854],{"class":380,"line":1832},22,[378,1834,820],{"class":708},[378,1836,823],{"class":478},[378,1838,659],{"class":388},[378,1840,1841],{"class":478},"hasErrors) ",[378,1843,831],{"class":708},[378,1845,834],{"class":478},[378,1847,659],{"class":388},[378,1849,1653],{"class":478},[378,1851,1656],{"class":388},[378,1853,1624],{"class":478},[378,1855,453],{"class":388},[378,1857,1859],{"class":380,"line":1858},23,[378,1860,468],{"emptyLinePlaceholder":467},[378,1862,1864,1866,1868,1870,1872,1874],{"class":380,"line":1863},24,[378,1865,847],{"class":708},[378,1867,834],{"class":478},[378,1869,659],{"class":388},[378,1871,863],{"class":478},[378,1873,1656],{"class":388},[378,1875,1876],{"class":478},"users\n",[378,1878,1880,1883,1886,1889,1891,1893,1895,1897],{"class":380,"line":1879},25,[378,1881,1882],{"class":388},"        .",[378,1884,1885],{"class":566},"map",[378,1887,1888],{"class":478},"((u) ",[378,1890,938],{"class":388},[378,1892,850],{"class":485},[378,1894,659],{"class":388},[378,1896,1679],{"class":566},[378,1898,1899],{"class":478},"(u))\n",[378,1901,1903,1905,1908,1910],{"class":380,"line":1902},26,[378,1904,1882],{"class":388},[378,1906,1907],{"class":566},"toList",[378,1909,526],{"class":478},[378,1911,453],{"class":388},[378,1913,1915],{"class":380,"line":1914},27,[378,1916,882],{"class":478},[378,1918,1920],{"class":380,"line":1919},28,[378,1921,888],{"class":478},[368,1923,1926],{"className":436,"code":1924,"filename":1925,"language":439,"meta":374,"style":374},"QoraBuilder\u003CList\u003CUser>>(\n  queryKey: ['users', first, cursor],\n  fetcher: () => userApi.listUsers(first: first, cursor: cursor),\n  options: const QoraOptions(staleTime: Duration(minutes: 2)),\n  builder: (context, state, _) { ... },\n)\n","lib/features/user_list_screen.dart",[352,1927,1928,1943,1966,2000,2032,2055],{"__ignoreMap":374},[378,1929,1930,1932,1934,1936,1938,1940],{"class":380,"line":381},[378,1931,108],{"class":485},[378,1933,688],{"class":478},[378,1935,1709],{"class":485},[378,1937,688],{"class":478},[378,1939,691],{"class":485},[378,1941,1942],{"class":478},">>(\n",[378,1944,1945,1947,1949,1951,1954,1956,1959,1961,1964],{"class":380,"line":392},[378,1946,910],{"class":478},[378,1948,398],{"class":388},[378,1950,915],{"class":478},[378,1952,1953],{"class":401},"'users'",[378,1955,920],{"class":388},[378,1957,1958],{"class":478}," first",[378,1960,920],{"class":388},[378,1962,1963],{"class":478}," cursor]",[378,1965,512],{"class":388},[378,1967,1968,1970,1972,1974,1976,1978,1980,1982,1985,1987,1989,1991,1994,1996,1998],{"class":380,"line":405},[378,1969,930],{"class":478},[378,1971,398],{"class":388},[378,1973,935],{"class":478},[378,1975,938],{"class":388},[378,1977,941],{"class":478},[378,1979,659],{"class":388},[378,1981,1719],{"class":566},[378,1983,1984],{"class":478},"(first",[378,1986,398],{"class":388},[378,1988,1958],{"class":478},[378,1990,920],{"class":388},[378,1992,1993],{"class":478}," cursor",[378,1995,398],{"class":388},[378,1997,1798],{"class":478},[378,1999,512],{"class":388},[378,2001,2002,2004,2006,2008,2011,2014,2016,2019,2022,2024,2027,2030],{"class":380,"line":471},[378,2003,1341],{"class":478},[378,2005,398],{"class":388},[378,2007,1015],{"class":474},[378,2009,2010],{"class":485}," QoraOptions",[378,2012,2013],{"class":478},"(staleTime",[378,2015,398],{"class":388},[378,2017,2018],{"class":485}," Duration",[378,2020,2021],{"class":478},"(minutes",[378,2023,398],{"class":388},[378,2025,2026],{"class":446}," 2",[378,2028,2029],{"class":478},"))",[378,2031,512],{"class":388},[378,2033,2034,2036,2038,2040,2042,2044,2046,2049,2051,2053],{"class":380,"line":492},[378,2035,955],{"class":478},[378,2037,398],{"class":388},[378,2039,960],{"class":478},[378,2041,920],{"class":388},[378,2043,965],{"class":478},[378,2045,920],{"class":388},[378,2047,2048],{"class":478}," _) { ",[378,2050,1393],{"class":388},[378,2052,1396],{"class":478},[378,2054,512],{"class":388},[378,2056,2057],{"class":380,"line":515},[378,2058,1079],{"class":478},[1081,2060,2062],{"id":2061},"mutation-avec-mise-à-jour-optimiste","Mutation avec Mise à Jour Optimiste",[368,2064,2066],{"className":436,"code":2065,"filename":635,"language":439,"meta":374,"style":374},"Future\u003CUser> updateUserName(String id, String name) async {\n  final req = GUpdateUserNameReq((b) => b\n    ..vars.id = id\n    ..vars.name = name);\n\n  final result = await _client.request(req).first;\n\n  if (result.hasErrors) throw result.graphqlErrors!.first;\n  return User.fromFragment(result.data!.updateUserName);\n}\n",[352,2067,2068,2097,2114,2130,2147,2151,2175,2179,2203,2226],{"__ignoreMap":374},[378,2069,2070,2072,2074,2076,2078,2081,2083,2085,2087,2089,2091,2093,2095],{"class":380,"line":381},[378,2071,1094],{"class":485},[378,2073,688],{"class":478},[378,2075,691],{"class":485},[378,2077,694],{"class":478},[378,2079,2080],{"class":566},"updateUserName",[378,2082,503],{"class":478},[378,2084,702],{"class":485},[378,2086,1110],{"class":478},[378,2088,920],{"class":388},[378,2090,1115],{"class":485},[378,2092,1118],{"class":478},[378,2094,709],{"class":708},[378,2096,648],{"class":478},[378,2098,2099,2101,2103,2105,2108,2110,2112],{"class":380,"line":392},[378,2100,669],{"class":474},[378,2102,1568],{"class":478},[378,2104,482],{"class":388},[378,2106,2107],{"class":485}," GUpdateUserNameReq",[378,2109,1576],{"class":478},[378,2111,938],{"class":388},[378,2113,1765],{"class":478},[378,2115,2116,2119,2121,2123,2125,2127],{"class":380,"line":405},[378,2117,2118],{"class":388},"    ..",[378,2120,1587],{"class":478},[378,2122,659],{"class":388},[378,2124,1592],{"class":478},[378,2126,482],{"class":388},[378,2128,2129],{"class":478}," id\n",[378,2131,2132,2134,2136,2138,2141,2143,2145],{"class":380,"line":471},[378,2133,2118],{"class":388},[378,2135,1587],{"class":478},[378,2137,659],{"class":388},[378,2139,2140],{"class":478},"name ",[378,2142,482],{"class":388},[378,2144,1334],{"class":478},[378,2146,453],{"class":388},[378,2148,2149],{"class":380,"line":492},[378,2150,468],{"emptyLinePlaceholder":467},[378,2152,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173],{"class":380,"line":515},[378,2154,669],{"class":474},[378,2156,719],{"class":478},[378,2158,482],{"class":388},[378,2160,724],{"class":708},[378,2162,674],{"class":478},[378,2164,659],{"class":388},[378,2166,1616],{"class":566},[378,2168,1619],{"class":478},[378,2170,659],{"class":388},[378,2172,1624],{"class":478},[378,2174,453],{"class":388},[378,2176,2177],{"class":380,"line":531},[378,2178,468],{"emptyLinePlaceholder":467},[378,2180,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201],{"class":380,"line":538},[378,2182,1234],{"class":708},[378,2184,823],{"class":478},[378,2186,659],{"class":388},[378,2188,1841],{"class":478},[378,2190,831],{"class":708},[378,2192,834],{"class":478},[378,2194,659],{"class":388},[378,2196,1653],{"class":478},[378,2198,1656],{"class":388},[378,2200,1624],{"class":478},[378,2202,453],{"class":388},[378,2204,2205,2207,2209,2211,2213,2215,2217,2219,2221,2224],{"class":380,"line":543},[378,2206,1255],{"class":708},[378,2208,850],{"class":485},[378,2210,659],{"class":388},[378,2212,1679],{"class":566},[378,2214,858],{"class":478},[378,2216,659],{"class":388},[378,2218,863],{"class":478},[378,2220,1656],{"class":388},[378,2222,2223],{"class":478},"updateUserName)",[378,2225,453],{"class":388},[378,2227,2228],{"class":380,"line":558},[378,2229,888],{"class":478},[368,2231,2233],{"className":436,"code":2232,"filename":1286,"language":439,"meta":374,"style":374},"QoraMutationBuilder\u003CUser, String, User?>(\n  mutator: (name) => userApi.updateUserName(userId, name),\n  options: MutationOptions(\n    onMutate: (name) {\n      // Optimiste: appliquer le nouveau nom immédiatement à l'utilisateur en cache.\n      final previous = context.qora.getQueryData\u003CUser>(['user', userId]);\n      context.qora.setQueryData(['user', userId],\n          previous?.copyWith(name: name) ?? User(name: name));\n      return previous;\n    },\n    onError: (error, variables, previous) {\n      // Rollback en cas d'échec.\n      if (previous != null) {\n        context.qora.restoreQueryData(['user', userId], previous);\n      }\n    },\n  ),\n  builder: (context, state, mutate) { ... },\n)\n",[352,2234,2235,2254,2278,2288,2298,2303,2342,2367,2399,2409,2416,2436,2441,2458,2487,2491,2497,2503,2525],{"__ignoreMap":374},[378,2236,2237,2239,2241,2243,2245,2247,2249,2251],{"class":380,"line":381},[378,2238,113],{"class":485},[378,2240,688],{"class":478},[378,2242,691],{"class":485},[378,2244,1299],{"class":478},[378,2246,702],{"class":485},[378,2248,1299],{"class":478},[378,2250,691],{"class":485},[378,2252,2253],{"class":478},"?>(\n",[378,2255,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276],{"class":380,"line":392},[378,2257,1313],{"class":478},[378,2259,398],{"class":388},[378,2261,1318],{"class":478},[378,2263,938],{"class":388},[378,2265,941],{"class":478},[378,2267,659],{"class":388},[378,2269,2080],{"class":566},[378,2271,1329],{"class":478},[378,2273,920],{"class":388},[378,2275,1334],{"class":478},[378,2277,512],{"class":388},[378,2279,2280,2282,2284,2286],{"class":380,"line":405},[378,2281,1341],{"class":478},[378,2283,398],{"class":388},[378,2285,1346],{"class":485},[378,2287,489],{"class":478},[378,2289,2290,2293,2295],{"class":380,"line":471},[378,2291,2292],{"class":478},"    onMutate",[378,2294,398],{"class":388},[378,2296,2297],{"class":478}," (name) {\n",[378,2299,2300],{"class":380,"line":492},[378,2301,2302],{"class":416},"      // Optimiste: appliquer le nouveau nom immédiatement à l'utilisateur en cache.\n",[378,2304,2305,2308,2311,2313,2316,2318,2321,2323,2326,2328,2330,2333,2335,2337,2340],{"class":380,"line":515},[378,2306,2307],{"class":474},"      final",[378,2309,2310],{"class":478}," previous ",[378,2312,482],{"class":388},[378,2314,2315],{"class":478}," context",[378,2317,659],{"class":388},[378,2319,2320],{"class":478},"qora",[378,2322,659],{"class":388},[378,2324,2325],{"class":566},"getQueryData",[378,2327,688],{"class":478},[378,2329,691],{"class":485},[378,2331,2332],{"class":478},">([",[378,2334,872],{"class":401},[378,2336,920],{"class":388},[378,2338,2339],{"class":478}," userId])",[378,2341,453],{"class":388},[378,2343,2344,2347,2349,2351,2353,2356,2359,2361,2363,2365],{"class":380,"line":531},[378,2345,2346],{"class":478},"      context",[378,2348,659],{"class":388},[378,2350,2320],{"class":478},[378,2352,659],{"class":388},[378,2354,2355],{"class":566},"setQueryData",[378,2357,2358],{"class":478},"([",[378,2360,872],{"class":401},[378,2362,920],{"class":388},[378,2364,923],{"class":478},[378,2366,512],{"class":388},[378,2368,2369,2372,2375,2378,2381,2383,2385,2388,2390,2392,2394,2397],{"class":380,"line":538},[378,2370,2371],{"class":478},"          previous",[378,2373,2374],{"class":388},"?.",[378,2376,2377],{"class":566},"copyWith",[378,2379,2380],{"class":478},"(name",[378,2382,398],{"class":388},[378,2384,1118],{"class":478},[378,2386,2387],{"class":388},"??",[378,2389,850],{"class":485},[378,2391,2380],{"class":478},[378,2393,398],{"class":388},[378,2395,2396],{"class":478}," name))",[378,2398,453],{"class":388},[378,2400,2401,2404,2407],{"class":380,"line":543},[378,2402,2403],{"class":708},"      return",[378,2405,2406],{"class":478}," previous",[378,2408,453],{"class":388},[378,2410,2411,2414],{"class":380,"line":558},[378,2412,2413],{"class":478},"    }",[378,2415,512],{"class":388},[378,2417,2418,2421,2423,2426,2428,2431,2433],{"class":380,"line":575},[378,2419,2420],{"class":478},"    onError",[378,2422,398],{"class":388},[378,2424,2425],{"class":478}," (error",[378,2427,920],{"class":388},[378,2429,2430],{"class":478}," variables",[378,2432,920],{"class":388},[378,2434,2435],{"class":478}," previous) {\n",[378,2437,2438],{"class":380,"line":581},[378,2439,2440],{"class":416},"      // Rollback en cas d'échec.\n",[378,2442,2443,2446,2449,2452,2455],{"class":380,"line":587},[378,2444,2445],{"class":708},"      if",[378,2447,2448],{"class":478}," (previous ",[378,2450,2451],{"class":388},"!=",[378,2453,2454],{"class":388}," null",[378,2456,2457],{"class":478},") {\n",[378,2459,2460,2463,2465,2467,2469,2472,2474,2476,2478,2480,2482,2485],{"class":380,"line":593},[378,2461,2462],{"class":478},"        context",[378,2464,659],{"class":388},[378,2466,2320],{"class":478},[378,2468,659],{"class":388},[378,2470,2471],{"class":566},"restoreQueryData",[378,2473,2358],{"class":478},[378,2475,872],{"class":401},[378,2477,920],{"class":388},[378,2479,923],{"class":478},[378,2481,920],{"class":388},[378,2483,2484],{"class":478}," previous)",[378,2486,453],{"class":388},[378,2488,2489],{"class":380,"line":599},[378,2490,608],{"class":478},[378,2492,2493,2495],{"class":380,"line":605},[378,2494,2413],{"class":478},[378,2496,512],{"class":388},[378,2498,2499,2501],{"class":380,"line":611},[378,2500,1223],{"class":478},[378,2502,512],{"class":388},[378,2504,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523],{"class":380,"line":617},[378,2506,955],{"class":478},[378,2508,398],{"class":388},[378,2510,960],{"class":478},[378,2512,920],{"class":388},[378,2514,965],{"class":478},[378,2516,920],{"class":388},[378,2518,1390],{"class":478},[378,2520,1393],{"class":388},[378,2522,1396],{"class":478},[378,2524,512],{"class":388},[378,2526,2527],{"class":380,"line":627},[378,2528,1079],{"class":478},[361,2530],{},[364,2532,2534],{"id":2533},"interaction-avec-le-cache-normalisé","Interaction avec le Cache Normalisé",[348,2536,2537],{},"Qora ne remplace pas le cache normalisé de Ferry ou Apollo: il vit au-dessus. Utilisez le cache basé sur les clés de Qora pour l'état UI (les données sont-elles fraîches? dois-je refetcher au montage?), tandis que le cache GraphQL gère le stockage normalisé et l'identité des entités.",[1081,2539,2541],{"id":2540},"stratégie","Stratégie",[2543,2544,2545,2558],"table",{},[2546,2547,2548],"thead",{},[2549,2550,2551,2555],"tr",{},[2552,2553,2554],"th",{},"Couche",[2552,2556,2557],{},"Responsabilité",[2559,2560,2561,2570],"tbody",{},[2549,2562,2563,2567],{},[2564,2565,2566],"td",{},"Cache Qora",[2564,2568,2569],{},"SWR, invalidation, retry, polling, gestion de la péremption",[2549,2571,2572,2575],{},[2564,2573,2574],{},"Cache GraphQL (Ferry/Apollo)",[2564,2576,2577],{},"Entités normalisées, identité des données, déduplication des objets imbriqués",[348,2579,2580],{},"Un pattern courant: après qu'une mutation écrit dans le cache GraphQL, invalidez la clé Qora correspondante pour que le widget refetch:",[368,2582,2584],{"className":436,"code":2583,"filename":1286,"language":439,"meta":374,"style":374},"onSuccess: () {\n  // Le cache GraphQL est déjà mis à jour. Invalider Qora\n  // pour que l'arbre de widgets récupère les données fraîches au prochain rebuild.\n  context.qora.invalidate(['user', userId]);\n},\n",[352,2585,2586,2596,2601,2606,2630],{"__ignoreMap":374},[378,2587,2588,2591,2593],{"class":380,"line":381},[378,2589,2590],{"class":478},"onSuccess",[378,2592,398],{"class":388},[378,2594,2595],{"class":478}," () {\n",[378,2597,2598],{"class":380,"line":392},[378,2599,2600],{"class":416},"  // Le cache GraphQL est déjà mis à jour. Invalider Qora\n",[378,2602,2603],{"class":380,"line":405},[378,2604,2605],{"class":416},"  // pour que l'arbre de widgets récupère les données fraîches au prochain rebuild.\n",[378,2607,2608,2611,2613,2615,2617,2620,2622,2624,2626,2628],{"class":380,"line":471},[378,2609,2610],{"class":478},"  context",[378,2612,659],{"class":388},[378,2614,2320],{"class":478},[378,2616,659],{"class":388},[378,2618,2619],{"class":566},"invalidate",[378,2621,2358],{"class":478},[378,2623,872],{"class":401},[378,2625,920],{"class":388},[378,2627,2339],{"class":478},[378,2629,453],{"class":388},[378,2631,2632,2635],{"class":380,"line":492},[378,2633,2634],{"class":478},"}",[378,2636,512],{"class":388},[1081,2638,2640],{"id":2639},"cache-en-écriture-directe-avec-ferry","Cache en écriture directe avec Ferry",[348,2642,2643,2646,2647,2649],{},[352,2644,2645],{},"Cache.writeFragment"," de Ferry peut mettre à jour les entités normalisées immédiatement. Combinez avec ",[352,2648,2355],{}," de Qora pour une mise à jour UI instantanée:",[368,2651,2653],{"className":436,"code":2652,"filename":635,"language":439,"meta":374,"style":374},"void optimisticUpdate(String userId, String name) {\n  // Écrire dans le cache normalisé de Ferry.\n  _client.cache.writeFragment(\n    GUserFragmentReq((b) => b..idFields = {'id': userId}).createRequest(),\n    {'id': userId, 'name': name, '__typename': 'User'},\n  );\n}\n",[352,2654,2655,2676,2681,2698,2734,2768,2774],{"__ignoreMap":374},[378,2656,2657,2659,2662,2664,2666,2669,2671,2673],{"class":380,"line":381},[378,2658,1306],{"class":474},[378,2660,2661],{"class":566}," optimisticUpdate",[378,2663,503],{"class":478},[378,2665,702],{"class":485},[378,2667,2668],{"class":478}," userId",[378,2670,920],{"class":388},[378,2672,1115],{"class":485},[378,2674,2675],{"class":478}," name) {\n",[378,2677,2678],{"class":380,"line":392},[378,2679,2680],{"class":416},"  // Écrire dans le cache normalisé de Ferry.\n",[378,2682,2683,2686,2688,2691,2693,2696],{"class":380,"line":405},[378,2684,2685],{"class":478},"  _client",[378,2687,659],{"class":388},[378,2689,2690],{"class":478},"cache",[378,2692,659],{"class":388},[378,2694,2695],{"class":566},"writeFragment",[378,2697,489],{"class":478},[378,2699,2700,2703,2705,2707,2709,2711,2714,2716,2718,2720,2722,2725,2727,2730,2732],{"class":380,"line":471},[378,2701,2702],{"class":485},"    GUserFragmentReq",[378,2704,1576],{"class":478},[378,2706,938],{"class":388},[378,2708,1581],{"class":478},[378,2710,1584],{"class":388},[378,2712,2713],{"class":478},"idFields ",[378,2715,482],{"class":388},[378,2717,787],{"class":478},[378,2719,790],{"class":401},[378,2721,398],{"class":388},[378,2723,2724],{"class":478}," userId})",[378,2726,659],{"class":388},[378,2728,2729],{"class":566},"createRequest",[378,2731,526],{"class":478},[378,2733,512],{"class":388},[378,2735,2736,2739,2741,2743,2745,2747,2749,2751,2754,2756,2759,2761,2764,2766],{"class":380,"line":492},[378,2737,2738],{"class":478},"    {",[378,2740,790],{"class":401},[378,2742,398],{"class":388},[378,2744,2668],{"class":478},[378,2746,920],{"class":388},[378,2748,1205],{"class":401},[378,2750,398],{"class":388},[378,2752,2753],{"class":478}," name",[378,2755,920],{"class":388},[378,2757,2758],{"class":401}," '__typename'",[378,2760,398],{"class":388},[378,2762,2763],{"class":401}," 'User'",[378,2765,2634],{"class":478},[378,2767,512],{"class":388},[378,2769,2770,2772],{"class":380,"line":515},[378,2771,1223],{"class":478},[378,2773,453],{"class":388},[378,2775,2776],{"class":380,"line":531},[378,2777,888],{"class":478},[361,2779],{},[364,2781,2783],{"id":2782},"gestion-derreurs","Gestion d'Erreurs",[348,2785,2786,2787,2790],{},"Les erreurs GraphQL viennent sous deux formes: exceptions au niveau transport et objets ",[352,2788,2789],{},"GraphQLError"," dans le corps de la réponse. Mappez les deux vers des erreurs domaine:",[368,2792,2795],{"className":436,"code":2793,"filename":2794,"language":439,"meta":374,"style":374},"import 'package:graphql/client.dart';\nimport 'package:qora/qora.dart';\n\n/// `errorMapper` doit retourner une `QoraException`, d'où l'héritage.\nclass GraphQLAppError extends QoraException {\n  final bool isNetwork;\n  const GraphQLAppError(super.message, {this.isNetwork = false, super.originalError});\n}\n\nQoraException mapGraphQLError(Object error, StackTrace? stackTrace) {\n  if (error is OperationException) {\n    if (error.graphqlErrors.isNotEmpty) {\n      final messages = error.graphqlErrors.map((e) => e.message).join(', ');\n      return GraphQLAppError(messages, originalError: error);\n    }\n    if (error.linkException != null) {\n      return GraphQLAppError(\n        error.linkException.toString(),\n        isNetwork: true,\n        originalError: error,\n      );\n    }\n  }\n  if (error is QoraException) return error;\n  return QoraException(error.toString(), originalError: error, stackTrace: stackTrace);\n}\n","lib/data/graphql_error_mapper.dart",[352,2796,2797,2805,2813,2817,2835,2850,2862,2902,2906,2910,2936,2951,2966,3012,3033,3037,3054,3062,3081,3091,3102,3108,3112,3116,3136,3171],{"__ignoreMap":374},[378,2798,2799,2801,2803],{"class":380,"line":381},[378,2800,447],{"class":446},[378,2802,450],{"class":401},[378,2804,453],{"class":388},[378,2806,2807,2809,2811],{"class":380,"line":392},[378,2808,447],{"class":446},[378,2810,460],{"class":401},[378,2812,453],{"class":388},[378,2814,2815],{"class":380,"line":405},[378,2816,468],{"emptyLinePlaceholder":467},[378,2818,2819,2822,2826,2829,2832],{"class":380,"line":471},[378,2820,2821],{"class":416},"/// ",[378,2823,2825],{"class":2824},"sHdIc","`errorMapper`",[378,2827,2828],{"class":416}," doit retourner une ",[378,2830,2831],{"class":2824},"`QoraException`",[378,2833,2834],{"class":416},", d'où l'héritage.\n",[378,2836,2837,2839,2842,2845,2848],{"class":380,"line":492},[378,2838,642],{"class":388},[378,2840,2841],{"class":485}," GraphQLAppError",[378,2843,2844],{"class":388}," extends",[378,2846,2847],{"class":485}," QoraException",[378,2849,648],{"class":478},[378,2851,2852,2854,2857,2860],{"class":380,"line":515},[378,2853,669],{"class":474},[378,2855,2856],{"class":485}," bool",[378,2858,2859],{"class":478}," isNetwork",[378,2861,453],{"class":388},[378,2863,2864,2867,2869,2872,2874,2877,2879,2882,2884,2887,2889,2892,2895,2897,2900],{"class":380,"line":531},[378,2865,2866],{"class":474},"  const",[378,2868,2841],{"class":485},[378,2870,2871],{"class":478},"(super",[378,2873,659],{"class":388},[378,2875,2876],{"class":478},"message",[378,2878,920],{"class":388},[378,2880,2881],{"class":478}," {this",[378,2883,659],{"class":388},[378,2885,2886],{"class":478},"isNetwork ",[378,2888,482],{"class":388},[378,2890,2891],{"class":388}," false,",[378,2893,2894],{"class":478}," super",[378,2896,659],{"class":388},[378,2898,2899],{"class":478},"originalError})",[378,2901,453],{"class":388},[378,2903,2904],{"class":380,"line":538},[378,2905,888],{"class":478},[378,2907,2908],{"class":380,"line":543},[378,2909,468],{"emptyLinePlaceholder":467},[378,2911,2912,2915,2918,2920,2923,2926,2928,2931,2933],{"class":380,"line":558},[378,2913,2914],{"class":485},"QoraException",[378,2916,2917],{"class":566}," mapGraphQLError",[378,2919,503],{"class":478},[378,2921,2922],{"class":485},"Object",[378,2924,2925],{"class":478}," error",[378,2927,920],{"class":388},[378,2929,2930],{"class":485}," StackTrace",[378,2932,1740],{"class":388},[378,2934,2935],{"class":478}," stackTrace) {\n",[378,2937,2938,2940,2943,2946,2949],{"class":380,"line":575},[378,2939,1234],{"class":708},[378,2941,2942],{"class":478}," (error ",[378,2944,2945],{"class":388},"is",[378,2947,2948],{"class":485}," OperationException",[378,2950,2457],{"class":478},[378,2952,2953,2955,2957,2959,2961,2963],{"class":380,"line":581},[378,2954,820],{"class":708},[378,2956,2425],{"class":478},[378,2958,659],{"class":388},[378,2960,1653],{"class":478},[378,2962,659],{"class":388},[378,2964,2965],{"class":478},"isNotEmpty) {\n",[378,2967,2968,2970,2973,2975,2977,2979,2981,2983,2985,2988,2990,2993,2995,2998,3000,3003,3005,3008,3010],{"class":380,"line":587},[378,2969,2307],{"class":474},[378,2971,2972],{"class":478}," messages ",[378,2974,482],{"class":388},[378,2976,2925],{"class":478},[378,2978,659],{"class":388},[378,2980,1653],{"class":478},[378,2982,659],{"class":388},[378,2984,1885],{"class":566},[378,2986,2987],{"class":478},"((e) ",[378,2989,938],{"class":388},[378,2991,2992],{"class":478}," e",[378,2994,659],{"class":388},[378,2996,2997],{"class":478},"message)",[378,2999,659],{"class":388},[378,3001,3002],{"class":566},"join",[378,3004,503],{"class":478},[378,3006,3007],{"class":401},"', '",[378,3009,509],{"class":478},[378,3011,453],{"class":388},[378,3013,3014,3016,3018,3021,3023,3026,3028,3031],{"class":380,"line":593},[378,3015,2403],{"class":708},[378,3017,2841],{"class":485},[378,3019,3020],{"class":478},"(messages",[378,3022,920],{"class":388},[378,3024,3025],{"class":478}," originalError",[378,3027,398],{"class":388},[378,3029,3030],{"class":478}," error)",[378,3032,453],{"class":388},[378,3034,3035],{"class":380,"line":599},[378,3036,614],{"class":478},[378,3038,3039,3041,3043,3045,3048,3050,3052],{"class":380,"line":605},[378,3040,820],{"class":708},[378,3042,2425],{"class":478},[378,3044,659],{"class":388},[378,3046,3047],{"class":478},"linkException ",[378,3049,2451],{"class":388},[378,3051,2454],{"class":388},[378,3053,2457],{"class":478},[378,3055,3056,3058,3060],{"class":380,"line":611},[378,3057,2403],{"class":708},[378,3059,2841],{"class":485},[378,3061,489],{"class":478},[378,3063,3064,3067,3069,3072,3074,3077,3079],{"class":380,"line":617},[378,3065,3066],{"class":478},"        error",[378,3068,659],{"class":388},[378,3070,3071],{"class":478},"linkException",[378,3073,659],{"class":388},[378,3075,3076],{"class":566},"toString",[378,3078,526],{"class":478},[378,3080,512],{"class":388},[378,3082,3083,3086,3088],{"class":380,"line":627},[378,3084,3085],{"class":478},"        isNetwork",[378,3087,398],{"class":388},[378,3089,3090],{"class":388}," true,\n",[378,3092,3093,3096,3098,3100],{"class":380,"line":885},[378,3094,3095],{"class":478},"        originalError",[378,3097,398],{"class":388},[378,3099,2925],{"class":478},[378,3101,512],{"class":388},[378,3103,3104,3106],{"class":380,"line":1827},[378,3105,802],{"class":478},[378,3107,453],{"class":388},[378,3109,3110],{"class":380,"line":1832},[378,3111,614],{"class":478},[378,3113,3114],{"class":380,"line":1858},[378,3115,882],{"class":478},[378,3117,3118,3120,3122,3124,3126,3129,3132,3134],{"class":380,"line":1863},[378,3119,1234],{"class":708},[378,3121,2942],{"class":478},[378,3123,2945],{"class":388},[378,3125,2847],{"class":485},[378,3127,3128],{"class":478},") ",[378,3130,3131],{"class":708},"return",[378,3133,2925],{"class":478},[378,3135,453],{"class":388},[378,3137,3138,3140,3142,3145,3147,3149,3151,3153,3155,3157,3159,3161,3164,3166,3169],{"class":380,"line":1879},[378,3139,1255],{"class":708},[378,3141,2847],{"class":485},[378,3143,3144],{"class":478},"(error",[378,3146,659],{"class":388},[378,3148,3076],{"class":566},[378,3150,526],{"class":478},[378,3152,920],{"class":388},[378,3154,3025],{"class":478},[378,3156,398],{"class":388},[378,3158,2925],{"class":478},[378,3160,920],{"class":388},[378,3162,3163],{"class":478}," stackTrace",[378,3165,398],{"class":388},[378,3167,3168],{"class":478}," stackTrace)",[378,3170,453],{"class":388},[378,3172,3173],{"class":380,"line":1902},[378,3174,888],{"class":478},[348,3176,3177,3178,3181],{},"Enregistrez avec l'",[352,3179,3180],{},"errorMapper"," global de Qora:",[368,3183,3186],{"className":436,"code":3184,"filename":3185,"language":439,"meta":374,"style":374},"final client = QoraClient(\n  config: QoraClientConfig(\n    errorMapper: mapGraphQLError,\n  ),\n);\n","lib/core/qora_setup.dart",[352,3187,3188,3202,3214,3225,3231],{"__ignoreMap":374},[378,3189,3190,3192,3195,3197,3200],{"class":380,"line":381},[378,3191,475],{"class":474},[378,3193,3194],{"class":478}," client ",[378,3196,482],{"class":388},[378,3198,3199],{"class":485}," QoraClient",[378,3201,489],{"class":478},[378,3203,3204,3207,3209,3212],{"class":380,"line":392},[378,3205,3206],{"class":478},"  config",[378,3208,398],{"class":388},[378,3210,3211],{"class":485}," QoraClientConfig",[378,3213,489],{"class":478},[378,3215,3216,3219,3221,3223],{"class":380,"line":405},[378,3217,3218],{"class":478},"    errorMapper",[378,3220,398],{"class":388},[378,3222,2917],{"class":478},[378,3224,512],{"class":388},[378,3226,3227,3229],{"class":380,"line":471},[378,3228,1223],{"class":478},[378,3230,512],{"class":388},[378,3232,3233,3235],{"class":380,"line":492},[378,3234,509],{"class":478},[378,3236,453],{"class":388},[361,3238],{},[364,3240,3242],{"id":3241},"pagination-par-curseur","Pagination par Curseur",[348,3244,3245],{},"Utilisez le support de pagination de Qora avec les connexions par curseur:",[368,3247,3249],{"className":436,"code":3248,"filename":635,"language":439,"meta":374,"style":374},"Future\u003CConnection\u003CUser>> listUsers({int first = 20, String? after}) async {\n  final req = GListUsersReq((b) => b\n    ..vars.first = first\n    ..vars.after = after);\n  final result = await _client.request(req).first;\n\n  if (result.hasErrors) throw result.graphqlErrors!.first;\n\n  final users = result.data!.users\n      .map((u) => User.fromFragment(u))\n      .toList();\n  final pageInfo = result.data!.usersConnection.pageInfo;\n\n  return Connection(\n    nodes: users,\n    hasNextPage: pageInfo.hasNextPage,\n    endCursor: pageInfo.endCursor,\n  );\n}\n",[352,3250,3251,3291,3307,3321,3338,3362,3366,3390,3394,3413,3432,3442,3469,3473,3482,3494,3511,3527,3533],{"__ignoreMap":374},[378,3252,3253,3255,3257,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3287,3289],{"class":380,"line":381},[378,3254,1094],{"class":485},[378,3256,688],{"class":478},[378,3258,3259],{"class":485},"Connection",[378,3261,688],{"class":478},[378,3263,691],{"class":485},[378,3265,1716],{"class":478},[378,3267,1719],{"class":566},[378,3269,1722],{"class":478},[378,3271,1725],{"class":485},[378,3273,1728],{"class":478},[378,3275,482],{"class":388},[378,3277,1733],{"class":446},[378,3279,920],{"class":388},[378,3281,1115],{"class":485},[378,3283,1740],{"class":388},[378,3285,3286],{"class":478}," after}) ",[378,3288,709],{"class":708},[378,3290,648],{"class":478},[378,3292,3293,3295,3297,3299,3301,3303,3305],{"class":380,"line":392},[378,3294,669],{"class":474},[378,3296,1568],{"class":478},[378,3298,482],{"class":388},[378,3300,1758],{"class":485},[378,3302,1576],{"class":478},[378,3304,938],{"class":388},[378,3306,1765],{"class":478},[378,3308,3309,3311,3313,3315,3317,3319],{"class":380,"line":405},[378,3310,2118],{"class":388},[378,3312,1587],{"class":478},[378,3314,659],{"class":388},[378,3316,1777],{"class":478},[378,3318,482],{"class":388},[378,3320,1782],{"class":478},[378,3322,3323,3325,3327,3329,3331,3333,3336],{"class":380,"line":471},[378,3324,2118],{"class":388},[378,3326,1587],{"class":478},[378,3328,659],{"class":388},[378,3330,1793],{"class":478},[378,3332,482],{"class":388},[378,3334,3335],{"class":478}," after)",[378,3337,453],{"class":388},[378,3339,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360],{"class":380,"line":492},[378,3341,669],{"class":474},[378,3343,719],{"class":478},[378,3345,482],{"class":388},[378,3347,724],{"class":708},[378,3349,674],{"class":478},[378,3351,659],{"class":388},[378,3353,1616],{"class":566},[378,3355,1619],{"class":478},[378,3357,659],{"class":388},[378,3359,1624],{"class":478},[378,3361,453],{"class":388},[378,3363,3364],{"class":380,"line":515},[378,3365,468],{"emptyLinePlaceholder":467},[378,3367,3368,3370,3372,3374,3376,3378,3380,3382,3384,3386,3388],{"class":380,"line":531},[378,3369,1234],{"class":708},[378,3371,823],{"class":478},[378,3373,659],{"class":388},[378,3375,1841],{"class":478},[378,3377,831],{"class":708},[378,3379,834],{"class":478},[378,3381,659],{"class":388},[378,3383,1653],{"class":478},[378,3385,1656],{"class":388},[378,3387,1624],{"class":478},[378,3389,453],{"class":388},[378,3391,3392],{"class":380,"line":538},[378,3393,468],{"emptyLinePlaceholder":467},[378,3395,3396,3398,3401,3403,3405,3407,3409,3411],{"class":380,"line":543},[378,3397,669],{"class":474},[378,3399,3400],{"class":478}," users ",[378,3402,482],{"class":388},[378,3404,834],{"class":478},[378,3406,659],{"class":388},[378,3408,863],{"class":478},[378,3410,1656],{"class":388},[378,3412,1876],{"class":478},[378,3414,3415,3418,3420,3422,3424,3426,3428,3430],{"class":380,"line":558},[378,3416,3417],{"class":388},"      .",[378,3419,1885],{"class":566},[378,3421,1888],{"class":478},[378,3423,938],{"class":388},[378,3425,850],{"class":485},[378,3427,659],{"class":388},[378,3429,1679],{"class":566},[378,3431,1899],{"class":478},[378,3433,3434,3436,3438,3440],{"class":380,"line":575},[378,3435,3417],{"class":388},[378,3437,1907],{"class":566},[378,3439,526],{"class":478},[378,3441,453],{"class":388},[378,3443,3444,3446,3449,3451,3453,3455,3457,3459,3462,3464,3467],{"class":380,"line":581},[378,3445,669],{"class":474},[378,3447,3448],{"class":478}," pageInfo ",[378,3450,482],{"class":388},[378,3452,834],{"class":478},[378,3454,659],{"class":388},[378,3456,863],{"class":478},[378,3458,1656],{"class":388},[378,3460,3461],{"class":478},"usersConnection",[378,3463,659],{"class":388},[378,3465,3466],{"class":478},"pageInfo",[378,3468,453],{"class":388},[378,3470,3471],{"class":380,"line":587},[378,3472,468],{"emptyLinePlaceholder":467},[378,3474,3475,3477,3480],{"class":380,"line":593},[378,3476,1255],{"class":708},[378,3478,3479],{"class":485}," Connection",[378,3481,489],{"class":478},[378,3483,3484,3487,3489,3492],{"class":380,"line":599},[378,3485,3486],{"class":478},"    nodes",[378,3488,398],{"class":388},[378,3490,3491],{"class":478}," users",[378,3493,512],{"class":388},[378,3495,3496,3499,3501,3504,3506,3509],{"class":380,"line":605},[378,3497,3498],{"class":478},"    hasNextPage",[378,3500,398],{"class":388},[378,3502,3503],{"class":478}," pageInfo",[378,3505,659],{"class":388},[378,3507,3508],{"class":478},"hasNextPage",[378,3510,512],{"class":388},[378,3512,3513,3516,3518,3520,3522,3525],{"class":380,"line":611},[378,3514,3515],{"class":478},"    endCursor",[378,3517,398],{"class":388},[378,3519,3503],{"class":478},[378,3521,659],{"class":388},[378,3523,3524],{"class":478},"endCursor",[378,3526,512],{"class":388},[378,3528,3529,3531],{"class":380,"line":617},[378,3530,1223],{"class":478},[378,3532,453],{"class":388},[378,3534,3535],{"class":380,"line":627},[378,3536,888],{"class":478},[368,3538,3540],{"className":436,"code":3539,"filename":1925,"language":439,"meta":374,"style":374},"class UserListScreen extends StatefulWidget { ... }\n\nclass _UserListScreenState extends State\u003CUserListScreen> {\n  String? _cursor;\n\n  @override\n  Widget build(BuildContext context) {\n    return QoraBuilder\u003CConnection\u003CUser>>(\n      queryKey: ['users', 20, _cursor],\n      fetcher: () => userApi.listUsers(after: _cursor),\n      keepPreviousData: true,\n      builder: (context, state, _) {\n        final users = state.dataOrNull?.nodes ?? [];\n        return ListView.builder(\n          itemCount: users.length + 1,\n          itemBuilder: (_, i) {\n            if (i == users.length) {\n              return TextButton(\n                onPressed: () => setState(() =>\n                    _cursor = state.dataOrNull?.endCursor),\n                child: const Text('Charger plus'),\n              );\n            }\n            return UserTile(users[i]);\n          },\n        );\n      },\n    );\n  }\n}\n",[352,3541,3542,3562,3566,3586,3598,3602,3607,3623,3640,3662,3689,3698,3716,3744,3759,3781,3796,3814,3824,3844,3864,3885,3892,3897,3910,3917,3924,3931,3937,3942],{"__ignoreMap":374},[378,3543,3544,3546,3549,3551,3554,3557,3559],{"class":380,"line":381},[378,3545,642],{"class":388},[378,3547,3548],{"class":485}," UserListScreen",[378,3550,2844],{"class":388},[378,3552,3553],{"class":485}," StatefulWidget",[378,3555,3556],{"class":478}," { ",[378,3558,1393],{"class":388},[378,3560,3561],{"class":478}," }\n",[378,3563,3564],{"class":380,"line":392},[378,3565,468],{"emptyLinePlaceholder":467},[378,3567,3568,3570,3573,3575,3578,3580,3583],{"class":380,"line":405},[378,3569,642],{"class":388},[378,3571,3572],{"class":485}," _UserListScreenState",[378,3574,2844],{"class":388},[378,3576,3577],{"class":485}," State",[378,3579,688],{"class":478},[378,3581,3582],{"class":485},"UserListScreen",[378,3584,3585],{"class":478},"> {\n",[378,3587,3588,3591,3593,3596],{"class":380,"line":471},[378,3589,3590],{"class":485},"  String",[378,3592,1740],{"class":388},[378,3594,3595],{"class":478}," _cursor",[378,3597,453],{"class":388},[378,3599,3600],{"class":380,"line":492},[378,3601,468],{"emptyLinePlaceholder":467},[378,3603,3604],{"class":380,"line":515},[378,3605,3606],{"class":474},"  @override\n",[378,3608,3609,3612,3615,3617,3620],{"class":380,"line":531},[378,3610,3611],{"class":485},"  Widget",[378,3613,3614],{"class":566}," build",[378,3616,503],{"class":478},[378,3618,3619],{"class":485},"BuildContext",[378,3621,3622],{"class":478}," context) {\n",[378,3624,3625,3627,3630,3632,3634,3636,3638],{"class":380,"line":538},[378,3626,847],{"class":708},[378,3628,3629],{"class":485}," QoraBuilder",[378,3631,688],{"class":478},[378,3633,3259],{"class":485},[378,3635,688],{"class":478},[378,3637,691],{"class":485},[378,3639,1942],{"class":478},[378,3641,3642,3645,3647,3649,3651,3653,3655,3657,3660],{"class":380,"line":543},[378,3643,3644],{"class":478},"      queryKey",[378,3646,398],{"class":388},[378,3648,915],{"class":478},[378,3650,1953],{"class":401},[378,3652,920],{"class":388},[378,3654,1733],{"class":446},[378,3656,920],{"class":388},[378,3658,3659],{"class":478}," _cursor]",[378,3661,512],{"class":388},[378,3663,3664,3667,3669,3671,3673,3675,3677,3679,3682,3684,3687],{"class":380,"line":558},[378,3665,3666],{"class":478},"      fetcher",[378,3668,398],{"class":388},[378,3670,935],{"class":478},[378,3672,938],{"class":388},[378,3674,941],{"class":478},[378,3676,659],{"class":388},[378,3678,1719],{"class":566},[378,3680,3681],{"class":478},"(after",[378,3683,398],{"class":388},[378,3685,3686],{"class":478}," _cursor)",[378,3688,512],{"class":388},[378,3690,3691,3694,3696],{"class":380,"line":575},[378,3692,3693],{"class":478},"      keepPreviousData",[378,3695,398],{"class":388},[378,3697,3090],{"class":388},[378,3699,3700,3703,3705,3707,3709,3711,3713],{"class":380,"line":581},[378,3701,3702],{"class":478},"      builder",[378,3704,398],{"class":388},[378,3706,960],{"class":478},[378,3708,920],{"class":388},[378,3710,965],{"class":478},[378,3712,920],{"class":388},[378,3714,3715],{"class":478}," _) {\n",[378,3717,3718,3721,3723,3725,3727,3729,3732,3734,3737,3739,3742],{"class":380,"line":587},[378,3719,3720],{"class":474},"        final",[378,3722,3400],{"class":478},[378,3724,482],{"class":388},[378,3726,965],{"class":478},[378,3728,659],{"class":388},[378,3730,3731],{"class":478},"dataOrNull",[378,3733,2374],{"class":388},[378,3735,3736],{"class":478},"nodes ",[378,3738,2387],{"class":388},[378,3740,3741],{"class":478}," []",[378,3743,453],{"class":388},[378,3745,3746,3749,3752,3754,3757],{"class":380,"line":593},[378,3747,3748],{"class":708},"        return",[378,3750,3751],{"class":485}," ListView",[378,3753,659],{"class":388},[378,3755,3756],{"class":566},"builder",[378,3758,489],{"class":478},[378,3760,3761,3764,3766,3768,3770,3773,3776,3779],{"class":380,"line":599},[378,3762,3763],{"class":478},"          itemCount",[378,3765,398],{"class":388},[378,3767,3491],{"class":478},[378,3769,659],{"class":388},[378,3771,3772],{"class":478},"length ",[378,3774,3775],{"class":388},"+",[378,3777,3778],{"class":446}," 1",[378,3780,512],{"class":388},[378,3782,3783,3786,3788,3791,3793],{"class":380,"line":605},[378,3784,3785],{"class":478},"          itemBuilder",[378,3787,398],{"class":388},[378,3789,3790],{"class":478}," (_",[378,3792,920],{"class":388},[378,3794,3795],{"class":478}," i) {\n",[378,3797,3798,3801,3804,3807,3809,3811],{"class":380,"line":611},[378,3799,3800],{"class":708},"            if",[378,3802,3803],{"class":478}," (i ",[378,3805,3806],{"class":388},"==",[378,3808,3491],{"class":478},[378,3810,659],{"class":388},[378,3812,3813],{"class":478},"length) {\n",[378,3815,3816,3819,3822],{"class":380,"line":617},[378,3817,3818],{"class":708},"              return",[378,3820,3821],{"class":485}," TextButton",[378,3823,489],{"class":478},[378,3825,3826,3829,3831,3833,3835,3838,3841],{"class":380,"line":627},[378,3827,3828],{"class":478},"                onPressed",[378,3830,398],{"class":388},[378,3832,935],{"class":478},[378,3834,938],{"class":388},[378,3836,3837],{"class":566}," setState",[378,3839,3840],{"class":478},"(() ",[378,3842,3843],{"class":388},"=>\n",[378,3845,3846,3849,3851,3853,3855,3857,3859,3862],{"class":380,"line":885},[378,3847,3848],{"class":478},"                    _cursor ",[378,3850,482],{"class":388},[378,3852,965],{"class":478},[378,3854,659],{"class":388},[378,3856,3731],{"class":478},[378,3858,2374],{"class":388},[378,3860,3861],{"class":478},"endCursor)",[378,3863,512],{"class":388},[378,3865,3866,3869,3871,3873,3876,3878,3881,3883],{"class":380,"line":1827},[378,3867,3868],{"class":478},"                child",[378,3870,398],{"class":388},[378,3872,1015],{"class":474},[378,3874,3875],{"class":485}," Text",[378,3877,503],{"class":478},[378,3879,3880],{"class":401},"'Charger plus'",[378,3882,509],{"class":478},[378,3884,512],{"class":388},[378,3886,3887,3890],{"class":380,"line":1832},[378,3888,3889],{"class":478},"              )",[378,3891,453],{"class":388},[378,3893,3894],{"class":380,"line":1858},[378,3895,3896],{"class":478},"            }\n",[378,3898,3899,3902,3905,3908],{"class":380,"line":1863},[378,3900,3901],{"class":708},"            return",[378,3903,3904],{"class":485}," UserTile",[378,3906,3907],{"class":478},"(users[i])",[378,3909,453],{"class":388},[378,3911,3912,3915],{"class":380,"line":1879},[378,3913,3914],{"class":478},"          }",[378,3916,512],{"class":388},[378,3918,3919,3922],{"class":380,"line":1902},[378,3920,3921],{"class":478},"        )",[378,3923,453],{"class":388},[378,3925,3926,3929],{"class":380,"line":1914},[378,3927,3928],{"class":478},"      }",[378,3930,512],{"class":388},[378,3932,3933,3935],{"class":380,"line":1919},[378,3934,809],{"class":478},[378,3936,453],{"class":388},[378,3938,3940],{"class":380,"line":3939},29,[378,3941,882],{"class":478},[378,3943,3945],{"class":380,"line":3944},30,[378,3946,888],{"class":478},[361,3948],{},[364,3950,3952],{"id":3951},"tester-les-fetchers-graphql","Tester les Fetchers GraphQL",[348,3954,3955],{},"Mockez le lien de transport du client GraphQL pour éviter les appels réseau réels:",[368,3957,3960],{"className":436,"code":3958,"filename":3959,"language":439,"meta":374,"style":374},"import 'package:graphql/client.dart';\nimport 'package:qora/qora.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  late GraphQLClient gqlClient;\n  late QoraClient client;\n\n  setUp(() {\n    gqlClient = GraphQLClient(\n      link: _MockLink(), // implémente Link\n      cache: GraphQLCache(),\n    );\n    client = QoraClient();\n  });\n\n  test('le fetcher retourne un User parsé en cas de succès', () async {\n    final api = UserApi(gqlClient);\n    final result = await client.fetchQuery\u003CUser>(\n      key: ['user', '1'],\n      fetcher: () => api.getUser('1'),\n    );\n\n    expect(result.name, 'Test User');\n  });\n}\n","test/data/user_api_test.dart",[352,3961,3962,3970,3978,3987,3991,4001,4013,4024,4028,4036,4047,4064,4077,4083,4096,4103,4107,4125,4141,4164,4185,4211,4217,4221,4242,4248],{"__ignoreMap":374},[378,3963,3964,3966,3968],{"class":380,"line":381},[378,3965,447],{"class":446},[378,3967,450],{"class":401},[378,3969,453],{"class":388},[378,3971,3972,3974,3976],{"class":380,"line":392},[378,3973,447],{"class":446},[378,3975,460],{"class":401},[378,3977,453],{"class":388},[378,3979,3980,3982,3985],{"class":380,"line":405},[378,3981,447],{"class":446},[378,3983,3984],{"class":401}," 'package:test/test.dart'",[378,3986,453],{"class":388},[378,3988,3989],{"class":380,"line":471},[378,3990,468],{"emptyLinePlaceholder":467},[378,3992,3993,3995,3998],{"class":380,"line":492},[378,3994,1306],{"class":474},[378,3996,3997],{"class":566}," main",[378,3999,4000],{"class":478},"() {\n",[378,4002,4003,4006,4008,4011],{"class":380,"line":515},[378,4004,4005],{"class":474},"  late",[378,4007,486],{"class":485},[378,4009,4010],{"class":478}," gqlClient",[378,4012,453],{"class":388},[378,4014,4015,4017,4019,4022],{"class":380,"line":531},[378,4016,4005],{"class":474},[378,4018,3199],{"class":485},[378,4020,4021],{"class":478}," client",[378,4023,453],{"class":388},[378,4025,4026],{"class":380,"line":538},[378,4027,468],{"emptyLinePlaceholder":467},[378,4029,4030,4033],{"class":380,"line":543},[378,4031,4032],{"class":566},"  setUp",[378,4034,4035],{"class":478},"(() {\n",[378,4037,4038,4041,4043,4045],{"class":380,"line":558},[378,4039,4040],{"class":478},"    gqlClient ",[378,4042,482],{"class":388},[378,4044,486],{"class":485},[378,4046,489],{"class":478},[378,4048,4049,4052,4054,4057,4059,4061],{"class":380,"line":575},[378,4050,4051],{"class":478},"      link",[378,4053,398],{"class":388},[378,4055,4056],{"class":485}," _MockLink",[378,4058,526],{"class":478},[378,4060,920],{"class":388},[378,4062,4063],{"class":416}," // implémente Link\n",[378,4065,4066,4069,4071,4073,4075],{"class":380,"line":581},[378,4067,4068],{"class":478},"      cache",[378,4070,398],{"class":388},[378,4072,523],{"class":485},[378,4074,526],{"class":478},[378,4076,512],{"class":388},[378,4078,4079,4081],{"class":380,"line":587},[378,4080,809],{"class":478},[378,4082,453],{"class":388},[378,4084,4085,4088,4090,4092,4094],{"class":380,"line":593},[378,4086,4087],{"class":478},"    client ",[378,4089,482],{"class":388},[378,4091,3199],{"class":485},[378,4093,526],{"class":478},[378,4095,453],{"class":388},[378,4097,4098,4101],{"class":380,"line":599},[378,4099,4100],{"class":478},"  })",[378,4102,453],{"class":388},[378,4104,4105],{"class":380,"line":605},[378,4106,468],{"emptyLinePlaceholder":467},[378,4108,4109,4112,4114,4117,4119,4121,4123],{"class":380,"line":611},[378,4110,4111],{"class":566},"  test",[378,4113,503],{"class":478},[378,4115,4116],{"class":401},"'le fetcher retourne un User parsé en cas de succès'",[378,4118,920],{"class":388},[378,4120,935],{"class":478},[378,4122,709],{"class":708},[378,4124,648],{"class":478},[378,4126,4127,4129,4132,4134,4136,4139],{"class":380,"line":617},[378,4128,716],{"class":474},[378,4130,4131],{"class":478}," api ",[378,4133,482],{"class":388},[378,4135,645],{"class":485},[378,4137,4138],{"class":478},"(gqlClient)",[378,4140,453],{"class":388},[378,4142,4143,4145,4147,4149,4151,4153,4155,4158,4160,4162],{"class":380,"line":627},[378,4144,716],{"class":474},[378,4146,719],{"class":478},[378,4148,482],{"class":388},[378,4150,724],{"class":708},[378,4152,4021],{"class":478},[378,4154,659],{"class":388},[378,4156,4157],{"class":566},"fetchQuery",[378,4159,688],{"class":478},[378,4161,691],{"class":485},[378,4163,905],{"class":478},[378,4165,4166,4169,4171,4173,4175,4177,4180,4183],{"class":380,"line":885},[378,4167,4168],{"class":478},"      key",[378,4170,398],{"class":388},[378,4172,915],{"class":478},[378,4174,872],{"class":401},[378,4176,920],{"class":388},[378,4178,4179],{"class":401}," '1'",[378,4181,4182],{"class":478},"]",[378,4184,512],{"class":388},[378,4186,4187,4189,4191,4193,4195,4198,4200,4202,4204,4207,4209],{"class":380,"line":1827},[378,4188,3666],{"class":478},[378,4190,398],{"class":388},[378,4192,935],{"class":478},[378,4194,938],{"class":388},[378,4196,4197],{"class":478}," api",[378,4199,659],{"class":388},[378,4201,697],{"class":566},[378,4203,503],{"class":478},[378,4205,4206],{"class":401},"'1'",[378,4208,509],{"class":478},[378,4210,512],{"class":388},[378,4212,4213,4215],{"class":380,"line":1832},[378,4214,809],{"class":478},[378,4216,453],{"class":388},[378,4218,4219],{"class":380,"line":1858},[378,4220,468],{"emptyLinePlaceholder":467},[378,4222,4223,4226,4228,4230,4233,4235,4238,4240],{"class":380,"line":1863},[378,4224,4225],{"class":566},"    expect",[378,4227,858],{"class":478},[378,4229,659],{"class":388},[378,4231,4232],{"class":478},"name",[378,4234,920],{"class":388},[378,4236,4237],{"class":401}," 'Test User'",[378,4239,509],{"class":478},[378,4241,453],{"class":388},[378,4243,4244,4246],{"class":380,"line":1879},[378,4245,4100],{"class":478},[378,4247,453],{"class":388},[378,4249,4250],{"class":380,"line":1902},[378,4251,888],{"class":478},[361,4253],{},[364,4255,4257],{"id":4256},"étapes-suivantes","Étapes Suivantes",[4259,4260,4261,4269,4282,4292],"ul",{},[4262,4263,4264,4268],"li",{},[4265,4266,144],"a",{"href":4267},"../recipes/mutations",": Opérations d'écriture avec mises à jour optimistes et rollback automatique",[4262,4270,4271,4274,4275,4277,4278,4281],{},[4265,4272,2783],{"href":4273},"../recipes/error-handling",": ",[352,4276,3180],{}," global et ",[352,4279,4280],{},"transformError"," par requête",[4262,4283,4284,4288,4289],{},[4265,4285,4287],{"href":4286},"../recipes/infinite-queries","Requêtes Infinies",": Pagination bi-directionnelle avec ",[352,4290,4291],{},"InfiniteQueryObserver",[4262,4293,4294,4297],{},[4265,4295,283],{"href":4296},"./with-dio",": Contrepartie REST pour les équipes utilisant REST et GraphQL",[4299,4300,4301],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":374,"searchDepth":392,"depth":392,"links":4303},[4304,4305,4308,4312,4316,4317,4318,4319],{"id":366,"depth":392,"text":98},{"id":422,"depth":392,"text":423,"children":4306},[4307],{"id":1083,"depth":405,"text":1084},{"id":1407,"depth":392,"text":1408,"children":4309},[4310,4311],{"id":1499,"depth":405,"text":1500},{"id":2061,"depth":405,"text":2062},{"id":2533,"depth":392,"text":2534,"children":4313},[4314,4315],{"id":2540,"depth":405,"text":2541},{"id":2639,"depth":405,"text":2640},{"id":2782,"depth":392,"text":2783},{"id":3241,"depth":392,"text":3242},{"id":3951,"depth":392,"text":3952},{"id":4256,"depth":392,"text":4257},"Envelopper les clients GraphQL graphql ou ferry dans des fetchers Qora pour une gestion fluide des requêtes avec stale-while-revalidate, invalidation de cache et pagination.","md",null,{},{"icon":290},{"title":287,"description":4320},"Ul-GyF7Uhe6fKPNuR9mH8AxthmCXtRCrRmuDJuxR5hc",[4328,4330],{"title":283,"path":284,"stem":285,"description":4329,"children":-1},"[object Object]",{"title":297,"path":298,"stem":299,"description":4331,"icon":300,"children":-1},"Une fonctionnalité liste-détail complète : cache SWR, état UI à deux axes avec FetchStatus, clés de requête par élément, pull-to-refresh et dégradation gracieuse. Zéro boilerplate de gestion d'état.",1794040411294]