[{"data":1,"prerenderedAt":569},["ShallowReactive",2],{"fougere:post.list:{}":3,"reference:\u002Freference\u002Fpackages\u002Ftesting":6,"reference-pages":348},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":19,"extension":340,"file":341,"meta":342,"navigation":343,"path":344,"seo":345,"stem":346,"__hash__":347},"reference\u002Freference\u002Fpackages\u002Ftesting.md","@fougere\u002Ftesting",{"type":10,"value":11,"toc":334},"minimark",[12,16,20,33,38,254,258,265],[13,14,8],"h1",{"id":15},"fougeretesting",[17,18,19],"p",{},"Tests derived from the declaration — cases, stubs and a gradient of realities.",[17,21,22,23,26,27,26,30],{},"Entries: ",[24,25,8],"code",{}," · ",[24,28,29],{},"@fougere\u002Ftesting\u002Fload",[24,31,32],{},"@fougere\u002Ftesting\u002Fvitest",[34,35,37],"h2",{"id":36},"what-you-import","What you import",[39,40,41,53],"table",{},[42,43,44],"thead",{},[45,46,47,51],"tr",{},[48,49,50],"th",{},"name",[48,52],{},[54,55,56,66,75,85,95,105,115,125,135,145,155,173,187,197,207,217,226,235,244],"tbody",{},[45,57,58,64],{},[59,60,61],"td",{},[24,62,63],{},"sampleInput",[59,65],{},[45,67,68,73],{},[59,69,70],{},[24,71,72],{},"Cases",[59,74],{},[45,76,77,82],{},[59,78,79],{},[24,80,81],{},"testApp",[59,83,84],{},"An app to ask questions of, wired the conventional way.",[45,86,87,92],{},[59,88,89],{},[24,90,91],{},"checkContract",[59,93,94],{},"The declared contract, posed to the façade that will receive it.",[45,96,97,102],{},[59,98,99],{},[24,100,101],{},"checkOutput",[59,103,104],{},"What may leave, checked against what the entity says may leave.",[45,106,107,112],{},[59,108,109],{},[24,110,111],{},"verdictOf",[59,113,114],{},"What a facade answers, in the shape a verdict is compared in.",[45,116,117,122],{},[59,118,119],{},[24,120,121],{},"stubOf",[59,123,124],{},"A double for a port.",[45,126,127,132],{},[59,128,129],{},[24,130,131],{},"frondOf",[59,133,134],{},"The frond a path sits in, or nothing.",[45,136,137,142],{},[59,138,139],{},[24,140,141],{},"loadScript",[59,143,144],{},"A k6 scenario, written from what the app answers.",[45,146,147,152],{},[59,148,149],{},[24,150,151],{},"reachableOps",[59,153,154],{},"Every operation the app answers, with a body for those that take one.",[45,156,157,162],{},[59,158,159],{},[24,160,161],{},"statementsOf",[59,163,164,165,168,169,172],{},"Every statement the process ran while ",[24,166,167],{},"run"," ran; refuses when ",[24,170,171],{},"@fougere\u002Fadapter-sql"," is absent.",[45,174,175,180],{},[59,176,177],{},[24,178,179],{},"spansOf",[59,181,182,183,186],{},"The steps one call opened: the operation, then what ran under it. Ex: ",[24,184,185],{},"expect(op.selfMs).toBeLessThan(0.1 * op.ms)",".",[45,188,189,194],{},[59,190,191],{},[24,192,193],{},"checkDoorContract",[59,195,196],{},"Run one hand-written invocation contract through every facade.",[45,198,199,204],{},[59,200,201],{},[24,202,203],{},"checkDoors",[59,205,206],{},"One entity, four facades, the same answers.",[45,208,209,214],{},[59,210,211],{},[24,212,213],{},"at",[59,215,216],{},"Follow a path into a GraphQL answer, tolerating an absence rather than throwing.",[45,218,219,224],{},[59,220,221],{},[24,222,223],{},"driftOf",[59,225],{},[45,227,228,233],{},[59,229,230],{},[24,231,232],{},"agrees",[59,234],{},[45,236,237,242],{},[59,238,239],{},[24,240,241],{},"explain",[59,243],{},[45,245,246,251],{},[59,247,248],{},[24,249,250],{},"checkAll",[59,252,253],{},"The whole suite, for every entity, from a file that names none of them.",[34,255,257],{"id":256},"types","Types",[17,259,260,261,264],{},"TypeScript types only — they do not run. Import them with ",[24,262,263],{},"import type"," to type your own code: a variable, a parameter, an option object.",[39,266,267,275],{},[42,268,269],{},[45,270,271,273],{},[48,272,50],{},[48,274],{},[54,276,277,286,295,305,315,325],{},[45,278,279,284],{},[59,280,281],{},[24,282,283],{},"ValidationCase",[59,285],{},[45,287,288,293],{},[59,289,290],{},[24,291,292],{},"Verdict",[59,294],{},[45,296,297,302],{},[59,298,299],{},[24,300,301],{},"Port",[59,303,304],{},"Anything a provider can be declared as: a class the container knows how to build.",[45,306,307,312],{},[59,308,309],{},[24,310,311],{},"Stub",[59,313,314],{},"The double handed in place of a port — one spy per method the port declares.",[45,316,317,322],{},[59,318,319],{},[24,320,321],{},"Scope",[59,323,324],{},"What a test file's position states about its subject.",[45,326,327,332],{},[59,328,329],{},[24,330,331],{},"CardDrift",[59,333],{},{"title":335,"searchDepth":336,"depth":336,"links":337},"",2,[338,339],{"id":36,"depth":336,"text":37},{"id":256,"depth":336,"text":257},"md",null,{},true,"\u002Freference\u002Fpackages\u002Ftesting",{"title":8,"description":19},"reference\u002Fpackages\u002Ftesting","8V4c0umrpRfIJneKH1vn9xMCh8jInITOooy6zZhXZ8s",[349,354,359,364,369,374,379,384,389,394,399,404,409,414,419,424,429,434,438,443,448,453,458,463,468,473,478,483,488,493,498,503,508,513,518,523,528,533,538,543,548,553,554,559,564],{"path":350,"title":351,"description":352,"stem":353},"\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":355,"title":356,"description":357,"stem":358},"\u002Freference\u002Ferrors","Error codes","Every code an operation can refuse with, and its HTTP status.","reference\u002F02.errors",{"path":360,"title":361,"description":362,"stem":363},"\u002Freference\u002Fconfig","fougere.config.ts","Every key the app config admits, and which package answers each one.","reference\u002F03.config",{"path":365,"title":366,"description":367,"stem":368},"\u002Freference\u002Ffrond-config","frond.config.ts","Every key a frond's own config admits.","reference\u002F04.frond-config",{"path":370,"title":371,"description":372,"stem":373},"\u002Freference\u002Fsources","Source types","Every type an entry of sources: may name, and the keys it admits.","reference\u002F05.sources",{"path":375,"title":376,"description":377,"stem":378},"\u002Freference\u002Fprotocols","Protocols","What protocols: may serve, and what each admits.","reference\u002F06.protocols",{"path":380,"title":381,"description":382,"stem":383},"\u002Freference\u002Fstates","State keepers","How state: may keep a caller's values.","reference\u002F07.states",{"path":385,"title":386,"description":387,"stem":388},"\u002Freference\u002Fforms","Forms","The types a frond is written with — each one read by the scan.","reference\u002F08.forms",{"path":390,"title":391,"description":392,"stem":393},"\u002Freference\u002Fports","Ports Fougere opens","The classes you stand in front of, or extend, to change what the framework does.","reference\u002F09.ports",{"path":395,"title":396,"description":397,"stem":398},"\u002Freference\u002Finterfaces","Interfaces to extend","The empty interfaces a package augments with declare module, and who augments each.","reference\u002F10.interfaces",{"path":400,"title":401,"description":402,"stem":403},"\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":405,"title":406,"description":407,"stem":408},"\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":410,"title":411,"description":412,"stem":413},"\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":415,"title":416,"description":417,"stem":418},"\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":420,"title":421,"description":422,"stem":423},"\u002Freference\u002Fpackages\u002Fadapter-graphql","@fougere\u002Fadapter-graphql","Entity → GraphQL types, inputs and CRUD, through Pothos.","reference\u002Fpackages\u002Fadapter-graphql",{"path":425,"title":426,"description":427,"stem":428},"\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":430,"title":431,"description":432,"stem":433},"\u002Freference\u002Fpackages\u002Fadapter-rest","@fougere\u002Fadapter-rest","Entity → REST routes.","reference\u002Fpackages\u002Fadapter-rest",{"path":435,"title":171,"description":436,"stem":437},"\u002Freference\u002Fpackages\u002Fadapter-sql","Entity → SQL tables through Kysely (SQLite, PostgreSQL, MySQL, SQL Server).","reference\u002Fpackages\u002Fadapter-sql",{"path":439,"title":440,"description":441,"stem":442},"\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":444,"title":445,"description":446,"stem":447},"\u002Freference\u002Fpackages\u002Fapp","@fougere\u002Fapp","The host-independent half of a Fougere app: boot, call envelope, REST table, form contract.","reference\u002Fpackages\u002Fapp",{"path":449,"title":450,"description":451,"stem":452},"\u002Freference\u002Fpackages\u002Fauth-better","@fougere\u002Fauth-better","Fougere's auth — a translation layer onto better-auth.","reference\u002Fpackages\u002Fauth-better",{"path":454,"title":455,"description":456,"stem":457},"\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":459,"title":460,"description":461,"stem":462},"\u002Freference\u002Fpackages\u002Fcli","@fougere\u002Fcli","The Fougere CLI — compose a workspace, serve a frond, call an operation.","reference\u002Fpackages\u002Fcli",{"path":464,"title":465,"description":466,"stem":467},"\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":469,"title":470,"description":471,"stem":472},"\u002Freference\u002Fpackages\u002Fcontainer","@fougere\u002Fcontainer","Fougere's DI container: resolution by type, wired from the AST scan. Zero dependencies.","reference\u002Fpackages\u002Fcontainer",{"path":474,"title":475,"description":476,"stem":477},"\u002Freference\u002Fpackages\u002Fcore","@fougere\u002Fcore","The core — scan, call contract, façades, remote stand-ins.","reference\u002Fpackages\u002Fcore",{"path":479,"title":480,"description":481,"stem":482},"\u002Freference\u002Fpackages\u002Fdecorators","@fougere\u002Fdecorators","Configuration sugar (@config) — declarative, never hidden runtime.","reference\u002Fpackages\u002Fdecorators",{"path":484,"title":485,"description":486,"stem":487},"\u002Freference\u002Fpackages\u002Fdefaults","@fougere\u002Fdefaults","The conventional boot of a Fougere app — the one place storage is wired.","reference\u002Fpackages\u002Fdefaults",{"path":489,"title":490,"description":491,"stem":492},"\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":494,"title":495,"description":496,"stem":497},"\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":499,"title":500,"description":501,"stem":502},"\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":504,"title":505,"description":506,"stem":507},"\u002Freference\u002Fpackages\u002Fnext","@fougere\u002Fnext","The Next.js adapter: mounting, and the one import that is genuinely Next.","reference\u002Fpackages\u002Fnext",{"path":509,"title":510,"description":511,"stem":512},"\u002Freference\u002Fpackages\u002Fnuxt","@fougere\u002Fnuxt","The Nuxt module: Fougere's client primitives and server surface.","reference\u002Fpackages\u002Fnuxt",{"path":514,"title":515,"description":516,"stem":517},"\u002Freference\u002Fpackages\u002Fobservability","@fougere\u002Fobservability","Optional observability for Fougere: one span per operation, W3C Trace Context across any transport.","reference\u002Fpackages\u002Fobservability",{"path":519,"title":520,"description":521,"stem":522},"\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":524,"title":525,"description":526,"stem":527},"\u002Freference\u002Fpackages\u002Freact","@fougere\u002Freact","Fougere's four primitives as React hooks — host-independent.","reference\u002Fpackages\u002Freact",{"path":529,"title":530,"description":531,"stem":532},"\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":534,"title":535,"description":536,"stem":537},"\u002Freference\u002Fpackages\u002Fschema","@fougere\u002Fschema","The entity and its 4 axes — shape, role, lifecycle, boundary. Subject-owned judgments, edge-safe.","reference\u002Fpackages\u002Fschema",{"path":539,"title":540,"description":541,"stem":542},"\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":544,"title":545,"description":546,"stem":547},"\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":549,"title":550,"description":551,"stem":552},"\u002Freference\u002Fpackages\u002Fsvelte","@fougere\u002Fsvelte","Fougere's four primitives as Svelte stores — host-independent.","reference\u002Fpackages\u002Fsvelte",{"path":344,"title":8,"description":19,"stem":346},{"path":555,"title":556,"description":557,"stem":558},"\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":560,"title":561,"description":562,"stem":563},"\u002Freference\u002Fpackages\u002Fvite","@fougere\u002Fvite","The Vite plugin: what any Vite-built host must know to run a Fougere app.","reference\u002Fpackages\u002Fvite",{"path":565,"title":566,"description":567,"stem":568},"\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",1794396613414]