[{"data":1,"prerenderedAt":1052},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fgetting-started":189},[4],{"title":5,"path":6,"stem":7,"children":8,"page":52},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13,"page":-1},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,31,53,78,123,148],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"Une app que vous avez déjà","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"Apportez votre schéma","\u002Ffr\u002Fdocs\u002Fbring-your-schema","fr\u002Fdocs\u002F03.bring-your-schema",{"title":28,"path":29,"stem":30},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F04.cli",{"title":32,"path":33,"stem":34,"children":35,"page":52},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[36,40,44,48],{"title":37,"path":38,"stem":39},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":41,"path":42,"stem":43},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":45,"path":46,"stem":47},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",{"title":49,"path":50,"stem":51},"Le socle","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base","fr\u002Fdocs\u002F2.concepts\u002F4.the-base",false,{"title":54,"path":55,"stem":56,"children":57,"page":52},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":63,"path":64,"stem":65},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":67,"path":68,"stem":69},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":71,"path":72,"stem":73},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":75,"path":76,"stem":77},"Comment un schéma bouge","\u002Ffr\u002Fdocs\u002Fschema\u002Fevolution","fr\u002Fdocs\u002F3.schema\u002F5.evolution",{"title":79,"path":80,"stem":81,"children":82,"page":52},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":88,"path":89,"stem":90},"Les ports","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fports","fr\u002Fdocs\u002F4.business\u002F10.ports",{"title":92,"path":93,"stem":94},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":96,"path":97,"stem":98},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":100,"path":101,"stem":102},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":104,"path":105,"stem":106},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":108,"path":109,"stem":110},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":112,"path":113,"stem":114},"Le port Storage","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage","fr\u002Fdocs\u002F4.business\u002F7.storage",{"title":116,"path":117,"stem":118},"Des écritures qui tiennent ou tombent ensemble","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ftogether","fr\u002Fdocs\u002F4.business\u002F8.together",{"title":120,"path":121,"stem":122},"Les repositories","\u002Ffr\u002Fdocs\u002Fbusiness\u002Frepositories","fr\u002Fdocs\u002F4.business\u002F9.repositories",{"title":124,"path":125,"stem":126,"children":127,"page":52},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":133,"path":134,"stem":135},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":137,"path":138,"stem":139},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":141,"path":142,"stem":143},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":145,"path":146,"stem":147},"Back-office","\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin","fr\u002Fdocs\u002F5.client\u002F5.admin",{"title":149,"path":150,"stem":151,"children":152,"page":52},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[153,157,161,165,169,173,177,181,185],{"title":154,"path":155,"stem":156},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":158,"path":159,"stem":160},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":162,"path":163,"stem":164},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":166,"path":167,"stem":168},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"title":170,"path":171,"stem":172},"Les sources","\u002Ffr\u002Fdocs\u002Finfra\u002Fsources","fr\u002Fdocs\u002F6.infra\u002F5.sources",{"title":174,"path":175,"stem":176},"Le cycle de vie","\u002Ffr\u002Fdocs\u002Finfra\u002Flifecycle","fr\u002Fdocs\u002F6.infra\u002F6.lifecycle",{"title":178,"path":179,"stem":180},"L'identité entre Fronds","\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity","fr\u002Fdocs\u002F6.infra\u002F7.identity",{"title":182,"path":183,"stem":184},"Observabilité","\u002Ffr\u002Fdocs\u002Finfra\u002Fobservability","fr\u002Fdocs\u002F6.infra\u002F8.observability",{"title":186,"path":187,"stem":188},"Tests","\u002Ffr\u002Fdocs\u002Finfra\u002Ftesting","fr\u002Fdocs\u002F6.infra\u002F9.testing",{"id":190,"title":16,"body":191,"description":1047,"extension":1048,"meta":1049,"navigation":572,"path":17,"seo":1050,"stem":18,"__hash__":1051},"docs_fr\u002Ffr\u002Fdocs\u002F01.getting-started.md",{"type":192,"value":193,"toc":1039},"minimark",[194,198,266,298,303,310,318,350,356,389,422,440,448,454,460,479,492,496,977,980,993,997,1020,1023,1029,1035],[195,196,16],"h1",{"id":197},"démarrer",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","npm create fougere shop --frond blog --app nuxt\ncd shop && pnpm install && pnpm dev\n","bash","",[206,207,208,240],"code",{"__ignoreMap":204},[209,210,213,217,221,224,227,231,234,237],"span",{"class":211,"line":212},"line",1,[209,214,216],{"class":215},"sbgvK","npm",[209,218,220],{"class":219},"s_sjI"," create",[209,222,223],{"class":219}," fougere",[209,225,226],{"class":219}," shop",[209,228,230],{"class":229},"stzsN"," --frond",[209,232,233],{"class":219}," blog",[209,235,236],{"class":229}," --app",[209,238,239],{"class":219}," nuxt\n",[209,241,243,247,249,253,256,259,261,263],{"class":211,"line":242},2,[209,244,246],{"class":245},"sptTA","cd",[209,248,226],{"class":219},[209,250,252],{"class":251},"sP7_E"," &&",[209,254,255],{"class":215}," pnpm",[209,257,258],{"class":219}," install",[209,260,252],{"class":251},[209,262,255],{"class":215},[209,264,265],{"class":219}," dev\n",[267,268,269],"blockquote",{},[270,271,272,276,277,280,281,284,285,288,289,292,293,297],"p",{},[273,274,275],"strong",{},"Alpha."," Les paquets ",[206,278,279],{},"@fougere\u002F*"," sont sur npm sous le tag ",[206,282,283],{},"alpha"," — le numéro de\nversion est toute la promesse, la surface peut encore bouger. Ce site (",[206,286,287],{},"site\u002F",") et\n",[206,290,291],{},"demos\u002Fnuxt-blog"," servent de références complètes. La structure ci-dessous correspond\nà l'état actuel. Vous avez déjà une app Nuxt ?\n",[294,295,296],"a",{"href":21},"Ajoutez-y Fougere",".",[299,300,302],"h2",{"id":301},"structure-dune-app","Structure d'une app",[270,304,305,306,309],{},"Une app Fougere est une app Nuxt plus un répertoire ",[206,307,308],{},"fronds\u002F"," et un fichier de config :",[199,311,316],{"className":312,"code":314,"language":315},[313],"language-text","mon-app\u002F\n  fougere.config.ts       ← persistance, auth, topologie\n  nuxt.config.ts          ← modules: ['@fougere\u002Fnuxt']\n  fronds\u002F\n    blog\u002F\n      entities\u002FPost.ts\n      handlers\u002FPostHandler.ts\n      collectors\u002FCurrentUserCollector.ts\n      seeds\u002FPost.seed.ts\n    user\u002F                 ← un second domaine\n      entities\u002FUser.ts\n  app\u002F\n    pages\u002F                ← des pages Nuxt ordinaires, qui parlent via les primitives\n","text",[206,317,314],{"__ignoreMap":204},[270,319,320,321,323,324,327,328,331,332,327,335,327,338,341,342,345,346,349],{},"Le scanner lit sept dossiers de convention sous ",[206,322,308],{}," — ",[206,325,326],{},"entities\u002F",", ",[206,329,330],{},"handlers\u002F",",\n",[206,333,334],{},"presenters\u002F",[206,336,337],{},"collectors\u002F",[206,339,340],{},"seeds\u002F",", plus ",[206,343,344],{},"services\u002F"," et ",[206,347,348],{},"repositories\u002F"," qui sont deux\nécritures d'une seule liste de providers. L'emplacement du fichier et le nom de la classe\nservent à leur enregistrement ; aucun fichier de câblage supplémentaire n'est nécessaire.",[270,351,352,353,355],{},"Chaque dossier placé directement sous ",[206,354,308],{}," définit une Frond. Une page importe une\nentité avec le nom de ce dossier :",[199,357,361],{"className":358,"code":359,"language":360,"meta":204,"style":204},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import Post from '@fronds\u002Fblog\u002Fentities\u002FPost';\n","ts",[206,362,363],{"__ignoreMap":204},[209,364,365,369,373,376,380,383,386],{"class":211,"line":212},[209,366,368],{"class":367},"sVHd0","import",[209,370,372],{"class":371},"su5hD"," Post ",[209,374,375],{"class":367},"from",[209,377,379],{"class":378},"sjJ54"," '",[209,381,382],{"class":219},"@fronds\u002Fblog\u002Fentities\u002FPost",[209,384,385],{"class":378},"'",[209,387,388],{"class":251},";\n",[270,390,391,394,395,398,399,402,403,406,407,410,411,414,415,417,418,297],{},[206,392,393],{},"@fougere\u002Fnuxt"," lit le scan et enregistre un alias ",[206,396,397],{},"@fronds\u002F\u003Cnom>"," par Frond, donc cet\nimport marche pour ",[206,400,401],{},"blog"," comme pour ",[206,404,405],{},"user"," — rien à ajouter, ni ",[206,408,409],{},"package.json",", ni entrée\ndans ",[206,412,413],{},"pnpm-workspace.yaml",". Renommer une Frond, ou en importer une depuis autre chose\nqu'une app Nuxt, est là où le ",[206,416,409],{}," d'une Frond sert : voir\n",[294,419,421],{"href":420},"\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond#nommer-et-importer-une-frond","Frond — nommer et importer",[270,423,424,427,428,431,432,435,436,439],{},[206,425,426],{},"fougere new"," écrit les mêmes dossiers un cran plus haut — l'app sous ",[206,429,430],{},"apps\u002F\u003Cnom>\u002F",", les\nFronds partagées à la racine du workspace, ",[206,433,434],{},"fougere: { root: '..\u002F..' }"," dans\n",[206,437,438],{},"nuxt.config.ts"," — pour que plusieurs apps consomment les mêmes domaines. Une app, un\ndossier : la forme ci-dessus.",[441,442,444,445,447],"h3",{"id":443},"un-seul-domaine-pas-de-fronds-du-tout","Un seul domaine, pas de ",[206,446,308],{}," du tout",[270,449,450,451,453],{},"La racine du projet peut utiliser la même convention qu'un dossier sous ",[206,452,308],{},". Une app\navec un seul domaine peut donc placer directement ses entités et handlers à la racine :",[199,455,458],{"className":456,"code":457,"language":315},[313],"mon-shop\u002F\n  fougere.config.ts\n  nuxt.config.ts\n  entities\u002FProduct.ts       ← la racine EST la Frond, nommée d'après le dossier\n  handlers\u002FProductHandler.ts\n  app\u002Fpages\u002F\n",[206,459,457],{"__ignoreMap":204},[270,461,462,465,466,469,470,472,473,475,476,478],{},[206,463,464],{},"fougere new mon-shop --flat --frond blog"," écrit exactement ça. ",[206,467,468],{},"import Product from '@fronds\u002Fmon-shop\u002Fentities\u002FProduct'"," — même règle d'alias, pas de segment ",[206,471,308],{},", et le\nmot n'arrive que le jour où il y a deux domaines à distinguer. La racine doit au moins\nporter un ",[206,474,326],{}," pour compter ; un ",[206,477,344],{}," seul est un nom de dossier ordinaire.",[270,480,481,482,345,485,488,489,491],{},"Quand le deuxième domaine arrive, il va dans ",[206,483,484],{},"fronds\u002Fbilling\u002F",[273,486,487],{},"la Frond racine reste\noù elle est"," — rien ne bouge, aucun import n'est réécrit. ",[206,490,308],{}," ne définit pas une\nFrond, c'est là où vivent les autres.",[299,493,495],{"id":494},"fougereconfigts-référence","fougere.config.ts — référence",[199,497,499],{"className":358,"code":498,"language":360,"meta":204,"style":204},"import { defineFougere } from '@fougere\u002Fcore';\nimport { betterAuth } from '@fougere\u002Fauth-better';\nimport User from '.\u002Ffronds\u002Fuser\u002Fentities\u002FUser';\n\nexport default defineFougere({\n  \u002F\u002F Persistance. Trois formes :\n  \u002F\u002F   'sqlite'                          → mémoire côté Nuxt (resemée à chaque reload)\n  \u002F\u002F   { dialect: 'sqlite', path: '…' }  → fichier (survit aux reloads et aux deploys)\n  \u002F\u002F   false                             → pas de db\n  db: { dialect: 'sqlite', path: '.data\u002Fapp.db' },\n\n  \u002F\u002F Où vivent les lignes, quand elles ne vivent pas toutes dans `db`. Une entité\n  \u002F\u002F que ceci ne nomme pas reste dans la source par défaut : une seule base ne\n  \u002F\u002F déclare donc rien du tout.\n  \u002F\u002F sources: { archive: { path: '\u002Fmnt\u002Flegacy\u002Fcatalog.db', entities: ['Book'] } },\n\n  \u002F\u002F Topologie. Une Frond listée ici reste SCANNÉE (ses entités continuent de\n  \u002F\u002F nourrir formulaires et validation en metadata) mais n'est pas hébergée\n  \u002F\u002F localement : les appels voyagent en JSON-RPC vers le process qui l'héberge.\n  \u002F\u002F Commenter la ligne → in-process.\n  \u002F\u002F remotes: { blog: 'http:\u002F\u002F127.0.0.1:4100' },\n\n  \u002F\u002F Auth (optionnel) — better-auth derrière une fine couche de traduction.\n  auth: betterAuth({\n    user: User,                             \u002F\u002F votre entité qui étend AuthUser\n    secret: process.env.AUTH_SECRET!,       \u002F\u002F 32+ caractères\n    baseUrl: process.env.SITE_URL ?? 'http:\u002F\u002Flocalhost:3000',\n    basePath: '\u002Fauth',                      \u002F\u002F monte \u002Fauth\u002F** (sign-in, sign-up, sign-out…)\n    trustedOrigins: ['http:\u002F\u002Flocalhost:3000'],\n    sessionTtl: 30 * 24 * 60 * 60 * 1000,\n    providers: {\n      credential: { minPasswordLength: 8, autoSignIn: true },\n      \u002F\u002F google: { clientId: …, clientSecret: … },\n    },\n  }),\n});\n",[206,500,501,526,548,567,574,592,599,605,611,617,659,664,670,676,682,688,693,699,705,711,717,723,728,734,748,764,795,826,846,868,902,913,944,950,956,967],{"__ignoreMap":204},[209,502,503,505,508,511,514,517,519,522,524],{"class":211,"line":212},[209,504,368],{"class":367},[209,506,507],{"class":251}," {",[209,509,510],{"class":371}," defineFougere",[209,512,513],{"class":251}," }",[209,515,516],{"class":367}," from",[209,518,379],{"class":378},[209,520,521],{"class":219},"@fougere\u002Fcore",[209,523,385],{"class":378},[209,525,388],{"class":251},[209,527,528,530,532,535,537,539,541,544,546],{"class":211,"line":242},[209,529,368],{"class":367},[209,531,507],{"class":251},[209,533,534],{"class":371}," betterAuth",[209,536,513],{"class":251},[209,538,516],{"class":367},[209,540,379],{"class":378},[209,542,543],{"class":219},"@fougere\u002Fauth-better",[209,545,385],{"class":378},[209,547,388],{"class":251},[209,549,551,553,556,558,560,563,565],{"class":211,"line":550},3,[209,552,368],{"class":367},[209,554,555],{"class":371}," User ",[209,557,375],{"class":367},[209,559,379],{"class":378},[209,561,562],{"class":219},".\u002Ffronds\u002Fuser\u002Fentities\u002FUser",[209,564,385],{"class":378},[209,566,388],{"class":251},[209,568,570],{"class":211,"line":569},4,[209,571,573],{"emptyLinePlaceholder":572},true,"\n",[209,575,577,580,583,586,589],{"class":211,"line":576},5,[209,578,579],{"class":367},"export",[209,581,582],{"class":367}," default",[209,584,510],{"class":585},"sGLFI",[209,587,588],{"class":371},"(",[209,590,591],{"class":251},"{\n",[209,593,595],{"class":211,"line":594},6,[209,596,598],{"class":597},"sutJx","  \u002F\u002F Persistance. Trois formes :\n",[209,600,602],{"class":211,"line":601},7,[209,603,604],{"class":597},"  \u002F\u002F   'sqlite'                          → mémoire côté Nuxt (resemée à chaque reload)\n",[209,606,608],{"class":211,"line":607},8,[209,609,610],{"class":597},"  \u002F\u002F   { dialect: 'sqlite', path: '…' }  → fichier (survit aux reloads et aux deploys)\n",[209,612,614],{"class":211,"line":613},9,[209,615,616],{"class":597},"  \u002F\u002F   false                             → pas de db\n",[209,618,620,624,627,629,632,634,636,639,641,644,647,649,651,654,656],{"class":211,"line":619},10,[209,621,623],{"class":622},"skxfh","  db",[209,625,626],{"class":251},":",[209,628,507],{"class":251},[209,630,631],{"class":622}," dialect",[209,633,626],{"class":251},[209,635,379],{"class":378},[209,637,638],{"class":219},"sqlite",[209,640,385],{"class":378},[209,642,643],{"class":251},",",[209,645,646],{"class":622}," path",[209,648,626],{"class":251},[209,650,379],{"class":378},[209,652,653],{"class":219},".data\u002Fapp.db",[209,655,385],{"class":378},[209,657,658],{"class":251}," },\n",[209,660,662],{"class":211,"line":661},11,[209,663,573],{"emptyLinePlaceholder":572},[209,665,667],{"class":211,"line":666},12,[209,668,669],{"class":597},"  \u002F\u002F Où vivent les lignes, quand elles ne vivent pas toutes dans `db`. Une entité\n",[209,671,673],{"class":211,"line":672},13,[209,674,675],{"class":597},"  \u002F\u002F que ceci ne nomme pas reste dans la source par défaut : une seule base ne\n",[209,677,679],{"class":211,"line":678},14,[209,680,681],{"class":597},"  \u002F\u002F déclare donc rien du tout.\n",[209,683,685],{"class":211,"line":684},15,[209,686,687],{"class":597},"  \u002F\u002F sources: { archive: { path: '\u002Fmnt\u002Flegacy\u002Fcatalog.db', entities: ['Book'] } },\n",[209,689,691],{"class":211,"line":690},16,[209,692,573],{"emptyLinePlaceholder":572},[209,694,696],{"class":211,"line":695},17,[209,697,698],{"class":597},"  \u002F\u002F Topologie. Une Frond listée ici reste SCANNÉE (ses entités continuent de\n",[209,700,702],{"class":211,"line":701},18,[209,703,704],{"class":597},"  \u002F\u002F nourrir formulaires et validation en metadata) mais n'est pas hébergée\n",[209,706,708],{"class":211,"line":707},19,[209,709,710],{"class":597},"  \u002F\u002F localement : les appels voyagent en JSON-RPC vers le process qui l'héberge.\n",[209,712,714],{"class":211,"line":713},20,[209,715,716],{"class":597},"  \u002F\u002F Commenter la ligne → in-process.\n",[209,718,720],{"class":211,"line":719},21,[209,721,722],{"class":597},"  \u002F\u002F remotes: { blog: 'http:\u002F\u002F127.0.0.1:4100' },\n",[209,724,726],{"class":211,"line":725},22,[209,727,573],{"emptyLinePlaceholder":572},[209,729,731],{"class":211,"line":730},23,[209,732,733],{"class":597},"  \u002F\u002F Auth (optionnel) — better-auth derrière une fine couche de traduction.\n",[209,735,737,740,742,744,746],{"class":211,"line":736},24,[209,738,739],{"class":622},"  auth",[209,741,626],{"class":251},[209,743,534],{"class":585},[209,745,588],{"class":371},[209,747,591],{"class":251},[209,749,751,754,756,759,761],{"class":211,"line":750},25,[209,752,753],{"class":622},"    user",[209,755,626],{"class":251},[209,757,758],{"class":371}," User",[209,760,643],{"class":251},[209,762,763],{"class":597},"                             \u002F\u002F votre entité qui étend AuthUser\n",[209,765,767,770,772,775,777,780,782,786,790,792],{"class":211,"line":766},26,[209,768,769],{"class":622},"    secret",[209,771,626],{"class":251},[209,773,774],{"class":371}," process",[209,776,297],{"class":251},[209,778,779],{"class":371},"env",[209,781,297],{"class":251},[209,783,785],{"class":784},"s_hVV","AUTH_SECRET",[209,787,789],{"class":788},"smGrS","!",[209,791,643],{"class":251},[209,793,794],{"class":597},"       \u002F\u002F 32+ caractères\n",[209,796,798,801,803,805,807,809,811,814,817,819,822,824],{"class":211,"line":797},27,[209,799,800],{"class":622},"    baseUrl",[209,802,626],{"class":251},[209,804,774],{"class":371},[209,806,297],{"class":251},[209,808,779],{"class":371},[209,810,297],{"class":251},[209,812,813],{"class":784},"SITE_URL",[209,815,816],{"class":788}," ??",[209,818,379],{"class":378},[209,820,821],{"class":219},"http:\u002F\u002Flocalhost:3000",[209,823,385],{"class":378},[209,825,331],{"class":251},[209,827,829,832,834,836,839,841,843],{"class":211,"line":828},28,[209,830,831],{"class":622},"    basePath",[209,833,626],{"class":251},[209,835,379],{"class":378},[209,837,838],{"class":219},"\u002Fauth",[209,840,385],{"class":378},[209,842,643],{"class":251},[209,844,845],{"class":597},"                      \u002F\u002F monte \u002Fauth\u002F** (sign-in, sign-up, sign-out…)\n",[209,847,849,852,854,857,859,861,863,866],{"class":211,"line":848},29,[209,850,851],{"class":622},"    trustedOrigins",[209,853,626],{"class":251},[209,855,856],{"class":371}," [",[209,858,385],{"class":378},[209,860,821],{"class":219},[209,862,385],{"class":378},[209,864,865],{"class":371},"]",[209,867,331],{"class":251},[209,869,871,874,876,880,883,886,888,891,893,895,897,900],{"class":211,"line":870},30,[209,872,873],{"class":622},"    sessionTtl",[209,875,626],{"class":251},[209,877,879],{"class":878},"srdBf"," 30",[209,881,882],{"class":788}," *",[209,884,885],{"class":878}," 24",[209,887,882],{"class":788},[209,889,890],{"class":878}," 60",[209,892,882],{"class":788},[209,894,890],{"class":878},[209,896,882],{"class":788},[209,898,899],{"class":878}," 1000",[209,901,331],{"class":251},[209,903,905,908,910],{"class":211,"line":904},31,[209,906,907],{"class":622},"    providers",[209,909,626],{"class":251},[209,911,912],{"class":251}," {\n",[209,914,916,919,921,923,926,928,931,933,936,938,942],{"class":211,"line":915},32,[209,917,918],{"class":622},"      credential",[209,920,626],{"class":251},[209,922,507],{"class":251},[209,924,925],{"class":622}," minPasswordLength",[209,927,626],{"class":251},[209,929,930],{"class":878}," 8",[209,932,643],{"class":251},[209,934,935],{"class":622}," autoSignIn",[209,937,626],{"class":251},[209,939,941],{"class":940},"syTEX"," true",[209,943,658],{"class":251},[209,945,947],{"class":211,"line":946},33,[209,948,949],{"class":597},"      \u002F\u002F google: { clientId: …, clientSecret: … },\n",[209,951,953],{"class":211,"line":952},34,[209,954,955],{"class":251},"    },\n",[209,957,959,962,965],{"class":211,"line":958},35,[209,960,961],{"class":251},"  }",[209,963,964],{"class":371},")",[209,966,331],{"class":251},[209,968,970,973,975],{"class":211,"line":969},36,[209,971,972],{"class":251},"}",[209,974,964],{"class":371},[209,976,388],{"class":251},[270,978,979],{},"Les tables dérivent de vos entités. Au boot, l'auto-DDL SQLite crée les tables manquantes\net ajoute les colonnes absentes. Renommages, suppressions et changements de type demandent\nune migration explicite. Les seeds tournent après cette synchronisation et appellent les\nopérations avec leur validation habituelle.",[270,981,982,983,986,987,990,991,297],{},"Une application à plusieurs bases les déclare sous ",[206,984,985],{},"sources:",", et une Frond qui doit\ninterroger à travers déclare ",[206,988,989],{},"reads:"," — voir ",[294,992,170],{"href":171},[299,994,996],{"id":995},"lancer","Lancer",[199,998,1000],{"className":201,"code":999,"language":203,"meta":204,"style":204},"pnpm install\npnpm dev          # scan → synchronise le schéma additif → seed → sert sur :3000\n",[206,1001,1002,1010],{"__ignoreMap":204},[209,1003,1004,1007],{"class":211,"line":212},[209,1005,1006],{"class":215},"pnpm",[209,1008,1009],{"class":219}," install\n",[209,1011,1012,1014,1017],{"class":211,"line":242},[209,1013,1006],{"class":215},[209,1015,1016],{"class":219}," dev",[209,1018,1019],{"class":597},"          # scan → synchronise le schéma additif → seed → sert sur :3000\n",[270,1021,1022],{},"Vérifiez dans le log de boot le nombre de Fronds détectées :",[199,1024,1027],{"className":1025,"code":1026,"language":315},[313],"INF [boot:app] scanned 2 frond(s) in 467ms\nINF [boot] ready in 483ms — 2 frond(s) + auth (\u002Fauth)\n",[206,1028,1026],{"__ignoreMap":204},[270,1030,1031,1032,1034],{},"Suite : ",[294,1033,59],{"href":60}," — le vocabulaire des champs et les quatre axes.",[1036,1037,1038],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":204,"searchDepth":242,"depth":242,"links":1040},[1041,1045,1046],{"id":301,"depth":242,"text":302,"children":1042},[1043],{"id":443,"depth":550,"text":1044},"Un seul domaine, pas de fronds\u002F du tout",{"id":494,"depth":242,"text":495},{"id":995,"depth":242,"text":996},"Structure d'une app Fougere et référence de fougere.config.ts.","md",{},{"title":16,"description":1047},"JqY29CZWDJ0RBBzDSn-vGTJ3CZS_BaWBKepf02t9qs8",1788598417581]