[{"data":1,"prerenderedAt":416},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Fconcepts\u002Fphilosophy":134},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,42,63,92,113],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"Existing Nuxt app","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"The CLI","\u002Fdocs\u002Fcli","docs\u002F03.cli",{"title":25,"path":26,"stem":27,"children":28,"page":41},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[29,33,37],{"title":30,"path":31,"stem":32},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":34,"path":35,"stem":36},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":38,"path":39,"stem":40},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",false,{"title":43,"path":44,"stem":45,"children":46,"page":41},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[47,51,55,59],{"title":48,"path":49,"stem":50},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":52,"path":53,"stem":54},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":56,"path":57,"stem":58},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":60,"path":61,"stem":62},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":64,"path":65,"stem":66,"children":67,"page":41},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[68,72,76,80,84,88],{"title":69,"path":70,"stem":71},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":73,"path":74,"stem":75},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":77,"path":78,"stem":79},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":81,"path":82,"stem":83},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":85,"path":86,"stem":87},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":89,"path":90,"stem":91},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":93,"path":94,"stem":95,"children":96,"page":41},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[97,101,105,109],{"title":98,"path":99,"stem":100},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":102,"path":103,"stem":104},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":106,"path":107,"stem":108},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":110,"path":111,"stem":112},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":114,"path":115,"stem":116,"children":117,"page":41},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[118,122,126,130],{"title":119,"path":120,"stem":121},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":123,"path":124,"stem":125},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":127,"path":128,"stem":129},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":131,"path":132,"stem":133},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"id":135,"title":30,"body":136,"description":410,"extension":411,"meta":412,"navigation":413,"path":31,"seo":414,"stem":32,"__hash__":415},"docs_en\u002Fdocs\u002F2.concepts\u002F1.philosophy.md",{"type":137,"value":138,"toc":393},"minimark",[139,143,147,152,160,164,195,199,206,210,217,237,241,248,262,265,270,273,280,283,301,304,308,315,319,322,336,339,343,346,370,373,377,380,384,387],[140,141,30],"h1",{"id":142},"philosophy",[144,145,146],"p",{},"Fougere describes an application through data, operations, contracts, and domain\nboundaries. Adapters then connect that model to Nuxt, HTTP, SQL, caches, or a remote\nprocess.",[148,149,151],"h2",{"id":150},"declarations-project","Declarations project",[144,153,154,155,159],{},"An ",[156,157,158],"a",{"href":49},"entity"," describes data independently of its storage. Its\ndeclaration provides the TypeScript type, validation, and metadata used by forms, SQLite,\nand GraphQL. When the same rule appears in several layers, it should move to the shared\ndeclaration when its scope allows it.",[148,161,163],{"id":162},"operations-not-field-writes","Operations, not field writes",[144,165,166,167,171,172,175,176,179,180,184,185,190,191,194],{},"A Frond exposes ",[168,169,170],"strong",{},"commands"," to change the system, ",[168,173,174],{},"queries"," to read it, and, when\nuseful, ",[168,177,178],{},"events"," produced by commands. ",[181,182,183],"code",{},"Crud(Post)"," provides the five standard\noperations. A business transition uses an explicit verb:\n",[156,186,187],{"href":70},[181,188,189],{},"publish"," checks its rules before changing ",[181,192,193],{},"status",", instead\nof allowing the client to write that field directly.",[148,196,198],{"id":197},"the-frond-owns","The Frond owns",[144,200,201,202,205],{},"A ",[156,203,204],{"href":35},"Frond"," groups the entities, operations, access rules, and\nadapters for one domain. Interactions with another Frond go through its public contracts.\nThe application composes these modules without moving their logic into pages, fetches,\nor stores.",[148,207,209],{"id":208},"topology-is-configuration","Topology is configuration",[144,211,212,213,216],{},"The ",[156,214,215],{"href":120},"configuration"," specifies whether a Frond runs locally or on a\nremote host. Calls use the same API in both cases. The runner executes a local call in\nmemory and uses the configured transport for a remote call.",[144,218,219,220,223,224,227,228,231,232,236],{},"The boundary also lets a Frond have its own repository and release cycle: only its\n",[168,221,222],{},"contract"," must travel, never its source — ",[181,225,226],{},"fougere sync"," reads it off the running host,\n",[181,229,230],{},"fougere build-frond"," turns it into an installable package\n(",[156,233,235],{"href":234},"\u002Fdocs\u002Finfra\u002Fgradient#where-the-code-lives","where the code lives",").",[148,238,240],{"id":239},"http-is-a-projection-not-a-foundation","HTTP is a projection, not a foundation",[144,242,243,244,247],{},"Many frameworks start from a route: the first-class object is a request, and the model, the\nvalidation and the business layer hang off it. Here the first-class object is the\n",[168,245,246],{},"operation"," — a public method that receives an invocation, and that has never heard of\nHTTP.",[144,249,250,251,254,255,261],{},"This is not a matter of style; it is what makes the rest possible. An operation that\nignores transport can be called in memory, put on a JSON-RPC wire, translated into a REST\nroute, a GraphQL field or a shell command — with none of those forms privileged.\n",[181,252,253],{},"@fougere\u002Fcore"," depends on no server, and\n",[156,256,258],{"href":257},"\u002Fdocs\u002Finfra\u002Fsurfaces#the-framework-is-not-the-process",[181,259,260],{},"@fougere\u002Fhttp"," has no\ndependencies at all: you bring Hono, Fastify, Nitro — or nothing.",[144,263,264],{},"The corollary is that JavaScript takes you everywhere it goes. The declaration and its\njudge run in the browser as they do at the façade: the same object, not a faithful copy.",[266,267,269],"h3",{"id":268},"transport-is-a-leaf","Transport is a leaf",[144,271,272],{},"A complete Fougere application may have no HTTP at all. Entities, operations, storage,\nvalidation, injection and seeds all work without a server ever starting. A shell command, a\nworker, a test, an in-memory call are not degraded versions of the application: they are\nwhole uses of it.",[144,274,275,276,279],{},"That is why HTTP sits at the ",[168,277,278],{},"same rank"," as the other projections, not beneath them. One\ndeclaration yields the SQL table, the GraphQL type, the form contract and the route: four\nreadings of a single statement, none of them the ground the others stand on.",[144,281,282],{},"Two consequences, and they are what makes the principle useful:",[284,285,286,294],"ul",{},[287,288,289,290,293],"li",{},"were transport the foundation, you could not remove it — so no in-memory call, so no\n",[156,291,292],{"href":120},"gradient",";",[287,295,296,297,300],{},"the ",[156,298,299],{"href":124},"surfaces"," could not return the same verdict, since one of them\nwould be the floor beneath the rest.",[144,302,303],{},"So this is not a claim of independence from any server, nor an implementation choice. It is\nthe rule stated at the top of this page — one declaration, many projections — applied where\nmany frameworks put their foundation.",[148,305,307],{"id":306},"state-is-losable-or-durable","State is losable or durable",[144,309,310,311,314],{},"To choose between a cache and durable storage, consider what losing the value changes. A\nvalue that can be recomputed from a query can remain in a cache. A value whose loss\nchanges behavior should be stored as business data, even when it has a short lifetime. A\none-time OAuth code can, for example, be represented as ",[181,312,313],{},"{ code, userId, expiresAt }","\nwith a destructive read.",[148,316,318],{"id":317},"embedded-or-externalized","Embedded or externalized",[144,320,321],{},"Elements used in several contexts ship with the class; execution details are connected\nby the runtime.",[284,323,324,330],{},[287,325,326,329],{},[168,327,328],{},"Embedded"," — validation, input or output projections, and metadata. They can be used\nin the browser, at the façade, or in a remote Frond.",[287,331,332,335],{},[168,333,334],{},"Externalized"," — storage, transport, and rendering. These adapters can vary with the\napplication and the surface being used.",[144,337,338],{},"Validation is embedded so the same rules apply in each context. Storage remains external\nso the application can select an adapter. Metadata does not depend on topology; its use\ndepends on the runtime that loads it.",[148,340,342],{"id":341},"design-order","Design order",[144,344,345],{},"When making a design decision, ask these questions in order:",[347,348,349,352,355,358,361,364,367],"ol",{},[287,350,351],{},"What is the application concept?",[287,353,354],{},"What is its ownership boundary?",[287,356,357],{},"Which contracts must it expose?",[287,359,360],{},"Which operations change state?",[287,362,363],{},"Which queries read it?",[287,365,366],{},"What invalidates what?",[287,368,369],{},"Which adapter executes or projects this model?",[144,371,372],{},"This order avoids spreading one rule across a route, page, table, and transport.",[148,374,376],{"id":375},"why-fougere","Why “Fougere”",[144,378,379],{},"A fern consists of fronds that repeat a structure similar to the whole plant. The name\nrefers to the framework's composition: fields form an entity, entities and their\noperations form a Frond, and an application composes several Fronds.",[148,381,383],{"id":382},"position","Position",[144,385,386],{},"Fougere targets data-intensive applications that use one business model across several\nsurfaces and execution modes. Nuxt, CRUD, and transports are integrations of that model,\nnot its definition.",[144,388,389,390,392],{},"Next: ",[156,391,34],{"href":35},".",{"title":394,"searchDepth":395,"depth":395,"links":396},"",2,[397,398,399,400,401,405,406,407,408,409],{"id":150,"depth":395,"text":151},{"id":162,"depth":395,"text":163},{"id":197,"depth":395,"text":198},{"id":208,"depth":395,"text":209},{"id":239,"depth":395,"text":240,"children":402},[403],{"id":268,"depth":404,"text":269},3,{"id":306,"depth":395,"text":307},{"id":317,"depth":395,"text":318},{"id":341,"depth":395,"text":342},{"id":375,"depth":395,"text":376},{"id":382,"depth":395,"text":383},"The principles connecting declarations, operations, Fronds, and topology.","md",{},true,{"title":30,"description":410},"DVGSfACQJ-QBJFnSL-dRpt_v_YIo7qAB5ZSnTsSCD4M",1786637819120]