[{"data":1,"prerenderedAt":696},["ShallowReactive",2],{"fougere:post.list:{}":3,"reference:\u002Freference\u002Fpackages\u002Fadapter-graphql":6,"reference-pages":477},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":19,"extension":470,"file":471,"meta":472,"navigation":156,"path":473,"seo":474,"stem":475,"__hash__":476},"reference\u002Freference\u002Fpackages\u002Fadapter-graphql.md","@fougere\u002Fadapter-graphql",{"type":10,"value":11,"toc":464},"minimark",[12,16,20,25,118,213,216,285,294,298,309,352,361,365,418,422,429,460],[13,14,8],"h1",{"id":15},"fougereadapter-graphql",[17,18,19],"p",{},"Entity → GraphQL types, inputs and CRUD, through Pothos.",[21,22,24],"h2",{"id":23},"use-it","Use it",[26,27,31,63,82,100],"code-group",{"className":28,"sync":30},[29],"managers","pm",[32,33,39],"pre",{"className":34,"code":35,"filename":36,"language":37,"meta":38,"style":38},"language-bash shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","npm install @fougere\u002Fadapter-graphql @pothos\u002Fcore graphql\n","npm","bash","",[40,41,42],"code",{"__ignoreMap":38},[43,44,47,50,54,57,60],"span",{"class":45,"line":46},"line",1,[43,48,36],{"class":49},"sV8pK",[43,51,53],{"class":52},"sN-8n"," install",[43,55,56],{"class":52}," @fougere\u002Fadapter-graphql",[43,58,59],{"class":52}," @pothos\u002Fcore",[43,61,62],{"class":52}," graphql\n",[32,64,67],{"className":34,"code":65,"filename":66,"language":37,"meta":38,"style":38},"pnpm add @fougere\u002Fadapter-graphql @pothos\u002Fcore graphql\n","pnpm",[40,68,69],{"__ignoreMap":38},[43,70,71,73,76,78,80],{"class":45,"line":46},[43,72,66],{"class":49},[43,74,75],{"class":52}," add",[43,77,56],{"class":52},[43,79,59],{"class":52},[43,81,62],{"class":52},[32,83,86],{"className":34,"code":84,"filename":85,"language":37,"meta":38,"style":38},"bun add @fougere\u002Fadapter-graphql @pothos\u002Fcore graphql\n","bun",[40,87,88],{"__ignoreMap":38},[43,89,90,92,94,96,98],{"class":45,"line":46},[43,91,85],{"class":49},[43,93,75],{"class":52},[43,95,56],{"class":52},[43,97,59],{"class":52},[43,99,62],{"class":52},[32,101,104],{"className":34,"code":102,"filename":103,"language":37,"meta":38,"style":38},"yarn add @fougere\u002Fadapter-graphql @pothos\u002Fcore graphql\n","yarn",[40,105,106],{"__ignoreMap":38},[43,107,108,110,112,114,116],{"class":45,"line":46},[43,109,103],{"class":49},[43,111,75],{"class":52},[43,113,56],{"class":52},[43,115,59],{"class":52},[43,117,62],{"class":52},[32,119,123],{"className":120,"code":121,"language":122,"meta":38,"style":38},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F fougere.config.ts\nimport '@fougere\u002Fadapter-graphql';\n\nexport default defineFougere({\n  protocols: { graphql: {} },\n});\n","ts",[40,124,125,131,151,158,178,202],{"__ignoreMap":38},[43,126,127],{"class":45,"line":46},[43,128,130],{"class":129},"skXKP","\u002F\u002F fougere.config.ts\n",[43,132,134,138,142,144,147],{"class":45,"line":133},2,[43,135,137],{"class":136},"sK6XW","import",[43,139,141],{"class":140},"sDDC1"," '",[43,143,8],{"class":52},[43,145,146],{"class":140},"'",[43,148,150],{"class":149},"s15xx",";\n",[43,152,154],{"class":45,"line":153},3,[43,155,157],{"emptyLinePlaceholder":156},true,"\n",[43,159,161,164,167,171,175],{"class":45,"line":160},4,[43,162,163],{"class":136},"export",[43,165,166],{"class":136}," default",[43,168,170],{"class":169},"s4mR9"," defineFougere",[43,172,174],{"class":173},"srlTG","(",[43,176,177],{"class":149},"{\n",[43,179,181,185,188,191,194,196,199],{"class":45,"line":180},5,[43,182,184],{"class":183},"sHtqg","  protocols",[43,186,187],{"class":149},":",[43,189,190],{"class":149}," {",[43,192,193],{"class":183}," graphql",[43,195,187],{"class":149},[43,197,198],{"class":149}," {}",[43,200,201],{"class":149}," },\n",[43,203,205,208,211],{"class":45,"line":204},6,[43,206,207],{"class":149},"}",[43,209,210],{"class":173},")",[43,212,150],{"class":149},[17,214,215],{},"The import is what makes the word exist: without it, the editor and the boot both refuse it.",[32,217,219],{"className":120,"code":218,"language":122,"meta":38,"style":38},"\u002F\u002F fronds\u002Fblog\u002Ffrond.config.ts\nexport default defineFrond({\n  operations: { 'post.list': { graphql: { … } } },\n});\n",[40,220,221,226,239,277],{"__ignoreMap":38},[43,222,223],{"class":45,"line":46},[43,224,225],{"class":129},"\u002F\u002F fronds\u002Fblog\u002Ffrond.config.ts\n",[43,227,228,230,232,235,237],{"class":45,"line":133},[43,229,163],{"class":136},[43,231,166],{"class":136},[43,233,234],{"class":169}," defineFrond",[43,236,174],{"class":173},[43,238,177],{"class":149},[43,240,241,244,246,248,250,254,256,258,260,262,264,266,270,272,275],{"class":45,"line":153},[43,242,243],{"class":183},"  operations",[43,245,187],{"class":149},[43,247,190],{"class":149},[43,249,141],{"class":140},[43,251,253],{"class":252},"sK7Y8","post.list",[43,255,146],{"class":140},[43,257,187],{"class":149},[43,259,190],{"class":149},[43,261,193],{"class":183},[43,263,187],{"class":149},[43,265,190],{"class":149},[43,267,269],{"class":268},"sPEhv"," … ",[43,271,207],{"class":149},[43,273,274],{"class":149}," }",[43,276,201],{"class":149},[43,278,279,281,283],{"class":45,"line":160},[43,280,207],{"class":149},[43,282,210],{"class":173},[43,284,150],{"class":149},[17,286,287,288,293],{},"Every key each one admits: ",[289,290,292],"a",{"href":291},"\u002Freference\u002Fprotocols","protocols",".",[21,295,297],{"id":296},"what-it-extends","What it extends",[17,299,300,301,304,305,293],{},"The interfaces of Fougere this package adds its words to, with ",[40,302,303],{},"declare module"," — see ",[289,306,308],{"href":307},"\u002Freference\u002Finterfaces","Interfaces to extend",[310,311,312,325],"table",{},[313,314,315],"thead",{},[316,317,318,322],"tr",{},[319,320,321],"th",{},"interface",[319,323,324],{},"adds",[326,327,328,341],"tbody",{},[316,329,330,336],{},[331,332,333],"td",{},[40,334,335],{},"FougereProtocols",[331,337,338],{},[40,339,340],{},"graphql",[316,342,343,348],{},[331,344,345],{},[40,346,347],{},"FougereOperationProtocols",[331,349,350],{},[40,351,340],{},[17,353,354,355,357,358],{},"Entries: ",[40,356,8],{}," · ",[40,359,360],{},"@fougere\u002Fadapter-graphql\u002Fpothos",[21,362,364],{"id":363},"what-you-import","What you import",[310,366,367,376],{},[313,368,369],{},[316,370,371,374],{},[319,372,373],{},"name",[319,375],{},[326,377,378,388,398,408],{},[316,379,380,385],{},[331,381,382],{},[40,383,384],{},"registerAll",[331,386,387],{},"Auto-register GraphQL types and operations from a fougere App.",[316,389,390,395],{},[331,391,392],{},[40,393,394],{},"schemaOf",[331,396,397],{},"The app's schema, derived and kept.",[316,399,400,405],{},[331,401,402],{},[40,403,404],{},"executeOn",[331,406,407],{},"Execute a query against the app's own operations.",[316,409,410,415],{},[331,411,412],{},[40,413,414],{},"graphqlDoor",[331,416,417],{},"GraphQL's door over one schema: one call per root field and per relation, all within this request.",[21,419,421],{"id":420},"types","Types",[17,423,424,425,428],{},"TypeScript types only — they do not run. Import them with ",[40,426,427],{},"import type"," to type your own code: a variable, a parameter, an option object.",[310,430,431,439],{},[313,432,433],{},[316,434,435,437],{},[319,436,373],{},[319,438],{},[326,440,441,450],{},[316,442,443,448],{},[331,444,445],{},[40,446,447],{},"GraphQLDocument",[331,449],{},[316,451,452,457],{},[331,453,454],{},[40,455,456],{},"GraphQLReceived",[331,458,459],{},"What a host hands the GraphQL door — the document still to read, so the door reads it.",[461,462,463],"style",{},"html pre.shiki code .sV8pK, html code.shiki .sV8pK{--shiki-light:#E2931D;--shiki-default:#C9B6EA;--shiki-dark:#FFCB6B}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}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 .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .sK7Y8, html code.shiki .sK7Y8{--shiki-light:#E53935;--shiki-default:#EE9F6B;--shiki-dark:#F07178}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}",{"title":38,"searchDepth":133,"depth":133,"links":465},[466,467,468,469],{"id":23,"depth":133,"text":24},{"id":296,"depth":133,"text":297},{"id":363,"depth":133,"text":364},{"id":420,"depth":133,"text":421},"md",null,{},"\u002Freference\u002Fpackages\u002Fadapter-graphql",{"title":8,"description":19},"reference\u002Fpackages\u002Fadapter-graphql","MB8qxJsBi4U7Xv4cpbo1O_K47N8A8z22pJzh345AU8Q",[478,483,488,493,498,503,507,512,517,522,525,530,535,540,545,546,551,556,561,566,571,576,581,586,591,596,601,606,611,616,621,626,631,636,641,646,651,656,661,666,671,676,681,686,691],{"path":479,"title":480,"description":481,"stem":482},"\u002Freference\u002Fcli","CLI","fougere new, serve, call, sync, graph — composing a workspace, hosting one frond, invoking an operation from a shell.","reference\u002F01.cli",{"path":484,"title":485,"description":486,"stem":487},"\u002Freference\u002Ferrors","Error codes","Every code an operation can refuse with, and its HTTP status.","reference\u002F02.errors",{"path":489,"title":490,"description":491,"stem":492},"\u002Freference\u002Fconfig","fougere.config.ts","Every key the app config admits, and which package answers each one.","reference\u002F03.config",{"path":494,"title":495,"description":496,"stem":497},"\u002Freference\u002Ffrond-config","frond.config.ts","Every key a frond's own config admits.","reference\u002F04.frond-config",{"path":499,"title":500,"description":501,"stem":502},"\u002Freference\u002Fsources","Source types","Every type an entry of sources: may name, and the keys it admits.","reference\u002F05.sources",{"path":291,"title":504,"description":505,"stem":506},"Protocols","What protocols: may serve, and what each admits.","reference\u002F06.protocols",{"path":508,"title":509,"description":510,"stem":511},"\u002Freference\u002Fstates","State keepers","How state: may keep a caller's values.","reference\u002F07.states",{"path":513,"title":514,"description":515,"stem":516},"\u002Freference\u002Fforms","Forms","The types a frond is written with — each one read by the scan.","reference\u002F08.forms",{"path":518,"title":519,"description":520,"stem":521},"\u002Freference\u002Fports","Ports Fougere opens","The classes you stand in front of, or extend, to change what the framework does.","reference\u002F09.ports",{"path":307,"title":308,"description":523,"stem":524},"The empty interfaces a package augments with declare module, and who augments each.","reference\u002F10.interfaces",{"path":526,"title":527,"description":528,"stem":529},"\u002Freference\u002Fdiagnostics","Boot and check diagnostics","Every code a boot, the scan or fougere check can raise, and what it says.","reference\u002F11.diagnostics",{"path":531,"title":532,"description":533,"stem":534},"\u002Freference\u002Fpackages\u002Fadapter-duckdb","@fougere\u002Fadapter-duckdb","Read across an app's sources — one SQL query over what DuckDB can attach.","reference\u002Fpackages\u002Fadapter-duckdb",{"path":536,"title":537,"description":538,"stem":539},"\u002Freference\u002Fpackages\u002Fadapter-env","@fougere\u002Fadapter-env","The process environment as a source — MEILI_URL read as Meili's url, judged at boot.","reference\u002Fpackages\u002Fadapter-env",{"path":541,"title":542,"description":543,"stem":544},"\u002Freference\u002Fpackages\u002Fadapter-file","@fougere\u002Fadapter-file","Rows as files — one JSON or YAML file per row, in a directory per entity.","reference\u002Fpackages\u002Fadapter-file",{"path":473,"title":8,"description":19,"stem":475},{"path":547,"title":548,"description":549,"stem":550},"\u002Freference\u002Fpackages\u002Fadapter-memory","@fougere\u002Fadapter-memory","Rows in a Map — the source a first run meets, and the one that ships no driver.","reference\u002Fpackages\u002Fadapter-memory",{"path":552,"title":553,"description":554,"stem":555},"\u002Freference\u002Fpackages\u002Fadapter-rest","@fougere\u002Fadapter-rest","Entity → REST routes.","reference\u002Fpackages\u002Fadapter-rest",{"path":557,"title":558,"description":559,"stem":560},"\u002Freference\u002Fpackages\u002Fadapter-sql","@fougere\u002Fadapter-sql","Entity → SQL tables through Kysely (SQLite, PostgreSQL, MySQL, SQL Server).","reference\u002Fpackages\u002Fadapter-sql",{"path":562,"title":563,"description":564,"stem":565},"\u002Freference\u002Fpackages\u002Fadmin","@fougere\u002Fadmin","A back-office derived from what the app already says it hosts — a react-admin DataProvider over the Fougere wire.","reference\u002Fpackages\u002Fadmin",{"path":567,"title":568,"description":569,"stem":570},"\u002Freference\u002Fpackages\u002Fapp","@fougere\u002Fapp","The host-independent half of a Fougere app: boot, call envelope, REST table, form contract.","reference\u002Fpackages\u002Fapp",{"path":572,"title":573,"description":574,"stem":575},"\u002Freference\u002Fpackages\u002Fauth-better","@fougere\u002Fauth-better","Fougere's auth — a translation layer onto better-auth.","reference\u002Fpackages\u002Fauth-better",{"path":577,"title":578,"description":579,"stem":580},"\u002Freference\u002Fpackages\u002Fcalls","@fougere\u002Fcalls","Optional call log for Fougere: a bounded ring of every dispatch, served as an rpc operation. Read it with `fougere devtools`.","reference\u002Fpackages\u002Fcalls",{"path":582,"title":583,"description":584,"stem":585},"\u002Freference\u002Fpackages\u002Fcli","@fougere\u002Fcli","The Fougere CLI — compose a workspace, serve a frond, call an operation.","reference\u002Fpackages\u002Fcli",{"path":587,"title":588,"description":589,"stem":590},"\u002Freference\u002Fpackages\u002Fcompiler","@fougere\u002Fcompiler","The scan: Fougere reading a project's source to produce the descriptors core boots from. Needs a filesystem and a TypeScript program.","reference\u002Fpackages\u002Fcompiler",{"path":592,"title":593,"description":594,"stem":595},"\u002Freference\u002Fpackages\u002Fcontainer","@fougere\u002Fcontainer","Fougere's DI container: resolution by type, wired from the AST scan. Zero dependencies.","reference\u002Fpackages\u002Fcontainer",{"path":597,"title":598,"description":599,"stem":600},"\u002Freference\u002Fpackages\u002Fcore","@fougere\u002Fcore","The core — scan, call contract, façades, remote stand-ins.","reference\u002Fpackages\u002Fcore",{"path":602,"title":603,"description":604,"stem":605},"\u002Freference\u002Fpackages\u002Fdecorators","@fougere\u002Fdecorators","Configuration sugar (@config) — declarative, never hidden runtime.","reference\u002Fpackages\u002Fdecorators",{"path":607,"title":608,"description":609,"stem":610},"\u002Freference\u002Fpackages\u002Fdefaults","@fougere\u002Fdefaults","The conventional boot of a Fougere app — the one place storage is wired.","reference\u002Fpackages\u002Fdefaults",{"path":612,"title":613,"description":614,"stem":615},"\u002Freference\u002Fpackages\u002Fgraph","@fougere\u002Fgraph","Fougere's graph: a labelled directed multigraph, and the four questions asked of it — order, cycles, components, reach. Zero dependencies.","reference\u002Fpackages\u002Fgraph",{"path":617,"title":618,"description":619,"stem":620},"\u002Freference\u002Fpackages\u002Fhttp","@fougere\u002Fhttp","The words every HTTP door speaks — a method, an answer, the headers a state travels in.","reference\u002Fpackages\u002Fhttp",{"path":622,"title":623,"description":624,"stem":625},"\u002Freference\u002Fpackages\u002Flog","@fougere\u002Flog","Logging for Fougere: two lines for every call, in every process, and a file destination for the lines.","reference\u002Fpackages\u002Flog",{"path":627,"title":628,"description":629,"stem":630},"\u002Freference\u002Fpackages\u002Fnext","@fougere\u002Fnext","The Next.js adapter: mounting, and the one import that is genuinely Next.","reference\u002Fpackages\u002Fnext",{"path":632,"title":633,"description":634,"stem":635},"\u002Freference\u002Fpackages\u002Fnuxt","@fougere\u002Fnuxt","The Nuxt module: Fougere's client primitives and server surface.","reference\u002Fpackages\u002Fnuxt",{"path":637,"title":638,"description":639,"stem":640},"\u002Freference\u002Fpackages\u002Fobservability","@fougere\u002Fobservability","Optional observability for Fougere: one span per operation, W3C Trace Context across any transport.","reference\u002Fpackages\u002Fobservability",{"path":642,"title":643,"description":644,"stem":645},"\u002Freference\u002Fpackages\u002Foclif","@fougere\u002Foclif","A frond's operations, as a terminal: topics, flags and help derived from what it declares.","reference\u002Fpackages\u002Foclif",{"path":647,"title":648,"description":649,"stem":650},"\u002Freference\u002Fpackages\u002Freact","@fougere\u002Freact","Fougere's four primitives as React hooks — host-independent.","reference\u002Fpackages\u002Freact",{"path":652,"title":653,"description":654,"stem":655},"\u002Freference\u002Fpackages\u002Fregistry","@fougere\u002Fregistry","Fougere's registry: one answer per name, refused when a second one arrives, and a reload that says it replaces. Zero dependencies.","reference\u002Fpackages\u002Fregistry",{"path":657,"title":658,"description":659,"stem":660},"\u002Freference\u002Fpackages\u002Fschema","@fougere\u002Fschema","The entity and its 4 axes — shape, role, lifecycle, boundary. Subject-owned judgments, edge-safe.","reference\u002Fpackages\u002Fschema",{"path":662,"title":663,"description":664,"stem":665},"\u002Freference\u002Fpackages\u002Fstate-cookie","@fougere\u002Fstate-cookie","A caller's state kept in a cookie — what `state: { cart: { cookie: {} } }` names, signed by core, carried by every HTTP door.","reference\u002Fpackages\u002Fstate-cookie",{"path":667,"title":668,"description":669,"stem":670},"\u002Freference\u002Fpackages\u002Fstate-session","@fougere\u002Fstate-session","A caller's state kept in a session — what `state: { cart: { session: {} } }` names: one cookie holds a reference, the values a row in a source.","reference\u002Fpackages\u002Fstate-session",{"path":672,"title":673,"description":674,"stem":675},"\u002Freference\u002Fpackages\u002Fsvelte","@fougere\u002Fsvelte","Fougere's four primitives as Svelte stores — host-independent.","reference\u002Fpackages\u002Fsvelte",{"path":677,"title":678,"description":679,"stem":680},"\u002Freference\u002Fpackages\u002Ftesting","@fougere\u002Ftesting","Tests derived from the declaration — cases, stubs and a gradient of realities.","reference\u002Fpackages\u002Ftesting",{"path":682,"title":683,"description":684,"stem":685},"\u002Freference\u002Fpackages\u002Ftransport-http","@fougere\u002Ftransport-http","The call contract on the wire, in JSON-RPC 2.0 (server + client).","reference\u002Fpackages\u002Ftransport-http",{"path":687,"title":688,"description":689,"stem":690},"\u002Freference\u002Fpackages\u002Fvite","@fougere\u002Fvite","The Vite plugin: what any Vite-built host must know to run a Fougere app.","reference\u002Fpackages\u002Fvite",{"path":692,"title":693,"description":694,"stem":695},"\u002Freference\u002Fpackages\u002Fworkflow","@fougere\u002Fworkflow","A release that goes to the end: the journal is three entities, the sweep is an operation, and a shared journal is one line of remotes:.","reference\u002Fpackages\u002Fworkflow",1794396612390]