[{"data":1,"prerenderedAt":4329},["ShallowReactive",2],{"navigation_docs_en":3,"-en-third-party-with-graphql":342,"-en-third-party-with-graphql-surround":4324},[4,45,91,137,195,236,257,291,327],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","/en/getting-started","en/01.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"What is Qora?","/en/getting-started/what-is-qora","en/01.getting-started/2.what-is-qora","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/en/getting-started/installation","en/01.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick Start","/en/getting-started/quick-start","en/01.getting-started/4.quick-start",{"title":25,"path":26,"stem":27,"icon":28},"Comparison","/en/getting-started/comparison","en/01.getting-started/5.comparison","i-lucide-scale",{"title":30,"path":31,"stem":32,"icon":33},"Coming from TanStack Query","/en/getting-started/coming-from-tanstack-query","en/01.getting-started/6.coming-from-tanstack-query","i-lucide-arrow-left-right",{"title":35,"path":36,"stem":37,"icon":38},"Migrating from Other Libraries","/en/getting-started/migrating-from-other-libraries","en/01.getting-started/7.migrating-from-other-libraries","i-lucide-arrow-right-left",{"title":40,"path":41,"stem":42,"icon":43},"AI Assistants","/en/getting-started/ai-assistants","en/01.getting-started/8.ai-assistants","i-lucide-sparkles",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Core Concepts","i-lucide-book-open","/en/core-concepts","en/02.core-concepts",[51,56,61,66,71,76,81,86],{"title":52,"path":53,"stem":54,"icon":55},"Queries","/en/core-concepts/queries","en/02.core-concepts/1.queries","i-lucide-database",{"title":57,"path":58,"stem":59,"icon":60},"Query Keys","/en/core-concepts/query-keys","en/02.core-concepts/2.query-keys","i-lucide-key-round",{"title":62,"path":63,"stem":64,"icon":65},"Query States","/en/core-concepts/query-states","en/02.core-concepts/3.query-states","i-lucide-activity",{"title":67,"path":68,"stem":69,"icon":70},"Caching","/en/core-concepts/caching","en/02.core-concepts/4.caching","i-lucide-layers-3",{"title":72,"path":73,"stem":74,"icon":75},"Stale-While-Revalidate","/en/core-concepts/stale-while-revalidate","en/02.core-concepts/5.stale-while-revalidate","i-lucide-timer-reset",{"title":77,"path":78,"stem":79,"icon":80},"Deduplication","/en/core-concepts/deduplication","en/02.core-concepts/6.deduplication","i-lucide-copy-minus",{"title":82,"path":83,"stem":84,"icon":85},"Mutations & Invalidation","/en/core-concepts/mutations","en/02.core-concepts/7.mutations","i-lucide-pencil-line",{"title":87,"path":88,"stem":89,"icon":90},"Offline & Network","/en/core-concepts/offline","en/02.core-concepts/8.offline","i-lucide-wifi-off",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":44},"Flutter Integration","i-lucide-smartphone","/en/flutter-integration","en/03.flutter-integration",[97,102,107,112,117,122,127,132],{"title":98,"path":99,"stem":100,"icon":101},"Setup","/en/flutter-integration/setup","en/03.flutter-integration/1.setup","i-lucide-wrench",{"title":103,"path":104,"stem":105,"icon":106},"QoraScope","/en/flutter-integration/qora-scope","en/03.flutter-integration/2.qora-scope","i-lucide-share-2",{"title":108,"path":109,"stem":110,"icon":111},"QoraBuilder","/en/flutter-integration/qora-builder","en/03.flutter-integration/3.qora-builder","i-lucide-blocks",{"title":113,"path":114,"stem":115,"icon":116},"QoraMutationBuilder","/en/flutter-integration/qora-mutation-builder","en/03.flutter-integration/4.qora-mutation-builder","i-lucide-pencil",{"title":118,"path":119,"stem":120,"icon":121},"InfiniteQueryBuilder","/en/flutter-integration/infinite-query-builder","en/03.flutter-integration/5.infinite-query-builder","i-lucide-infinity",{"title":123,"path":124,"stem":125,"icon":126},"Hooks (flutter_hooks)","/en/flutter-integration/hooks","en/03.flutter-integration/6.hooks","i-lucide-anchor",{"title":128,"path":129,"stem":130,"icon":131},"Network Status Widgets","/en/flutter-integration/network-status","en/03.flutter-integration/7.network-status","i-lucide-wifi",{"title":133,"path":134,"stem":135,"icon":136},"Best Practices","/en/flutter-integration/best-practices","en/03.flutter-integration/8.best-practices","i-lucide-badge-check",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":44},"Recipes","i-lucide-chef-hat","/en/recipes","en/04.recipes",[143,147,152,157,162,166,171,176,181,186,191],{"title":144,"path":145,"stem":146,"icon":85},"Mutations","/en/recipes/mutations","en/04.recipes/02.mutations",{"title":148,"path":149,"stem":150,"icon":151},"Optimistic Updates","/en/recipes/optimistic-updates","en/04.recipes/03.optimistic-updates","i-lucide-zap",{"title":153,"path":154,"stem":155,"icon":156},"Persistence","/en/recipes/persistence","en/04.recipes/04.persistence","i-lucide-hard-drive",{"title":158,"path":159,"stem":160,"icon":161},"Network Aware","/en/recipes/network-aware","en/04.recipes/05.network-aware","i-lucide-signal",{"title":163,"path":164,"stem":165,"icon":121},"Infinite Queries","/en/recipes/infinite-queries","en/04.recipes/06.infinite-queries",{"title":167,"path":168,"stem":169,"icon":170},"Dependent Queries","/en/recipes/dependent-queries","en/04.recipes/07.dependent-queries","i-lucide-link-2",{"title":172,"path":173,"stem":174,"icon":175},"Cancellation","/en/recipes/cancel-token","en/04.recipes/08.cancel-token","i-lucide-circle-slash",{"title":177,"path":178,"stem":179,"icon":180},"SSR Hydration","/en/recipes/ssr-hydration","en/04.recipes/09.ssr-hydration","i-lucide-server",{"title":182,"path":183,"stem":184,"icon":185},"Error Handling","/en/recipes/error-handling","en/04.recipes/10.error-handling","i-lucide-shield-alert",{"title":187,"path":188,"stem":189,"icon":190},"Testing","/en/recipes/testing","en/04.recipes/11.testing","i-lucide-flask-conical",{"title":192,"path":193,"stem":194},"Route-Level Prefetching","/en/recipes/prefetch","en/04.recipes/12.prefetch",{"title":196,"icon":197,"path":198,"stem":199,"children":200,"page":44},"API Reference","i-lucide-file-code","/en/api-reference","en/05.api-reference",[201,206,210,214,219,224,228,232],{"title":202,"path":203,"stem":204,"icon":205},"QoraClient","/en/api-reference/qora-client","en/05.api-reference/1.qora-client","i-lucide-cpu",{"title":207,"path":208,"stem":209,"icon":60},"QoraKey","/en/api-reference/qora-key","en/05.api-reference/2.qora-key",{"title":211,"path":212,"stem":213,"icon":65},"QoraState","/en/api-reference/qora-state","en/05.api-reference/3.qora-state",{"title":215,"path":216,"stem":217,"icon":218},"QoraOptions","/en/api-reference/qora-options","en/05.api-reference/4.qora-options","i-lucide-sliders-horizontal",{"title":220,"path":221,"stem":222,"icon":223},"QoraClientConfig","/en/api-reference/qora-client-config","en/05.api-reference/5.qora-client-config","i-lucide-settings-2",{"title":225,"path":226,"stem":227,"icon":85},"Mutation API","/en/api-reference/qora-mutation","en/05.api-reference/6.qora-mutation",{"title":229,"path":230,"stem":231,"icon":156},"PersistQoraClient","/en/api-reference/persist-qora-client","en/05.api-reference/7.persist-qora-client",{"title":233,"path":234,"stem":235,"icon":121},"Infinite Query","/en/api-reference/infinite-query","en/05.api-reference/8.infinite-query",{"title":237,"icon":238,"path":239,"stem":240,"children":241,"page":44},"DevTools","i-lucide-bug","/en/devtools","en/06.devtools",[242,247,252],{"title":243,"path":244,"stem":245,"icon":246},"Overview","/en/devtools/overview","en/06.devtools/1.overview","i-lucide-layout-dashboard",{"title":248,"path":249,"stem":250,"icon":251},"In-App Overlay","/en/devtools/overlay","en/06.devtools/2.overlay","i-lucide-layers",{"title":253,"path":254,"stem":255,"icon":256},"Data Serialization","/en/devtools/data-display","en/06.devtools/4.data-display","i-lucide-eye",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":44},"Third Party","i-lucide-puzzle","/en/third-party","en/07.third-party",[263,268,272,277,282,286],{"title":264,"path":265,"stem":266,"icon":267},"With Provider","/en/third-party/with-provider","en/07.third-party/1.with-provider","i-lucide-plug",{"title":269,"path":270,"stem":271,"icon":111},"With BLoC","/en/third-party/with-bloc","en/07.third-party/2.with-bloc",{"title":273,"path":274,"stem":275,"icon":276},"With Riverpod","/en/third-party/with-riverpod","en/07.third-party/3.with-riverpod","i-lucide-droplets",{"title":278,"path":279,"stem":280,"icon":281},"With RxDart","/en/third-party/with-rxdart","en/07.third-party/4.with-rxdart","i-lucide-git-branch",{"title":283,"path":284,"stem":285},"With Dio","/en/third-party/with-dio","en/07.third-party/5.with-dio",{"title":287,"path":288,"stem":289,"icon":290},"With GraphQL","/en/third-party/with-graphql","en/07.third-party/6.with-graphql","i-lucide-binary",{"title":292,"icon":190,"path":293,"stem":294,"children":295,"page":44},"Examples","/en/examples","en/08.examples",[296,301,305,310,314,318,322],{"title":297,"path":298,"stem":299,"icon":300},"Case Study: User List & Detail","/en/examples/basic-query","en/08.examples/1.basic-query","i-lucide-play-circle",{"title":302,"path":303,"stem":304,"icon":151},"Case Study: Optimistic Mutations & Rollback","/en/examples/mutations-optimistic","en/08.examples/2.mutations-optimistic",{"title":306,"path":307,"stem":308,"icon":309},"Case Study: Infinite Scroll Feed","/en/examples/infinite-scroll","en/08.examples/3.infinite-scroll","i-lucide-scroll",{"title":311,"path":312,"stem":313,"icon":90},"Case Study: Offline-First Todo App","/en/examples/offline-first","en/08.examples/4.offline-first",{"title":315,"path":316,"stem":317,"icon":161},"Case Study: Network Awareness","/en/examples/network-awareness","en/08.examples/5.network-awareness",{"title":319,"path":320,"stem":321,"icon":126},"Case Study: Hooks Integration","/en/examples/hooks-integration","en/08.examples/6.hooks-integration",{"title":323,"path":324,"stem":325,"icon":326},"Case Study: Complete Todo App","/en/examples/complete-todo-app","en/08.examples/7.complete-todo-app","i-lucide-check-square",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"Help","i-lucide-life-buoy","/en/help","en/09.help",[333,338],{"title":334,"path":335,"stem":336,"icon":337},"FAQ","/en/help/faq","en/09.help/1.faq","i-lucide-circle-help",{"title":339,"path":340,"stem":341,"icon":101},"Troubleshooting","/en/help/troubleshooting","en/09.help/2.troubleshooting",{"id":343,"title":287,"body":344,"description":4317,"extension":4318,"links":4319,"meta":4320,"navigation":4321,"path":288,"seo":4322,"stem":289,"__hash__":4323},"docs_en/en/07.third-party/6.with-graphql.md",{"type":345,"value":346,"toc":4299},"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,2651,2779,2781,2784,2791,3175,3181,3236,3238,3242,3245,3536,3946,3948,3952,3955,4251,4253,4257,4295],[348,349,350,351,355,356,359],"p",{},"GraphQL APIs benefit from Qora's stale-while-revalidate pattern, automatic invalidation, and normalized cache integration. This guide covers wrapping the ",[352,353,354],"code",{},"graphql"," and ",[352,357,358],{},"ferry"," packages in Qora fetchers, error handling, and pagination with cursor-based connections.",[361,362],"hr",{},[364,365,98],"h2",{"id":366},"setup",[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            # for 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","            # for ferry: gql_http_link, ferry, ferry_cache\n",[361,419],{},[364,421,423],{"id":422},"option-a-graphql-package","Option A: graphql Package",[348,425,426,427,429,430,433],{},"The ",[352,428,354],{}," package provides a ",[352,431,432],{},"GraphQLClient"," that runs queries and mutations. Wrap each operation in a Qora fetcher:",[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},"mutation-example","Mutation Example",[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-ferry-package","Option B: Ferry Package",[348,1410,1411],{},"Ferry provides a typed, code-generated GraphQL client with a built-in normalized cache. Use Qora as the caching layer for view state (UI reactivity, invalidation, SWR) while Ferry handles GraphQL transport and normalized entity storage:",[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},"query-fetcher","Query Fetcher",[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-with-optimistic-update","Mutation with Optimistic Update",[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      // Optimistic: apply the new name immediately to the cached user.\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 on failure.\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},"      // Optimistic: apply the new name immediately to the cached user.\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 on failure.\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},"normalized-cache-interaction","Normalized Cache Interaction",[348,2536,2537],{},"Qora does not replace Ferry's or Apollo's normalized cache: it lives above it. Use Qora's key-based cache for UI state (is the data fresh? should I re-fetch on mount?), while the GraphQL cache handles normalized entity storage and identity.",[1081,2539,2541],{"id":2540},"strategy","Strategy",[2543,2544,2545,2558],"table",{},[2546,2547,2548],"thead",{},[2549,2550,2551,2555],"tr",{},[2552,2553,2554],"th",{},"Layer",[2552,2556,2557],{},"Responsibility",[2559,2560,2561,2570],"tbody",{},[2549,2562,2563,2567],{},[2564,2565,2566],"td",{},"Qora cache",[2564,2568,2569],{},"SWR, invalidation, retry, polling, stale-time management",[2549,2571,2572,2575],{},[2564,2573,2574],{},"GraphQL cache (Ferry/Apollo)",[2564,2576,2577],{},"Normalized entities, data identity, deduplication of nested objects",[348,2579,2580],{},"A common pattern: after a mutation writes to the GraphQL cache, invalidate the corresponding Qora key so the widget refetches:",[368,2582,2584],{"className":436,"code":2583,"filename":1286,"language":439,"meta":374,"style":374},"onSuccess: () {\n  // The GraphQL cache is already updated. Invalidate Qora\n  // so the widget tree picks up the fresh data on next 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},"  // The GraphQL cache is already updated. Invalidate Qora\n",[378,2602,2603],{"class":380,"line":405},[378,2604,2605],{"class":416},"  // so the widget tree picks up the fresh data on next 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},"write-through-cache-with-ferry","Write-through cache with Ferry",[348,2642,2643,2644,2647,2648,2650],{},"Ferry's ",[352,2645,2646],{},"Cache.writeFragment"," can update normalized entities immediately. Combine with Qora's ",[352,2649,2355],{}," for an instant UI update:",[368,2652,2654],{"className":436,"code":2653,"filename":635,"language":439,"meta":374,"style":374},"void optimisticUpdate(String userId, String name) {\n  // Write to Ferry's normalized cache.\n  _client.cache.writeFragment(\n    GUserFragmentReq((b) => b..idFields = {'id': userId}).createRequest(),\n    {'id': userId, 'name': name, '__typename': 'User'},\n  );\n}\n",[352,2655,2656,2677,2682,2699,2735,2769,2775],{"__ignoreMap":374},[378,2657,2658,2660,2663,2665,2667,2670,2672,2674],{"class":380,"line":381},[378,2659,1306],{"class":474},[378,2661,2662],{"class":566}," optimisticUpdate",[378,2664,503],{"class":478},[378,2666,702],{"class":485},[378,2668,2669],{"class":478}," userId",[378,2671,920],{"class":388},[378,2673,1115],{"class":485},[378,2675,2676],{"class":478}," name) {\n",[378,2678,2679],{"class":380,"line":392},[378,2680,2681],{"class":416},"  // Write to Ferry's normalized cache.\n",[378,2683,2684,2687,2689,2692,2694,2697],{"class":380,"line":405},[378,2685,2686],{"class":478},"  _client",[378,2688,659],{"class":388},[378,2690,2691],{"class":478},"cache",[378,2693,659],{"class":388},[378,2695,2696],{"class":566},"writeFragment",[378,2698,489],{"class":478},[378,2700,2701,2704,2706,2708,2710,2712,2715,2717,2719,2721,2723,2726,2728,2731,2733],{"class":380,"line":471},[378,2702,2703],{"class":485},"    GUserFragmentReq",[378,2705,1576],{"class":478},[378,2707,938],{"class":388},[378,2709,1581],{"class":478},[378,2711,1584],{"class":388},[378,2713,2714],{"class":478},"idFields ",[378,2716,482],{"class":388},[378,2718,787],{"class":478},[378,2720,790],{"class":401},[378,2722,398],{"class":388},[378,2724,2725],{"class":478}," userId})",[378,2727,659],{"class":388},[378,2729,2730],{"class":566},"createRequest",[378,2732,526],{"class":478},[378,2734,512],{"class":388},[378,2736,2737,2740,2742,2744,2746,2748,2750,2752,2755,2757,2760,2762,2765,2767],{"class":380,"line":492},[378,2738,2739],{"class":478},"    {",[378,2741,790],{"class":401},[378,2743,398],{"class":388},[378,2745,2669],{"class":478},[378,2747,920],{"class":388},[378,2749,1205],{"class":401},[378,2751,398],{"class":388},[378,2753,2754],{"class":478}," name",[378,2756,920],{"class":388},[378,2758,2759],{"class":401}," '__typename'",[378,2761,398],{"class":388},[378,2763,2764],{"class":401}," 'User'",[378,2766,2634],{"class":478},[378,2768,512],{"class":388},[378,2770,2771,2773],{"class":380,"line":515},[378,2772,1223],{"class":478},[378,2774,453],{"class":388},[378,2776,2777],{"class":380,"line":531},[378,2778,888],{"class":478},[361,2780],{},[364,2782,182],{"id":2783},"error-handling",[348,2785,2786,2787,2790],{},"GraphQL errors come in two forms: transport-level exceptions and ",[352,2788,2789],{},"GraphQLError"," objects in the response body. Map both to domain errors:",[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` must return a `QoraException`, so the domain error extends it.\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}," must return a ",[378,2830,2831],{"class":2824},"`QoraException`",[378,2833,2834],{"class":416},", so the domain error extends it.\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,398],{},"Register with Qora's global ",[352,3179,3180],{},"errorMapper",[368,3182,3185],{"className":436,"code":3183,"filename":3184,"language":439,"meta":374,"style":374},"final client = QoraClient(\n  config: QoraClientConfig(\n    errorMapper: mapGraphQLError,\n  ),\n);\n","lib/core/qora_setup.dart",[352,3186,3187,3201,3213,3224,3230],{"__ignoreMap":374},[378,3188,3189,3191,3194,3196,3199],{"class":380,"line":381},[378,3190,475],{"class":474},[378,3192,3193],{"class":478}," client ",[378,3195,482],{"class":388},[378,3197,3198],{"class":485}," QoraClient",[378,3200,489],{"class":478},[378,3202,3203,3206,3208,3211],{"class":380,"line":392},[378,3204,3205],{"class":478},"  config",[378,3207,398],{"class":388},[378,3209,3210],{"class":485}," QoraClientConfig",[378,3212,489],{"class":478},[378,3214,3215,3218,3220,3222],{"class":380,"line":405},[378,3216,3217],{"class":478},"    errorMapper",[378,3219,398],{"class":388},[378,3221,2917],{"class":478},[378,3223,512],{"class":388},[378,3225,3226,3228],{"class":380,"line":471},[378,3227,1223],{"class":478},[378,3229,512],{"class":388},[378,3231,3232,3234],{"class":380,"line":492},[378,3233,509],{"class":478},[378,3235,453],{"class":388},[361,3237],{},[364,3239,3241],{"id":3240},"cursor-based-pagination","Cursor-Based Pagination",[348,3243,3244],{},"Use Qora's pagination support with cursor-based connections:",[368,3246,3248],{"className":436,"code":3247,"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,3249,3250,3290,3306,3320,3337,3361,3365,3389,3393,3412,3431,3441,3468,3472,3481,3493,3510,3526,3532],{"__ignoreMap":374},[378,3251,3252,3254,3256,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283,3286,3288],{"class":380,"line":381},[378,3253,1094],{"class":485},[378,3255,688],{"class":478},[378,3257,3258],{"class":485},"Connection",[378,3260,688],{"class":478},[378,3262,691],{"class":485},[378,3264,1716],{"class":478},[378,3266,1719],{"class":566},[378,3268,1722],{"class":478},[378,3270,1725],{"class":485},[378,3272,1728],{"class":478},[378,3274,482],{"class":388},[378,3276,1733],{"class":446},[378,3278,920],{"class":388},[378,3280,1115],{"class":485},[378,3282,1740],{"class":388},[378,3284,3285],{"class":478}," after}) ",[378,3287,709],{"class":708},[378,3289,648],{"class":478},[378,3291,3292,3294,3296,3298,3300,3302,3304],{"class":380,"line":392},[378,3293,669],{"class":474},[378,3295,1568],{"class":478},[378,3297,482],{"class":388},[378,3299,1758],{"class":485},[378,3301,1576],{"class":478},[378,3303,938],{"class":388},[378,3305,1765],{"class":478},[378,3307,3308,3310,3312,3314,3316,3318],{"class":380,"line":405},[378,3309,2118],{"class":388},[378,3311,1587],{"class":478},[378,3313,659],{"class":388},[378,3315,1777],{"class":478},[378,3317,482],{"class":388},[378,3319,1782],{"class":478},[378,3321,3322,3324,3326,3328,3330,3332,3335],{"class":380,"line":471},[378,3323,2118],{"class":388},[378,3325,1587],{"class":478},[378,3327,659],{"class":388},[378,3329,1793],{"class":478},[378,3331,482],{"class":388},[378,3333,3334],{"class":478}," after)",[378,3336,453],{"class":388},[378,3338,3339,3341,3343,3345,3347,3349,3351,3353,3355,3357,3359],{"class":380,"line":492},[378,3340,669],{"class":474},[378,3342,719],{"class":478},[378,3344,482],{"class":388},[378,3346,724],{"class":708},[378,3348,674],{"class":478},[378,3350,659],{"class":388},[378,3352,1616],{"class":566},[378,3354,1619],{"class":478},[378,3356,659],{"class":388},[378,3358,1624],{"class":478},[378,3360,453],{"class":388},[378,3362,3363],{"class":380,"line":515},[378,3364,468],{"emptyLinePlaceholder":467},[378,3366,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385,3387],{"class":380,"line":531},[378,3368,1234],{"class":708},[378,3370,823],{"class":478},[378,3372,659],{"class":388},[378,3374,1841],{"class":478},[378,3376,831],{"class":708},[378,3378,834],{"class":478},[378,3380,659],{"class":388},[378,3382,1653],{"class":478},[378,3384,1656],{"class":388},[378,3386,1624],{"class":478},[378,3388,453],{"class":388},[378,3390,3391],{"class":380,"line":538},[378,3392,468],{"emptyLinePlaceholder":467},[378,3394,3395,3397,3400,3402,3404,3406,3408,3410],{"class":380,"line":543},[378,3396,669],{"class":474},[378,3398,3399],{"class":478}," users ",[378,3401,482],{"class":388},[378,3403,834],{"class":478},[378,3405,659],{"class":388},[378,3407,863],{"class":478},[378,3409,1656],{"class":388},[378,3411,1876],{"class":478},[378,3413,3414,3417,3419,3421,3423,3425,3427,3429],{"class":380,"line":558},[378,3415,3416],{"class":388},"      .",[378,3418,1885],{"class":566},[378,3420,1888],{"class":478},[378,3422,938],{"class":388},[378,3424,850],{"class":485},[378,3426,659],{"class":388},[378,3428,1679],{"class":566},[378,3430,1899],{"class":478},[378,3432,3433,3435,3437,3439],{"class":380,"line":575},[378,3434,3416],{"class":388},[378,3436,1907],{"class":566},[378,3438,526],{"class":478},[378,3440,453],{"class":388},[378,3442,3443,3445,3448,3450,3452,3454,3456,3458,3461,3463,3466],{"class":380,"line":581},[378,3444,669],{"class":474},[378,3446,3447],{"class":478}," pageInfo ",[378,3449,482],{"class":388},[378,3451,834],{"class":478},[378,3453,659],{"class":388},[378,3455,863],{"class":478},[378,3457,1656],{"class":388},[378,3459,3460],{"class":478},"usersConnection",[378,3462,659],{"class":388},[378,3464,3465],{"class":478},"pageInfo",[378,3467,453],{"class":388},[378,3469,3470],{"class":380,"line":587},[378,3471,468],{"emptyLinePlaceholder":467},[378,3473,3474,3476,3479],{"class":380,"line":593},[378,3475,1255],{"class":708},[378,3477,3478],{"class":485}," Connection",[378,3480,489],{"class":478},[378,3482,3483,3486,3488,3491],{"class":380,"line":599},[378,3484,3485],{"class":478},"    nodes",[378,3487,398],{"class":388},[378,3489,3490],{"class":478}," users",[378,3492,512],{"class":388},[378,3494,3495,3498,3500,3503,3505,3508],{"class":380,"line":605},[378,3496,3497],{"class":478},"    hasNextPage",[378,3499,398],{"class":388},[378,3501,3502],{"class":478}," pageInfo",[378,3504,659],{"class":388},[378,3506,3507],{"class":478},"hasNextPage",[378,3509,512],{"class":388},[378,3511,3512,3515,3517,3519,3521,3524],{"class":380,"line":611},[378,3513,3514],{"class":478},"    endCursor",[378,3516,398],{"class":388},[378,3518,3502],{"class":478},[378,3520,659],{"class":388},[378,3522,3523],{"class":478},"endCursor",[378,3525,512],{"class":388},[378,3527,3528,3530],{"class":380,"line":617},[378,3529,1223],{"class":478},[378,3531,453],{"class":388},[378,3533,3534],{"class":380,"line":627},[378,3535,888],{"class":478},[368,3537,3539],{"className":436,"code":3538,"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('Load more'),\n              );\n            }\n            return UserTile(users[i]);\n          },\n        );\n      },\n    );\n  }\n}\n",[352,3540,3541,3561,3565,3585,3597,3601,3606,3622,3639,3661,3688,3697,3715,3743,3758,3780,3795,3813,3823,3843,3863,3884,3891,3896,3909,3916,3923,3930,3936,3941],{"__ignoreMap":374},[378,3542,3543,3545,3548,3550,3553,3556,3558],{"class":380,"line":381},[378,3544,642],{"class":388},[378,3546,3547],{"class":485}," UserListScreen",[378,3549,2844],{"class":388},[378,3551,3552],{"class":485}," StatefulWidget",[378,3554,3555],{"class":478}," { ",[378,3557,1393],{"class":388},[378,3559,3560],{"class":478}," }\n",[378,3562,3563],{"class":380,"line":392},[378,3564,468],{"emptyLinePlaceholder":467},[378,3566,3567,3569,3572,3574,3577,3579,3582],{"class":380,"line":405},[378,3568,642],{"class":388},[378,3570,3571],{"class":485}," _UserListScreenState",[378,3573,2844],{"class":388},[378,3575,3576],{"class":485}," State",[378,3578,688],{"class":478},[378,3580,3581],{"class":485},"UserListScreen",[378,3583,3584],{"class":478},"> {\n",[378,3586,3587,3590,3592,3595],{"class":380,"line":471},[378,3588,3589],{"class":485},"  String",[378,3591,1740],{"class":388},[378,3593,3594],{"class":478}," _cursor",[378,3596,453],{"class":388},[378,3598,3599],{"class":380,"line":492},[378,3600,468],{"emptyLinePlaceholder":467},[378,3602,3603],{"class":380,"line":515},[378,3604,3605],{"class":474},"  @override\n",[378,3607,3608,3611,3614,3616,3619],{"class":380,"line":531},[378,3609,3610],{"class":485},"  Widget",[378,3612,3613],{"class":566}," build",[378,3615,503],{"class":478},[378,3617,3618],{"class":485},"BuildContext",[378,3620,3621],{"class":478}," context) {\n",[378,3623,3624,3626,3629,3631,3633,3635,3637],{"class":380,"line":538},[378,3625,847],{"class":708},[378,3627,3628],{"class":485}," QoraBuilder",[378,3630,688],{"class":478},[378,3632,3258],{"class":485},[378,3634,688],{"class":478},[378,3636,691],{"class":485},[378,3638,1942],{"class":478},[378,3640,3641,3644,3646,3648,3650,3652,3654,3656,3659],{"class":380,"line":543},[378,3642,3643],{"class":478},"      queryKey",[378,3645,398],{"class":388},[378,3647,915],{"class":478},[378,3649,1953],{"class":401},[378,3651,920],{"class":388},[378,3653,1733],{"class":446},[378,3655,920],{"class":388},[378,3657,3658],{"class":478}," _cursor]",[378,3660,512],{"class":388},[378,3662,3663,3666,3668,3670,3672,3674,3676,3678,3681,3683,3686],{"class":380,"line":558},[378,3664,3665],{"class":478},"      fetcher",[378,3667,398],{"class":388},[378,3669,935],{"class":478},[378,3671,938],{"class":388},[378,3673,941],{"class":478},[378,3675,659],{"class":388},[378,3677,1719],{"class":566},[378,3679,3680],{"class":478},"(after",[378,3682,398],{"class":388},[378,3684,3685],{"class":478}," _cursor)",[378,3687,512],{"class":388},[378,3689,3690,3693,3695],{"class":380,"line":575},[378,3691,3692],{"class":478},"      keepPreviousData",[378,3694,398],{"class":388},[378,3696,3090],{"class":388},[378,3698,3699,3702,3704,3706,3708,3710,3712],{"class":380,"line":581},[378,3700,3701],{"class":478},"      builder",[378,3703,398],{"class":388},[378,3705,960],{"class":478},[378,3707,920],{"class":388},[378,3709,965],{"class":478},[378,3711,920],{"class":388},[378,3713,3714],{"class":478}," _) {\n",[378,3716,3717,3720,3722,3724,3726,3728,3731,3733,3736,3738,3741],{"class":380,"line":587},[378,3718,3719],{"class":474},"        final",[378,3721,3399],{"class":478},[378,3723,482],{"class":388},[378,3725,965],{"class":478},[378,3727,659],{"class":388},[378,3729,3730],{"class":478},"dataOrNull",[378,3732,2374],{"class":388},[378,3734,3735],{"class":478},"nodes ",[378,3737,2387],{"class":388},[378,3739,3740],{"class":478}," []",[378,3742,453],{"class":388},[378,3744,3745,3748,3751,3753,3756],{"class":380,"line":593},[378,3746,3747],{"class":708},"        return",[378,3749,3750],{"class":485}," ListView",[378,3752,659],{"class":388},[378,3754,3755],{"class":566},"builder",[378,3757,489],{"class":478},[378,3759,3760,3763,3765,3767,3769,3772,3775,3778],{"class":380,"line":599},[378,3761,3762],{"class":478},"          itemCount",[378,3764,398],{"class":388},[378,3766,3490],{"class":478},[378,3768,659],{"class":388},[378,3770,3771],{"class":478},"length ",[378,3773,3774],{"class":388},"+",[378,3776,3777],{"class":446}," 1",[378,3779,512],{"class":388},[378,3781,3782,3785,3787,3790,3792],{"class":380,"line":605},[378,3783,3784],{"class":478},"          itemBuilder",[378,3786,398],{"class":388},[378,3788,3789],{"class":478}," (_",[378,3791,920],{"class":388},[378,3793,3794],{"class":478}," i) {\n",[378,3796,3797,3800,3803,3806,3808,3810],{"class":380,"line":611},[378,3798,3799],{"class":708},"            if",[378,3801,3802],{"class":478}," (i ",[378,3804,3805],{"class":388},"==",[378,3807,3490],{"class":478},[378,3809,659],{"class":388},[378,3811,3812],{"class":478},"length) {\n",[378,3814,3815,3818,3821],{"class":380,"line":617},[378,3816,3817],{"class":708},"              return",[378,3819,3820],{"class":485}," TextButton",[378,3822,489],{"class":478},[378,3824,3825,3828,3830,3832,3834,3837,3840],{"class":380,"line":627},[378,3826,3827],{"class":478},"                onPressed",[378,3829,398],{"class":388},[378,3831,935],{"class":478},[378,3833,938],{"class":388},[378,3835,3836],{"class":566}," setState",[378,3838,3839],{"class":478},"(() ",[378,3841,3842],{"class":388},"=>\n",[378,3844,3845,3848,3850,3852,3854,3856,3858,3861],{"class":380,"line":885},[378,3846,3847],{"class":478},"                    _cursor ",[378,3849,482],{"class":388},[378,3851,965],{"class":478},[378,3853,659],{"class":388},[378,3855,3730],{"class":478},[378,3857,2374],{"class":388},[378,3859,3860],{"class":478},"endCursor)",[378,3862,512],{"class":388},[378,3864,3865,3868,3870,3872,3875,3877,3880,3882],{"class":380,"line":1827},[378,3866,3867],{"class":478},"                child",[378,3869,398],{"class":388},[378,3871,1015],{"class":474},[378,3873,3874],{"class":485}," Text",[378,3876,503],{"class":478},[378,3878,3879],{"class":401},"'Load more'",[378,3881,509],{"class":478},[378,3883,512],{"class":388},[378,3885,3886,3889],{"class":380,"line":1832},[378,3887,3888],{"class":478},"              )",[378,3890,453],{"class":388},[378,3892,3893],{"class":380,"line":1858},[378,3894,3895],{"class":478},"            }\n",[378,3897,3898,3901,3904,3907],{"class":380,"line":1863},[378,3899,3900],{"class":708},"            return",[378,3902,3903],{"class":485}," UserTile",[378,3905,3906],{"class":478},"(users[i])",[378,3908,453],{"class":388},[378,3910,3911,3914],{"class":380,"line":1879},[378,3912,3913],{"class":478},"          }",[378,3915,512],{"class":388},[378,3917,3918,3921],{"class":380,"line":1902},[378,3919,3920],{"class":478},"        )",[378,3922,453],{"class":388},[378,3924,3925,3928],{"class":380,"line":1914},[378,3926,3927],{"class":478},"      }",[378,3929,512],{"class":388},[378,3931,3932,3934],{"class":380,"line":1919},[378,3933,809],{"class":478},[378,3935,453],{"class":388},[378,3937,3939],{"class":380,"line":3938},29,[378,3940,882],{"class":478},[378,3942,3944],{"class":380,"line":3943},30,[378,3945,888],{"class":478},[361,3947],{},[364,3949,3951],{"id":3950},"testing-graphql-fetchers","Testing GraphQL Fetchers",[348,3953,3954],{},"Mock the GraphQL client transport link to avoid real network calls:",[368,3956,3959],{"className":436,"code":3957,"filename":3958,"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(), // implements Link\n      cache: GraphQLCache(),\n    );\n    client = QoraClient();\n  });\n\n  test('fetcher returns parsed User on success', () 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,3960,3961,3969,3977,3986,3990,4000,4012,4023,4027,4035,4046,4063,4076,4082,4095,4102,4106,4124,4140,4163,4184,4210,4216,4220,4241,4247],{"__ignoreMap":374},[378,3962,3963,3965,3967],{"class":380,"line":381},[378,3964,447],{"class":446},[378,3966,450],{"class":401},[378,3968,453],{"class":388},[378,3970,3971,3973,3975],{"class":380,"line":392},[378,3972,447],{"class":446},[378,3974,460],{"class":401},[378,3976,453],{"class":388},[378,3978,3979,3981,3984],{"class":380,"line":405},[378,3980,447],{"class":446},[378,3982,3983],{"class":401}," 'package:test/test.dart'",[378,3985,453],{"class":388},[378,3987,3988],{"class":380,"line":471},[378,3989,468],{"emptyLinePlaceholder":467},[378,3991,3992,3994,3997],{"class":380,"line":492},[378,3993,1306],{"class":474},[378,3995,3996],{"class":566}," main",[378,3998,3999],{"class":478},"() {\n",[378,4001,4002,4005,4007,4010],{"class":380,"line":515},[378,4003,4004],{"class":474},"  late",[378,4006,486],{"class":485},[378,4008,4009],{"class":478}," gqlClient",[378,4011,453],{"class":388},[378,4013,4014,4016,4018,4021],{"class":380,"line":531},[378,4015,4004],{"class":474},[378,4017,3198],{"class":485},[378,4019,4020],{"class":478}," client",[378,4022,453],{"class":388},[378,4024,4025],{"class":380,"line":538},[378,4026,468],{"emptyLinePlaceholder":467},[378,4028,4029,4032],{"class":380,"line":543},[378,4030,4031],{"class":566},"  setUp",[378,4033,4034],{"class":478},"(() {\n",[378,4036,4037,4040,4042,4044],{"class":380,"line":558},[378,4038,4039],{"class":478},"    gqlClient ",[378,4041,482],{"class":388},[378,4043,486],{"class":485},[378,4045,489],{"class":478},[378,4047,4048,4051,4053,4056,4058,4060],{"class":380,"line":575},[378,4049,4050],{"class":478},"      link",[378,4052,398],{"class":388},[378,4054,4055],{"class":485}," _MockLink",[378,4057,526],{"class":478},[378,4059,920],{"class":388},[378,4061,4062],{"class":416}," // implements Link\n",[378,4064,4065,4068,4070,4072,4074],{"class":380,"line":581},[378,4066,4067],{"class":478},"      cache",[378,4069,398],{"class":388},[378,4071,523],{"class":485},[378,4073,526],{"class":478},[378,4075,512],{"class":388},[378,4077,4078,4080],{"class":380,"line":587},[378,4079,809],{"class":478},[378,4081,453],{"class":388},[378,4083,4084,4087,4089,4091,4093],{"class":380,"line":593},[378,4085,4086],{"class":478},"    client ",[378,4088,482],{"class":388},[378,4090,3198],{"class":485},[378,4092,526],{"class":478},[378,4094,453],{"class":388},[378,4096,4097,4100],{"class":380,"line":599},[378,4098,4099],{"class":478},"  })",[378,4101,453],{"class":388},[378,4103,4104],{"class":380,"line":605},[378,4105,468],{"emptyLinePlaceholder":467},[378,4107,4108,4111,4113,4116,4118,4120,4122],{"class":380,"line":611},[378,4109,4110],{"class":566},"  test",[378,4112,503],{"class":478},[378,4114,4115],{"class":401},"'fetcher returns parsed User on success'",[378,4117,920],{"class":388},[378,4119,935],{"class":478},[378,4121,709],{"class":708},[378,4123,648],{"class":478},[378,4125,4126,4128,4131,4133,4135,4138],{"class":380,"line":617},[378,4127,716],{"class":474},[378,4129,4130],{"class":478}," api ",[378,4132,482],{"class":388},[378,4134,645],{"class":485},[378,4136,4137],{"class":478},"(gqlClient)",[378,4139,453],{"class":388},[378,4141,4142,4144,4146,4148,4150,4152,4154,4157,4159,4161],{"class":380,"line":627},[378,4143,716],{"class":474},[378,4145,719],{"class":478},[378,4147,482],{"class":388},[378,4149,724],{"class":708},[378,4151,4020],{"class":478},[378,4153,659],{"class":388},[378,4155,4156],{"class":566},"fetchQuery",[378,4158,688],{"class":478},[378,4160,691],{"class":485},[378,4162,905],{"class":478},[378,4164,4165,4168,4170,4172,4174,4176,4179,4182],{"class":380,"line":885},[378,4166,4167],{"class":478},"      key",[378,4169,398],{"class":388},[378,4171,915],{"class":478},[378,4173,872],{"class":401},[378,4175,920],{"class":388},[378,4177,4178],{"class":401}," '1'",[378,4180,4181],{"class":478},"]",[378,4183,512],{"class":388},[378,4185,4186,4188,4190,4192,4194,4197,4199,4201,4203,4206,4208],{"class":380,"line":1827},[378,4187,3665],{"class":478},[378,4189,398],{"class":388},[378,4191,935],{"class":478},[378,4193,938],{"class":388},[378,4195,4196],{"class":478}," api",[378,4198,659],{"class":388},[378,4200,697],{"class":566},[378,4202,503],{"class":478},[378,4204,4205],{"class":401},"'1'",[378,4207,509],{"class":478},[378,4209,512],{"class":388},[378,4211,4212,4214],{"class":380,"line":1832},[378,4213,809],{"class":478},[378,4215,453],{"class":388},[378,4217,4218],{"class":380,"line":1858},[378,4219,468],{"emptyLinePlaceholder":467},[378,4221,4222,4225,4227,4229,4232,4234,4237,4239],{"class":380,"line":1863},[378,4223,4224],{"class":566},"    expect",[378,4226,858],{"class":478},[378,4228,659],{"class":388},[378,4230,4231],{"class":478},"name",[378,4233,920],{"class":388},[378,4235,4236],{"class":401}," 'Test User'",[378,4238,509],{"class":478},[378,4240,453],{"class":388},[378,4242,4243,4245],{"class":380,"line":1879},[378,4244,4099],{"class":478},[378,4246,453],{"class":388},[378,4248,4249],{"class":380,"line":1902},[378,4250,888],{"class":478},[361,4252],{},[364,4254,4256],{"id":4255},"next-steps","Next Steps",[4258,4259,4260,4268,4280,4289],"ul",{},[4261,4262,4263,4267],"li",{},[4264,4265,144],"a",{"href":4266},"../recipes/mutations",": Write operations with optimistic updates and automatic rollback",[4261,4269,4270,4273,4274,4276,4277],{},[4264,4271,182],{"href":4272},"../recipes/error-handling",": Global ",[352,4275,3180],{}," and per-query ",[352,4278,4279],{},"transformError",[4261,4281,4282,4285,4286],{},[4264,4283,163],{"href":4284},"../recipes/infinite-queries",": Proper bi-directional pagination with ",[352,4287,4288],{},"InfiniteQueryObserver",[4261,4290,4291,4294],{},[4264,4292,283],{"href":4293},"./with-dio",": REST counterpart for teams using both REST and GraphQL",[4296,4297,4298],"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":4300},[4301,4302,4305,4309,4313,4314,4315,4316],{"id":366,"depth":392,"text":98},{"id":422,"depth":392,"text":423,"children":4303},[4304],{"id":1083,"depth":405,"text":1084},{"id":1407,"depth":392,"text":1408,"children":4306},[4307,4308],{"id":1499,"depth":405,"text":1500},{"id":2061,"depth":405,"text":2062},{"id":2533,"depth":392,"text":2534,"children":4310},[4311,4312],{"id":2540,"depth":405,"text":2541},{"id":2639,"depth":405,"text":2640},{"id":2783,"depth":392,"text":182},{"id":3240,"depth":392,"text":3241},{"id":3950,"depth":392,"text":3951},{"id":4255,"depth":392,"text":4256},"Wrap graphql or ferry GraphQL clients in Qora fetchers for seamless query management with stale-while-revalidate, cache invalidation, and pagination.","md",null,{},{"icon":290},{"title":287,"description":4317},"EZg7rc7RylDmxl5ZVHeHxEluDVR2tn1JYc48PNVgEOQ",[4325,4327],{"title":283,"path":284,"stem":285,"description":4326,"children":-1},"[object Object]",{"title":297,"path":298,"stem":299,"description":4328,"icon":300,"children":-1},"A complete list-and-detail feature: SWR caching, FetchStatus two-axis state, per-item query keys, pull-to-refresh, and graceful degradation. Zero boilerplate state management.",1794040402508]