[{"data":1,"prerenderedAt":2068},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fschema\u002Fcard":137},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,45,66,95,116],{"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},"App Nuxt existante","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F03.cli",{"title":28,"path":29,"stem":30,"children":31,"page":44},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[32,36,40],{"title":33,"path":34,"stem":35},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":37,"path":38,"stem":39},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":41,"path":42,"stem":43},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",false,{"title":46,"path":47,"stem":48,"children":49,"page":44},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[50,54,58,62],{"title":51,"path":52,"stem":53},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":55,"path":56,"stem":57},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":59,"path":60,"stem":61},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":63,"path":64,"stem":65},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":67,"path":68,"stem":69,"children":70,"page":44},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[71,75,79,83,87,91],{"title":72,"path":73,"stem":74},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":76,"path":77,"stem":78},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":80,"path":81,"stem":82},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":84,"path":85,"stem":86},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":88,"path":89,"stem":90},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":92,"path":93,"stem":94},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":96,"path":97,"stem":98,"children":99,"page":44},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[100,104,108,112],{"title":101,"path":102,"stem":103},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":105,"path":106,"stem":107},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":109,"path":110,"stem":111},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":113,"path":114,"stem":115},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":117,"path":118,"stem":119,"children":120,"page":44},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[121,125,129,133],{"title":122,"path":123,"stem":124},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":126,"path":127,"stem":128},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":130,"path":131,"stem":132},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":134,"path":135,"stem":136},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"id":138,"title":59,"body":139,"description":2063,"extension":2064,"meta":2065,"navigation":231,"path":60,"seo":2066,"stem":61,"__hash__":2067},"docs_fr\u002Ffr\u002Fdocs\u002F3.schema\u002F3.card.md",{"type":140,"value":141,"toc":2049},"minimark",[142,146,155,174,281,291,305,356,361,376,975,992,998,1004,1170,1179,1193,1217,1223,1229,1252,1258,1262,1275,1348,1362,1366,1369,1394,1397,1404,1414,1870,1905,1918,1923,1929,1947,1956,1966,1970,1973,2027,2030,2039,2045],[143,144,59],"h1",{"id":145},"la-carte-didentité",[147,148,149,150,154],"p",{},"Une classe TypeScript ne peut pas être sérialisée directement. Sa ",[151,152,153],"strong",{},"carte"," est un document\nJSON qui décrit le schéma et permet à un consommateur de reconstruire une classe de\nvalidation.",[147,156,157,158,165,166,169,170,173],{},"Les deux sont duales. ",[159,160,161],"a",{"href":64},[162,163,164],"code",{},"~standard"," remet le juge\n",[151,167,168],{},"vivant"," à une bibliothèque du même processus ; la carte est la description\n",[151,171,172],{},"sérialisable"," de la même déclaration, pour les échanges entre processus ou langages.",[175,176,181],"pre",{"className":177,"code":178,"language":179,"meta":180,"style":180},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import { describe, reconstruct } from '@fougere\u002Fschema';\n\nconst card = describe(Post);       \u002F\u002F schéma → document JSON\nconst Rebuilt = reconstruct(card); \u002F\u002F document → schéma vivant (validate + from)\n","ts","",[162,182,183,226,233,261],{"__ignoreMap":180},[184,185,188,192,196,200,203,206,209,212,216,220,223],"span",{"class":186,"line":187},"line",1,[184,189,191],{"class":190},"sVHd0","import",[184,193,195],{"class":194},"sP7_E"," {",[184,197,199],{"class":198},"su5hD"," describe",[184,201,202],{"class":194},",",[184,204,205],{"class":198}," reconstruct",[184,207,208],{"class":194}," }",[184,210,211],{"class":190}," from",[184,213,215],{"class":214},"sjJ54"," '",[184,217,219],{"class":218},"s_sjI","@fougere\u002Fschema",[184,221,222],{"class":214},"'",[184,224,225],{"class":194},";\n",[184,227,229],{"class":186,"line":228},2,[184,230,232],{"emptyLinePlaceholder":231},true,"\n",[184,234,236,240,244,248,251,254,257],{"class":186,"line":235},3,[184,237,239],{"class":238},"sbsja","const",[184,241,243],{"class":242},"s_hVV"," card",[184,245,247],{"class":246},"smGrS"," =",[184,249,199],{"class":250},"sGLFI",[184,252,253],{"class":198},"(Post)",[184,255,256],{"class":194},";",[184,258,260],{"class":259},"sutJx","       \u002F\u002F schéma → document JSON\n",[184,262,264,266,269,271,273,276,278],{"class":186,"line":263},4,[184,265,239],{"class":238},[184,267,268],{"class":242}," Rebuilt",[184,270,247],{"class":246},[184,272,205],{"class":250},[184,274,275],{"class":198},"(card)",[184,277,256],{"class":194},[184,279,280],{"class":259}," \u002F\u002F document → schéma vivant (validate + from)\n",[147,282,283,286,287,290],{},[162,284,285],{},"describe"," produit le document canonique utilisé par les adapters. ",[162,288,289],{},"reconstruct"," rebâtit\nle schéma chez le consommateur, qui peut ensuite valider les données localement.",[147,292,293,294,297,298,304],{},"Énoncez la forme d'une ligne et le schéma rebâti est une classe au sens plein — un seul\nnom porte le juge et le type de ce qu'il juge, exactement comme ",[162,295,296],{},"class Post extends entity({…}) {}",". C'est ce qu'écrit ",[159,299,301],{"href":300},"\u002Ffr\u002Fdocs\u002Fcli#fougere-sync--consommer-une-frond-distante",[162,302,303],{},"fougere sync"," :",[175,306,308],{"className":177,"code":307,"language":179,"meta":180,"style":180},"class Post extends reconstruct\u003C{ id: string; title: string }>(card) {}\n",[162,309,310],{"__ignoreMap":180},[184,311,312,315,319,322,324,327,331,334,338,340,343,345,347,350,353],{"class":186,"line":187},[184,313,314],{"class":238},"class",[184,316,318],{"class":317},"sbgvK"," Post",[184,320,321],{"class":238}," extends",[184,323,205],{"class":250},[184,325,326],{"class":194},"\u003C{",[184,328,330],{"class":329},"sucvu"," id",[184,332,333],{"class":246},":",[184,335,337],{"class":336},"sZMiF"," string",[184,339,256],{"class":194},[184,341,342],{"class":329}," title",[184,344,333],{"class":246},[184,346,337],{"class":336},[184,348,349],{"class":194}," }>",[184,351,352],{"class":198},"(card) ",[184,354,355],{"class":194},"{}\n",[357,358,360],"h2",{"id":359},"la-structure","La structure",[147,362,363,364,367,368,371,372,375],{},"La carte est un document JSON Schema valide. L'axe ",[162,365,366],{},"shape"," ",[151,369,370],{},"est"," ce vocabulaire, donc\nses mots-clés vivent au niveau supérieur du champ ; les trois autres axes vivent sous la\nclé d'extension ",[162,373,374],{},"x-fougere",".",[175,377,381],{"className":378,"code":379,"language":380,"meta":180,"style":180},"language-jsonc shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"title\": \"post\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"x-fougere\": {\n        \"role\": { \"primary\": true },\n        \"lifecycle\": { \"create\": { \"generate\": \"cuid2\" } }\n      }\n    },\n    \"title\": { \"type\": \"string\", \"minLength\": 3, \"maxLength\": 120 },\n    \"status\": { \"type\": \"string\", \"enum\": [\"draft\", \"published\"] },\n    \"publishedAt\": {\n      \"type\": [\"string\", \"null\"],\n      \"format\": \"date-time\",\n      \"x-fougere\": { \"lifecycle\": { \"update\": \"forbidden\" } }\n    },\n    \"secret\": { \"type\": \"string\", \"x-fougere\": { \"boundary\": { \"out\": \"closed\" } } }\n  },\n  \"required\": [\"title\", \"status\"],\n  \"x-fougere-version\": 1,\n  \"x-fougere-vendor\": \"fougere\"\n}\n","jsonc",[162,382,383,388,414,434,448,463,485,498,530,577,583,589,646,709,723,754,775,818,823,896,902,932,949,969],{"__ignoreMap":180},[184,384,385],{"class":186,"line":187},[184,386,387],{"class":194},"{\n",[184,389,390,394,398,401,403,406,409,411],{"class":186,"line":228},[184,391,393],{"class":392},"s39Yj","  \"",[184,395,397],{"class":396},"sseR_","title",[184,399,400],{"class":392},"\"",[184,402,333],{"class":194},[184,404,405],{"class":214}," \"",[184,407,408],{"class":218},"post",[184,410,400],{"class":214},[184,412,413],{"class":194},",\n",[184,415,416,418,421,423,425,427,430,432],{"class":186,"line":235},[184,417,393],{"class":392},[184,419,420],{"class":396},"type",[184,422,400],{"class":392},[184,424,333],{"class":194},[184,426,405],{"class":214},[184,428,429],{"class":218},"object",[184,431,400],{"class":214},[184,433,413],{"class":194},[184,435,436,438,441,443,445],{"class":186,"line":263},[184,437,393],{"class":392},[184,439,440],{"class":396},"properties",[184,442,400],{"class":392},[184,444,333],{"class":194},[184,446,447],{"class":194}," {\n",[184,449,451,454,457,459,461],{"class":186,"line":450},5,[184,452,453],{"class":392},"    \"",[184,455,456],{"class":336},"id",[184,458,400],{"class":392},[184,460,333],{"class":194},[184,462,447],{"class":194},[184,464,466,469,472,474,476,478,481,483],{"class":186,"line":465},6,[184,467,468],{"class":392},"      \"",[184,470,420],{"class":471},"srdBf",[184,473,400],{"class":392},[184,475,333],{"class":194},[184,477,405],{"class":214},[184,479,480],{"class":218},"string",[184,482,400],{"class":214},[184,484,413],{"class":194},[184,486,488,490,492,494,496],{"class":186,"line":487},7,[184,489,468],{"class":392},[184,491,374],{"class":471},[184,493,400],{"class":392},[184,495,333],{"class":194},[184,497,447],{"class":194},[184,499,501,504,508,510,512,514,516,520,522,524,527],{"class":186,"line":500},8,[184,502,503],{"class":392},"        \"",[184,505,507],{"class":506},"swQdS","role",[184,509,400],{"class":392},[184,511,333],{"class":194},[184,513,195],{"class":194},[184,515,405],{"class":392},[184,517,519],{"class":518},"sAQsV","primary",[184,521,400],{"class":392},[184,523,333],{"class":194},[184,525,526],{"class":392}," true",[184,528,529],{"class":194}," },\n",[184,531,533,535,538,540,542,544,546,549,551,553,555,557,561,563,565,567,570,572,574],{"class":186,"line":532},9,[184,534,503],{"class":392},[184,536,537],{"class":506},"lifecycle",[184,539,400],{"class":392},[184,541,333],{"class":194},[184,543,195],{"class":194},[184,545,405],{"class":392},[184,547,548],{"class":518},"create",[184,550,400],{"class":392},[184,552,333],{"class":194},[184,554,195],{"class":194},[184,556,405],{"class":392},[184,558,560],{"class":559},"sptTA","generate",[184,562,400],{"class":392},[184,564,333],{"class":194},[184,566,405],{"class":214},[184,568,569],{"class":218},"cuid2",[184,571,400],{"class":214},[184,573,208],{"class":194},[184,575,576],{"class":194}," }\n",[184,578,580],{"class":186,"line":579},10,[184,581,582],{"class":194},"      }\n",[184,584,586],{"class":186,"line":585},11,[184,587,588],{"class":194},"    },\n",[184,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,623,625,627,630,632,634,637,639,641,644],{"class":186,"line":591},12,[184,593,453],{"class":392},[184,595,397],{"class":336},[184,597,400],{"class":392},[184,599,333],{"class":194},[184,601,195],{"class":194},[184,603,405],{"class":392},[184,605,420],{"class":471},[184,607,400],{"class":392},[184,609,333],{"class":194},[184,611,405],{"class":214},[184,613,480],{"class":218},[184,615,400],{"class":214},[184,617,202],{"class":194},[184,619,405],{"class":392},[184,621,622],{"class":471},"minLength",[184,624,400],{"class":392},[184,626,333],{"class":194},[184,628,629],{"class":471}," 3",[184,631,202],{"class":194},[184,633,405],{"class":392},[184,635,636],{"class":471},"maxLength",[184,638,400],{"class":392},[184,640,333],{"class":194},[184,642,643],{"class":471}," 120",[184,645,529],{"class":194},[184,647,649,651,654,656,658,660,662,664,666,668,670,672,674,676,678,681,683,685,688,690,693,695,697,699,702,704,707],{"class":186,"line":648},13,[184,650,453],{"class":392},[184,652,653],{"class":336},"status",[184,655,400],{"class":392},[184,657,333],{"class":194},[184,659,195],{"class":194},[184,661,405],{"class":392},[184,663,420],{"class":471},[184,665,400],{"class":392},[184,667,333],{"class":194},[184,669,405],{"class":214},[184,671,480],{"class":218},[184,673,400],{"class":214},[184,675,202],{"class":194},[184,677,405],{"class":392},[184,679,680],{"class":471},"enum",[184,682,400],{"class":392},[184,684,333],{"class":194},[184,686,687],{"class":194}," [",[184,689,400],{"class":214},[184,691,692],{"class":218},"draft",[184,694,400],{"class":214},[184,696,202],{"class":194},[184,698,405],{"class":214},[184,700,701],{"class":218},"published",[184,703,400],{"class":214},[184,705,706],{"class":194},"]",[184,708,529],{"class":194},[184,710,712,714,717,719,721],{"class":186,"line":711},14,[184,713,453],{"class":392},[184,715,716],{"class":336},"publishedAt",[184,718,400],{"class":392},[184,720,333],{"class":194},[184,722,447],{"class":194},[184,724,726,728,730,732,734,736,738,740,742,744,746,749,751],{"class":186,"line":725},15,[184,727,468],{"class":392},[184,729,420],{"class":471},[184,731,400],{"class":392},[184,733,333],{"class":194},[184,735,687],{"class":194},[184,737,400],{"class":214},[184,739,480],{"class":218},[184,741,400],{"class":214},[184,743,202],{"class":194},[184,745,405],{"class":214},[184,747,748],{"class":218},"null",[184,750,400],{"class":214},[184,752,753],{"class":194},"],\n",[184,755,757,759,762,764,766,768,771,773],{"class":186,"line":756},16,[184,758,468],{"class":392},[184,760,761],{"class":471},"format",[184,763,400],{"class":392},[184,765,333],{"class":194},[184,767,405],{"class":214},[184,769,770],{"class":218},"date-time",[184,772,400],{"class":214},[184,774,413],{"class":194},[184,776,778,780,782,784,786,788,790,792,794,796,798,800,803,805,807,809,812,814,816],{"class":186,"line":777},17,[184,779,468],{"class":392},[184,781,374],{"class":471},[184,783,400],{"class":392},[184,785,333],{"class":194},[184,787,195],{"class":194},[184,789,405],{"class":392},[184,791,537],{"class":506},[184,793,400],{"class":392},[184,795,333],{"class":194},[184,797,195],{"class":194},[184,799,405],{"class":392},[184,801,802],{"class":518},"update",[184,804,400],{"class":392},[184,806,333],{"class":194},[184,808,405],{"class":214},[184,810,811],{"class":218},"forbidden",[184,813,400],{"class":214},[184,815,208],{"class":194},[184,817,576],{"class":194},[184,819,821],{"class":186,"line":820},18,[184,822,588],{"class":194},[184,824,826,828,831,833,835,837,839,841,843,845,847,849,851,853,855,857,859,861,863,865,868,870,872,874,876,879,881,883,885,888,890,892,894],{"class":186,"line":825},19,[184,827,453],{"class":392},[184,829,830],{"class":336},"secret",[184,832,400],{"class":392},[184,834,333],{"class":194},[184,836,195],{"class":194},[184,838,405],{"class":392},[184,840,420],{"class":471},[184,842,400],{"class":392},[184,844,333],{"class":194},[184,846,405],{"class":214},[184,848,480],{"class":218},[184,850,400],{"class":214},[184,852,202],{"class":194},[184,854,405],{"class":392},[184,856,374],{"class":471},[184,858,400],{"class":392},[184,860,333],{"class":194},[184,862,195],{"class":194},[184,864,405],{"class":392},[184,866,867],{"class":506},"boundary",[184,869,400],{"class":392},[184,871,333],{"class":194},[184,873,195],{"class":194},[184,875,405],{"class":392},[184,877,878],{"class":518},"out",[184,880,400],{"class":392},[184,882,333],{"class":194},[184,884,405],{"class":214},[184,886,887],{"class":218},"closed",[184,889,400],{"class":214},[184,891,208],{"class":194},[184,893,208],{"class":194},[184,895,576],{"class":194},[184,897,899],{"class":186,"line":898},20,[184,900,901],{"class":194},"  },\n",[184,903,905,907,910,912,914,916,918,920,922,924,926,928,930],{"class":186,"line":904},21,[184,906,393],{"class":392},[184,908,909],{"class":396},"required",[184,911,400],{"class":392},[184,913,333],{"class":194},[184,915,687],{"class":194},[184,917,400],{"class":214},[184,919,397],{"class":218},[184,921,400],{"class":214},[184,923,202],{"class":194},[184,925,405],{"class":214},[184,927,653],{"class":218},[184,929,400],{"class":214},[184,931,753],{"class":194},[184,933,935,937,940,942,944,947],{"class":186,"line":934},22,[184,936,393],{"class":392},[184,938,939],{"class":396},"x-fougere-version",[184,941,400],{"class":392},[184,943,333],{"class":194},[184,945,946],{"class":471}," 1",[184,948,413],{"class":194},[184,950,952,954,957,959,961,963,966],{"class":186,"line":951},23,[184,953,393],{"class":392},[184,955,956],{"class":396},"x-fougere-vendor",[184,958,400],{"class":392},[184,960,333],{"class":194},[184,962,405],{"class":214},[184,964,965],{"class":218},"fougere",[184,967,968],{"class":214},"\"\n",[184,970,972],{"class":186,"line":971},24,[184,973,974],{"class":194},"}\n",[147,976,977,978,981,982,985,986,988,989,991],{},"Un champ nullable se replie dans l'union ",[162,979,980],{},"type: [\"T\", \"null\"]"," — la nullité est du shape,\ndonc du JSON Schema standard. Un objet embarqué (",[162,983,984],{},"json(Entity)",") porte ses ",[162,987,440],{}," et\nson ",[162,990,909],{}," imbriqués, eux aussi purement shape.",[357,993,995,996],{"id":994},"les-trois-axes-sous-x-fougere","Les trois axes sous ",[162,997,374],{},[147,999,1000,1001,1003],{},"Les valeurs de ",[162,1002,374],{}," sont des noms et des structures JSON. Aucun descripteur séparé\nn'est nécessaire.",[1005,1006,1007,1023],"table",{},[1008,1009,1010],"thead",{},[1011,1012,1013,1017,1020],"tr",{},[1014,1015,1016],"th",{},"clé",[1014,1018,1019],{},"valeurs",[1014,1021,1022],{},"ce que ça énonce",[1024,1025,1026,1042,1057,1071,1093,1118,1135,1153],"tbody",{},[1011,1027,1028,1034,1039],{},[1029,1030,1031],"td",{},[162,1032,1033],{},"role.primary",[1029,1035,1036],{},[162,1037,1038],{},"true",[1029,1040,1041],{},"identité — le système la possède",[1011,1043,1044,1049,1054],{},[1029,1045,1046],{},[162,1047,1048],{},"role.unique",[1029,1050,1051],{},[162,1052,1053],{},"[[\"slug\"], [\"listId\",\"docId\"]]",[1029,1055,1056],{},"les contraintes d'unicité dont ce champ est membre — une liste de membres par contrainte, nommés. Un champ seul est le cas dégénéré : une contrainte d'un membre. Le DDL les émet",[1011,1058,1059,1064,1068],{},[1029,1060,1061],{},[162,1062,1063],{},"role.index",[1029,1065,1066],{},[162,1067,1038],{},[1029,1069,1070],{},"contrainte de stockage — le DDL l'émet",[1011,1072,1073,1078,1083],{},[1029,1074,1075],{},[162,1076,1077],{},"role.relation",[1029,1079,1080],{},[162,1081,1082],{},"{ to, kind: 'one'|'many', onDelete? }",[1029,1084,1085,1088,1089,1092],{},[162,1086,1087],{},"to"," est un ",[151,1090,1091],{},"nom",", pas un schéma inliné",[1011,1094,1095,1100,1115],{},[1029,1096,1097],{},[162,1098,1099],{},"lifecycle.create",[1029,1101,1102,1105,1106,1105,1109,1105,1112],{},[162,1103,1104],{},"{ value }"," | ",[162,1107,1108],{},"'now'",[162,1110,1111],{},"{ generate }",[162,1113,1114],{},"'optional'",[1029,1116,1117],{},"qui écrit à la création, et quand",[1011,1119,1120,1125,1132],{},[1029,1121,1122],{},[162,1123,1124],{},"lifecycle.update",[1029,1126,1127,1105,1129],{},[162,1128,1108],{},[162,1130,1131],{},"'forbidden'",[1029,1133,1134],{},"qui écrit à la mise à jour",[1011,1136,1137,1142,1150],{},[1029,1138,1139],{},[162,1140,1141],{},"boundary.in",[1029,1143,1144,1105,1147],{},[162,1145,1146],{},"'closed'",[162,1148,1149],{},"{ decode }",[1029,1151,1152],{},"lecture seule, ou conversion entrante nommée",[1011,1154,1155,1160,1167],{},[1029,1156,1157],{},[162,1158,1159],{},"boundary.out",[1029,1161,1162,1105,1164],{},[162,1163,1146],{},[162,1165,1166],{},"{ encode }",[1029,1168,1169],{},"écriture seule, ou conversion sortante nommée",[147,1171,1172,1173,1175,1176,1178],{},"Une clé absente vaut « ouvert » : pas de ",[162,1174,1099],{}," signifie que l'appelant doit\nfournir la valeur ; pas de ",[162,1177,867],{}," signifie identité dans les deux sens.",[147,1180,1181,1182,1184,1185,1188,1189,1192],{},"Seul un ",[162,1183,867],{}," explicitement déclaré est émis. Le comportement déduit du shape, par\nexemple le décodage de ",[162,1186,1187],{},"format: date-time"," en ",[162,1190,1191],{},"Date",", est recalculé à la reconstruction.",[147,1194,1195,1197,1198,1201,1202,1205,1206,1208,1209,1212,1213,1216],{},[162,1196,1048],{}," nomme toujours ses membres dans le document, y compris pour une contrainte\nd'un seul champ (",[162,1199,1200],{},"[[\"slug\"]]","). En mémoire, un ",[162,1203,1204],{},"unique()"," seul ne connaît pas encore sa clé ;\n",[162,1207,285],{}," la résout depuis l'objet passé à ",[162,1210,1211],{},"entity({...})",". Une contrainte composée comme\n",[162,1214,1215],{},"(listId, docId)"," apparaît en entier sur chacun de ses membres.",[357,1218,1220,1221],{"id":1219},"sémantique-de-required","Sémantique de ",[162,1222,909],{},[147,1224,1225,1226,1228],{},"Dans une carte Fougere, ",[162,1227,909],{}," a une portée plus précise que dans JSON Schema seul.",[147,1230,1231,1233,1234,1237,1238,1240,1241,1244,1245,1248,1249,1251],{},[162,1232,909],{}," liste ",[151,1235,1236],{},"les noms qu'un appelant doit fournir à la création"," — ceux dont aucune\nrègle ",[162,1239,1099],{}," ne répond de l'absence, et qui ne sont pas une relation ",[162,1242,1243],{},"many","\n(absente → ",[162,1246,1247],{},"[]","). C'est plus étroit que le ",[162,1250,909],{}," de JSON Schema, qui est\ncontext-free et répond « qu'est-ce qui est toujours présent en lecture ? ».",[147,1253,1254,1255,1257],{},"Un champ nullable reste donc requis : l'appelant peut fournir ",[162,1256,748],{},", mais ne peut pas\nomettre la clé. Présence et nullité restent deux notions distinctes.",[357,1259,1261],{"id":1260},"le-bundle-plusieurs-entités-relations-comprises","Le bundle — plusieurs entités, relations comprises",[147,1263,1264,1267,1268,1271,1272,375],{},[162,1265,1266],{},"describeSet"," produit un document ",[162,1269,1270],{},"$defs"," autonome. Chaque entité utilise son nom en\nminuscules, qui correspond à la valeur de ",[162,1273,1274],{},"relation.to",[175,1276,1278],{"className":177,"code":1277,"language":179,"meta":180,"style":180},"const bundle = describeSet({ post: Post, author: Author });\nconst { post, author } = reconstructSet(bundle);\n",[162,1279,1280,1324],{"__ignoreMap":180},[184,1281,1282,1284,1287,1289,1292,1295,1298,1302,1304,1306,1308,1311,1313,1316,1319,1322],{"class":186,"line":187},[184,1283,239],{"class":238},[184,1285,1286],{"class":242}," bundle",[184,1288,247],{"class":246},[184,1290,1291],{"class":250}," describeSet",[184,1293,1294],{"class":198},"(",[184,1296,1297],{"class":194},"{",[184,1299,1301],{"class":1300},"skxfh"," post",[184,1303,333],{"class":194},[184,1305,318],{"class":198},[184,1307,202],{"class":194},[184,1309,1310],{"class":1300}," author",[184,1312,333],{"class":194},[184,1314,1315],{"class":198}," Author ",[184,1317,1318],{"class":194},"}",[184,1320,1321],{"class":198},")",[184,1323,225],{"class":194},[184,1325,1326,1328,1330,1332,1334,1336,1338,1340,1343,1346],{"class":186,"line":228},[184,1327,239],{"class":238},[184,1329,195],{"class":194},[184,1331,1301],{"class":242},[184,1333,202],{"class":194},[184,1335,1310],{"class":242},[184,1337,208],{"class":194},[184,1339,247],{"class":246},[184,1341,1342],{"class":250}," reconstructSet",[184,1344,1345],{"class":198},"(bundle)",[184,1347,225],{"class":194},[147,1349,1350,1351,1354,1355,1357,1358,1361],{},"Une relation est un pointeur et non un sous-schéma intégré : ",[162,1352,1353],{},"Post → Author → Post"," produit\ndeux références plutôt qu'une imbrication récursive. ",[162,1356,289],{}," conserve les noms ;\n",[162,1359,1360],{},"reconstructSet"," les résout vers les entités cibles attendues par les adapters.",[357,1363,1365],{"id":1364},"limites-de-sérialisation","Limites de sérialisation",[147,1367,1368],{},"Une carte ne peut contenir que des données sérialisables :",[1370,1371,1372,1385],"ul",{},[1373,1374,1375,367,1378,1380,1381,1384],"li",{},[151,1376,1377],{},"une relation devient un nom.",[162,1379,1360],{}," peut résoudre le thunk ",[162,1382,1383],{},"() => Author","\nà l'intérieur d'un bundle.",[1373,1386,1387,1390,1391,375],{},[151,1388,1389],{},"un générateur ou une conversion custom est référencé par son nom",", puis résolu dans le\nregistre du consommateur. Un nom inconnu produit une erreur locale ",[162,1392,1393],{},"unknown generator",[147,1395,1396],{},"Les axes n'acceptent donc pas de fermeture JavaScript, qui ne pourrait pas être sérialisée.",[357,1398,1400,1403],{"id":1399},"rpcdiscover-la-carte-dune-app-entière",[162,1401,1402],{},"rpc.discover"," — la carte d'une app entière",[147,1405,1406,1407,1409,1410,1413],{},"Un hôte répond à l'opération réservée ",[162,1408,1402],{}," par ce qu'il héberge. Chaque frond\npublie ",[151,1411,1412],{},"deux listes, et elles sont duales"," : ce qu'on peut appeler, et ce qui sort tout\nseul.",[175,1415,1417],{"className":378,"code":1416,"language":380,"meta":180,"style":180},"{\n  \"fronds\": [{\n    \"name\": \"blog\",\n    \"doors\": [{\n      \"name\": \"post\",\n      \"ops\": [\n        { \"name\": \"list\",     \"kind\": \"query\",   \"output\": { \u002F* une carte *\u002F } },\n        { \"name\": \"findById\", \"kind\": \"query\",   \"output\": { \u002F* une carte *\u002F } },\n        { \"name\": \"create\",   \"kind\": \"command\", \"input\": { \u002F* une carte *\u002F },\n                                                 \"output\": { \u002F* une carte *\u002F } },\n        { \"name\": \"delete\",   \"kind\": \"command\" },\n        { \"name\": \"publish\",  \"kind\": \"command\", \"description\": \"Rendre le post public.\" }\n      ],\n      \"schema\": { \u002F* une carte *\u002F }\n    }],\n    \"facts\": [\n      { \"name\": \"postPublished\", \"schema\": { \u002F* une carte *\u002F } }\n    ]\n  }]\n}\n",[162,1418,1419,1423,1437,1457,1470,1488,1502,1562,1615,1667,1686,1723,1778,1783,1800,1805,1818,1856,1861,1866],{"__ignoreMap":180},[184,1420,1421],{"class":186,"line":187},[184,1422,387],{"class":194},[184,1424,1425,1427,1430,1432,1434],{"class":186,"line":228},[184,1426,393],{"class":392},[184,1428,1429],{"class":396},"fronds",[184,1431,400],{"class":392},[184,1433,333],{"class":194},[184,1435,1436],{"class":194}," [{\n",[184,1438,1439,1441,1444,1446,1448,1450,1453,1455],{"class":186,"line":235},[184,1440,453],{"class":392},[184,1442,1443],{"class":336},"name",[184,1445,400],{"class":392},[184,1447,333],{"class":194},[184,1449,405],{"class":214},[184,1451,1452],{"class":218},"blog",[184,1454,400],{"class":214},[184,1456,413],{"class":194},[184,1458,1459,1461,1464,1466,1468],{"class":186,"line":263},[184,1460,453],{"class":392},[184,1462,1463],{"class":336},"doors",[184,1465,400],{"class":392},[184,1467,333],{"class":194},[184,1469,1436],{"class":194},[184,1471,1472,1474,1476,1478,1480,1482,1484,1486],{"class":186,"line":450},[184,1473,468],{"class":392},[184,1475,1443],{"class":471},[184,1477,400],{"class":392},[184,1479,333],{"class":194},[184,1481,405],{"class":214},[184,1483,408],{"class":218},[184,1485,400],{"class":214},[184,1487,413],{"class":194},[184,1489,1490,1492,1495,1497,1499],{"class":186,"line":465},[184,1491,468],{"class":392},[184,1493,1494],{"class":471},"ops",[184,1496,400],{"class":392},[184,1498,333],{"class":194},[184,1500,1501],{"class":194}," [\n",[184,1503,1504,1507,1509,1511,1513,1515,1517,1520,1522,1524,1527,1530,1532,1534,1536,1539,1541,1543,1546,1549,1551,1553,1555,1558,1560],{"class":186,"line":487},[184,1505,1506],{"class":194},"        {",[184,1508,405],{"class":392},[184,1510,1443],{"class":506},[184,1512,400],{"class":392},[184,1514,333],{"class":194},[184,1516,405],{"class":214},[184,1518,1519],{"class":218},"list",[184,1521,400],{"class":214},[184,1523,202],{"class":194},[184,1525,1526],{"class":392},"     \"",[184,1528,1529],{"class":506},"kind",[184,1531,400],{"class":392},[184,1533,333],{"class":194},[184,1535,405],{"class":214},[184,1537,1538],{"class":218},"query",[184,1540,400],{"class":214},[184,1542,202],{"class":194},[184,1544,1545],{"class":392},"   \"",[184,1547,1548],{"class":506},"output",[184,1550,400],{"class":392},[184,1552,333],{"class":194},[184,1554,195],{"class":194},[184,1556,1557],{"class":259}," \u002F* une carte *\u002F",[184,1559,208],{"class":194},[184,1561,529],{"class":194},[184,1563,1564,1566,1568,1570,1572,1574,1576,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613],{"class":186,"line":500},[184,1565,1506],{"class":194},[184,1567,405],{"class":392},[184,1569,1443],{"class":506},[184,1571,400],{"class":392},[184,1573,333],{"class":194},[184,1575,405],{"class":214},[184,1577,1578],{"class":218},"findById",[184,1580,400],{"class":214},[184,1582,202],{"class":194},[184,1584,405],{"class":392},[184,1586,1529],{"class":506},[184,1588,400],{"class":392},[184,1590,333],{"class":194},[184,1592,405],{"class":214},[184,1594,1538],{"class":218},[184,1596,400],{"class":214},[184,1598,202],{"class":194},[184,1600,1545],{"class":392},[184,1602,1548],{"class":506},[184,1604,400],{"class":392},[184,1606,333],{"class":194},[184,1608,195],{"class":194},[184,1610,1557],{"class":259},[184,1612,208],{"class":194},[184,1614,529],{"class":194},[184,1616,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1648,1650,1652,1654,1657,1659,1661,1663,1665],{"class":186,"line":532},[184,1618,1506],{"class":194},[184,1620,405],{"class":392},[184,1622,1443],{"class":506},[184,1624,400],{"class":392},[184,1626,333],{"class":194},[184,1628,405],{"class":214},[184,1630,548],{"class":218},[184,1632,400],{"class":214},[184,1634,202],{"class":194},[184,1636,1545],{"class":392},[184,1638,1529],{"class":506},[184,1640,400],{"class":392},[184,1642,333],{"class":194},[184,1644,405],{"class":214},[184,1646,1647],{"class":218},"command",[184,1649,400],{"class":214},[184,1651,202],{"class":194},[184,1653,405],{"class":392},[184,1655,1656],{"class":506},"input",[184,1658,400],{"class":392},[184,1660,333],{"class":194},[184,1662,195],{"class":194},[184,1664,1557],{"class":259},[184,1666,529],{"class":194},[184,1668,1669,1672,1674,1676,1678,1680,1682,1684],{"class":186,"line":579},[184,1670,1671],{"class":392},"                                                 \"",[184,1673,1548],{"class":506},[184,1675,400],{"class":392},[184,1677,333],{"class":194},[184,1679,195],{"class":194},[184,1681,1557],{"class":259},[184,1683,208],{"class":194},[184,1685,529],{"class":194},[184,1687,1688,1690,1692,1694,1696,1698,1700,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721],{"class":186,"line":585},[184,1689,1506],{"class":194},[184,1691,405],{"class":392},[184,1693,1443],{"class":506},[184,1695,400],{"class":392},[184,1697,333],{"class":194},[184,1699,405],{"class":214},[184,1701,1702],{"class":218},"delete",[184,1704,400],{"class":214},[184,1706,202],{"class":194},[184,1708,1545],{"class":392},[184,1710,1529],{"class":506},[184,1712,400],{"class":392},[184,1714,333],{"class":194},[184,1716,405],{"class":214},[184,1718,1647],{"class":218},[184,1720,400],{"class":214},[184,1722,529],{"class":194},[184,1724,1725,1727,1729,1731,1733,1735,1737,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1765,1767,1769,1771,1774,1776],{"class":186,"line":591},[184,1726,1506],{"class":194},[184,1728,405],{"class":392},[184,1730,1443],{"class":506},[184,1732,400],{"class":392},[184,1734,333],{"class":194},[184,1736,405],{"class":214},[184,1738,1739],{"class":218},"publish",[184,1741,400],{"class":214},[184,1743,202],{"class":194},[184,1745,393],{"class":392},[184,1747,1529],{"class":506},[184,1749,400],{"class":392},[184,1751,333],{"class":194},[184,1753,405],{"class":214},[184,1755,1647],{"class":218},[184,1757,400],{"class":214},[184,1759,202],{"class":194},[184,1761,405],{"class":392},[184,1763,1764],{"class":506},"description",[184,1766,400],{"class":392},[184,1768,333],{"class":194},[184,1770,405],{"class":214},[184,1772,1773],{"class":218},"Rendre le post public.",[184,1775,400],{"class":214},[184,1777,576],{"class":194},[184,1779,1780],{"class":186,"line":648},[184,1781,1782],{"class":194},"      ],\n",[184,1784,1785,1787,1790,1792,1794,1796,1798],{"class":186,"line":711},[184,1786,468],{"class":392},[184,1788,1789],{"class":471},"schema",[184,1791,400],{"class":392},[184,1793,333],{"class":194},[184,1795,195],{"class":194},[184,1797,1557],{"class":259},[184,1799,576],{"class":194},[184,1801,1802],{"class":186,"line":725},[184,1803,1804],{"class":194},"    }],\n",[184,1806,1807,1809,1812,1814,1816],{"class":186,"line":756},[184,1808,453],{"class":392},[184,1810,1811],{"class":336},"facts",[184,1813,400],{"class":392},[184,1815,333],{"class":194},[184,1817,1501],{"class":194},[184,1819,1820,1823,1825,1827,1829,1831,1833,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854],{"class":186,"line":777},[184,1821,1822],{"class":194},"      {",[184,1824,405],{"class":392},[184,1826,1443],{"class":471},[184,1828,400],{"class":392},[184,1830,333],{"class":194},[184,1832,405],{"class":214},[184,1834,1835],{"class":218},"postPublished",[184,1837,400],{"class":214},[184,1839,202],{"class":194},[184,1841,405],{"class":392},[184,1843,1789],{"class":471},[184,1845,400],{"class":392},[184,1847,333],{"class":194},[184,1849,195],{"class":194},[184,1851,1557],{"class":259},[184,1853,208],{"class":194},[184,1855,576],{"class":194},[184,1857,1858],{"class":186,"line":820},[184,1859,1860],{"class":194},"    ]\n",[184,1862,1863],{"class":186,"line":825},[184,1864,1865],{"class":194},"  }]\n",[184,1867,1868],{"class":186,"line":898},[184,1869,974],{"class":194},[147,1871,1872,1873,1875,1876,1878,1879,1881,1882,1884,1885,1888,1889,1892,1893,1895,1896,1898,1899,1901,1902,1904],{},"Une opération donne toujours son ",[162,1874,1443],{}," et son ",[162,1877,1529],{}," — ",[162,1880,1538],{}," lit, ",[162,1883,1647],{}," écrit, la\nmême distinction que REST traduit en ",[162,1886,1887],{},"GET"," contre ",[162,1890,1891],{},"POST",". Le reste apparaît quand il y a\nquelque chose à dire : ",[162,1894,1656],{}," et ",[162,1897,1548],{}," quand le contrat nomme une vue, ",[162,1900,1764],{},"\nquand la méthode porte une phrase de doc. ",[162,1903,1702],{}," ci-dessus ne nomme aucune vue parce\nqu'un booléen n'est pas une forme.",[147,1906,1907,1909,1910,1913,1914,1917],{},[162,1908,1789],{}," est optionnel dans les deux listes, et son absence ne dit pas la même chose. Une\n",[151,1911,1912],{},"porte"," sans schéma ne stocke rien — un contrôle de santé, un calcul, une recherche à\ntravers plusieurs formes. Un ",[151,1915,1916],{},"fait"," sans schéma annonce un type que l'hôte ne stocke pas.",[1919,1920,1922],"h3",{"id":1921},"pourquoi-les-faits-sont-une-liste-à-part","Pourquoi les faits sont une liste à part",[147,1924,1925,1926,1928],{},"Héberger, c'est répondre : une entité sans façade est volontairement absente de ",[162,1927,1463],{},",\nsinon la carte publierait la forme de tables que personne ne peut atteindre — celles de\nl'auth, typiquement.",[147,1930,1931,1932,1934,1935,1938,1939,1942,1943,1946],{},"Un ",[159,1933,1916],{"href":93}," est le cas inverse. Il ne porte pas d'opération non plus, mais quelqu'un a ",[151,1936,1937],{},"écrit","\nqu'il sort (",[162,1940,1941],{},"Emit\u003CPostPublished>",") : publier sa forme honore une déclaration au lieu d'en\nfuiter une. Sans cette liste, un fait s'arrêtait à la frontière du dépôt : la colocalisation\ndonne le contrat, ",[162,1944,1945],{},"remotes:"," ne donne que l'adresse, et entre deux dépôts il n'y a pas de\ncolocalisation. L'abonné devait recopier à la main la déclaration de l'émetteur.",[147,1948,1949,1951,1952,1955],{},[162,1950,1811],{}," est identique sur toutes les ",[159,1953,1954],{"href":127},"surfaces"," — une porte a un\npublic, un fait n'en a pas.",[147,1957,1958,1959,1961,1962,1965],{},"Le routeur de doublures ne lit que ",[162,1960,1463],{},", et s'en sert pour associer les entités aux\nadresses déclarées dans ",[162,1963,1964],{},"remotes",". Un fait n'est pas routable : personne ne l'appelle, il\narrive.",[357,1967,1969],{"id":1968},"écrire-un-frond-ailleurs","Écrire un Frond ailleurs",[147,1971,1972],{},"Rien de tout cela ne suppose TypeScript. Un frond écrit dans un autre langage entre dans\nla topologie s'il honore trois choses :",[1974,1975,1976,1991,2002],"ol",{},[1373,1977,1978,1878,1981,1984,1985,1988,1989,375],{},[151,1979,1980],{},"le fil",[162,1982,1983],{},"POST \u002F_fougere\u002Fcall",", JSON-RPC 2.0, ",[162,1986,1987],{},"method = \"entity.op\""," ;\nvoir ",[159,1990,122],{"href":123},[1373,1992,1993,1878,1996,1998,1999,375],{},[151,1994,1995],{},"la carte",[162,1997,1402],{}," rend l'enveloppe ci-dessus, ",[162,2000,2001],{},"x-fougere-version: 1",[1373,2003,2004,2007,2008,2011,2012,2015,2016,2018,2019,2022,2023,2026],{},[151,2005,2006],{},"le vocabulaire d'erreur"," — un ",[162,2009,2010],{},"FougereError"," entier dans ",[162,2013,2014],{},"error.data",", dont le ",[162,2017,162],{},"\nest un ",[159,2020,2021],{"href":85},"code sémantique"," ; l'entier ",[162,2024,2025],{},"-32000"," reste celui de la\nspec JSON-RPC.",[147,2028,2029],{},"Le consommateur reconstruit alors le schéma et valide les données localement avec les mêmes\nrègles.",[147,2031,2032,2035,2036,2038],{},[162,2033,2034],{},"demos\u002Frust-frond\u002F"," en est un, en Rust — une entité, trois opérations, aucune classe\n",[162,2037,1211],{}," nulle part.",[147,2040,2041,2042,2044],{},"Suite : ",[159,2043,72],{"href":73}," — opérations, règles de binding, scoping de sortie.",[2046,2047,2048],"style",{},"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 .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .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 .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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sAQsV, html code.shiki .sAQsV{--shiki-light:#916B53;--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 .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":180,"searchDepth":228,"depth":228,"links":2050},[2051,2052,2054,2056,2057,2058,2062],{"id":359,"depth":228,"text":360},{"id":994,"depth":228,"text":2053},"Les trois axes sous x-fougere",{"id":1219,"depth":228,"text":2055},"Sémantique de required",{"id":1260,"depth":228,"text":1261},{"id":1364,"depth":228,"text":1365},{"id":1399,"depth":228,"text":2059,"children":2060},"rpc.discover — la carte d'une app entière",[2061],{"id":1921,"depth":235,"text":1922},{"id":1968,"depth":228,"text":1969},"Le format JSON portable d'un schéma Fougere et ses extensions x-fougere.","md",{},{"title":59,"description":2063},"HMZydb-xD5gOKIrI92ZK_3ft0447wYMbJACRRljdRVA",1786637820132]