[{"data":1,"prerenderedAt":2257},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fadopt\u002Fbring-your-schema":6,"docs-uses":1947,"docs-nav":2119},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":1935,"extension":1936,"forms":1937,"kind":1938,"meta":1939,"navigation":447,"path":1940,"seo":1941,"stem":1942,"step":1943,"uses":1944,"__hash__":1946},"docs\u002Fdocs\u002F7.adopt\u002F3.bring-your-schema.md","Bring your schema",{"type":10,"value":11,"toc":1922},"minimark",[12,26,33,38,41,53,64,68,312,329,333,344,954,960,997,1001,1008,1067,1078,1084,1091,1095,1126,1130,1139,1313,1321,1326,1339,1342,1466,1481,1485,1492,1655,1674,1696,1700,1703,1789,1803,1809,1813,1823,1896,1903,1918],[13,14,15,20,21,25],"p",{},[16,17,19],"a",{"href":18},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Adding Fougere to an app"," leaves your host alone: your routing, your\npages, your rendering and your other server routes are untouched. Your ",[22,23,24],"strong",{},"domain"," is different. The\nentity is the one thing Fougere must own, because it is the one thing everything else is\nderived from.",[13,27,28,29,32],{},"So adopting Fougere has exactly one cost, and this page is it: ",[22,30,31],{},"you declare your model in\nits vocabulary",". What follows is how to keep that cost small, bounded, and paid one entity\nat a time.",[34,35,37],"h2",{"id":36},"one-entity-at-a-time","One entity at a time",[13,39,40],{},"You do not convert a domain. You convert an entity.",[13,42,43,47,48,52],{},[44,45,46],"code",{},"fougere migrate --apply"," only touches the tables your entities declare. It creates them and\nadds what they lack; it renames or drops a column only when a ",[16,49,51],{"href":50},"\u002Freference\u002Fcli","frozen version"," of that\nentity says the field moved or left; and it refuses a type change rather than rewriting one. A\ntable no entity declares is never touched. A Fougere entity therefore creates its own table\nbeside the ones your current storage manages, in the same database, and your existing rows are\nout of its reach.",[13,54,55,56,59,60,63],{},"The case to watch is a name collision: an entity whose table already exists gets ",[44,57,58],{},"addColumn","\nproposed ",[22,61,62],{},"on your table"," rather than a fresh one. Rename one of the two, or hand the table\nover on purpose.",[34,65,67],{"id":66},"the-mapping","The mapping",[69,70,71,84],"table",{},[72,73,74],"thead",{},[75,76,77,81],"tr",{},[78,79,80],"th",{},"Prisma",[78,82,83],{},"Fougere",[85,86,87,105,122,138,150,162,174,186,198,210,227,239,252,263,275,287,300],"tbody",{},[75,88,89,95],{},[90,91,92],"td",{},[44,93,94],{},"String",[90,96,97,100,101,104],{},[44,98,99],{},"text()"," — with ",[44,102,103],{},"{ min, max }"," when you have a rule",[75,106,107,112],{},[90,108,109],{},[44,110,111],{},"String?",[90,113,114,117,118,121],{},[44,115,116],{},"optional(text())",", or ",[44,119,120],{},"nullable(text())"," if the column is truly nullable",[75,123,124,133],{},[90,125,126,129,130],{},[44,127,128],{},"Int",", ",[44,131,132],{},"Float",[90,134,135],{},[44,136,137],{},"number()",[75,139,140,145],{},[90,141,142],{},[44,143,144],{},"Boolean",[90,146,147],{},[44,148,149],{},"bool()",[75,151,152,157],{},[90,153,154],{},[44,155,156],{},"DateTime",[90,158,159],{},[44,160,161],{},"date()",[75,163,164,169],{},[90,165,166],{},[44,167,168],{},"Json",[90,170,171],{},[44,172,173],{},"json()",[75,175,176,181],{},[90,177,178],{},[44,179,180],{},"String @id @default(uuid(7))",[90,182,183],{},[44,184,185],{},"primary()",[75,187,188,193],{},[90,189,190],{},[44,191,192],{},"String @id @default(cuid(2))",[90,194,195],{},[44,196,197],{},"primary({ generate: 'cuid2' })",[75,199,200,205],{},[90,201,202],{},[44,203,204],{},"@unique",[90,206,207],{},[44,208,209],{},"unique(field)",[75,211,212,217],{},[90,213,214],{},[44,215,216],{},"@@unique([listId, docId])",[90,218,219,222,223,226],{},[44,220,221],{},"unique: [['listId', 'docId']]",", in ",[44,224,225],{},"entity()","'s second argument",[75,228,229,234],{},[90,230,231],{},[44,232,233],{},"@index",[90,235,236],{},[44,237,238],{},"indexed(field)",[75,240,241,247],{},[90,242,243,244],{},"a foreign key + ",[44,245,246],{},"@relation",[90,248,249],{},[44,250,251],{},"ref(Author)",[75,253,254,257],{},[90,255,256],{},"the reverse side of that relation",[90,258,259,262],{},[44,260,261],{},"many(Post)"," — a role, no column",[75,264,265,270],{},[90,266,267],{},[44,268,269],{},"@default(now())",[90,271,272],{},[44,273,274],{},"created()",[75,276,277,282],{},[90,278,279],{},[44,280,281],{},"@updatedAt",[90,283,284],{},[44,285,286],{},"updated()",[75,288,289,295],{},[90,290,291,292],{},"an enum + ",[44,293,294],{},"@default(\"draft\")",[90,296,297],{},[44,298,299],{},"oneOf('draft', 'published', { default: 'draft' })",[75,301,302,307],{},[90,303,304],{},[44,305,306],{},"@db.VarChar(160)",[90,308,309],{},[44,310,311],{},"text({ max: 160 })",[13,313,314,315,317,318,320,321,324,325,328],{},"The last row is the whole thesis in one line. ",[44,316,306],{}," names a dialect;\n",[44,319,311],{}," names the rule, and the dialect is derived from it — along with the\n",[44,322,323],{},"CHECK",", the JSON Schema, the GraphQL type and the form's ",[44,326,327],{},"maxlength",".",[34,330,332],{"id":331},"from-zod","From Zod",[13,334,335,336,339,340,343],{},"A field is anything that states a ",[44,337,338],{},"shape",", and a shape is JSON Schema. Zod writes JSON Schema, so\na ",[44,341,342],{},"z.object"," you already have can give an entity its fields, with no package in between:",[345,346,351],"pre",{"className":347,"code":348,"language":349,"meta":350,"style":350},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","import { z } from 'zod';\nimport { entity, Field, optional, primary, ref, type Shape } from '@fougere\u002Fschema';\n\nconst PostInput = z.object({\n  title: z.string().min(3).max(80),\n  body: z.string().optional(),\n  tags: z.array(z.string()).max(3),\n});\n\nfunction fieldsOf(object: z.ZodObject) {\n  const { properties = {}, required = [] } = z.toJSONSchema(object);\n\n  return Object.fromEntries(\n    Object.entries(properties).map(([key, shape]) => {\n      const field = new Field({ shape: shape as Shape }, key);\n\n      return [key, required.includes(key) ? field : optional(field)];\n    }),\n  );\n}\n\nexport default class Post extends entity({\n  id: primary(),\n  authorId: ref(Author),\n  ...fieldsOf(PostInput),\n}) {}\n","ts","",[44,352,353,390,442,449,477,526,551,590,600,605,634,679,684,701,746,789,794,840,850,858,864,869,893,907,926,944],{"__ignoreMap":350},[354,355,358,362,366,370,373,376,380,384,387],"span",{"class":356,"line":357},"line",1,[354,359,361],{"class":360},"sK6XW","import",[354,363,365],{"class":364},"s15xx"," {",[354,367,369],{"class":368},"sPEhv"," z",[354,371,372],{"class":364}," }",[354,374,375],{"class":360}," from",[354,377,379],{"class":378},"sDDC1"," '",[354,381,383],{"class":382},"sN-8n","zod",[354,385,386],{"class":378},"'",[354,388,389],{"class":364},";\n",[354,391,393,395,397,400,403,406,408,411,413,416,418,421,423,426,429,431,433,435,438,440],{"class":356,"line":392},2,[354,394,361],{"class":360},[354,396,365],{"class":364},[354,398,399],{"class":368}," entity",[354,401,402],{"class":364},",",[354,404,405],{"class":368}," Field",[354,407,402],{"class":364},[354,409,410],{"class":368}," optional",[354,412,402],{"class":364},[354,414,415],{"class":368}," primary",[354,417,402],{"class":364},[354,419,420],{"class":368}," ref",[354,422,402],{"class":364},[354,424,425],{"class":360}," type",[354,427,428],{"class":368}," Shape",[354,430,372],{"class":364},[354,432,375],{"class":360},[354,434,379],{"class":378},[354,436,437],{"class":382},"@fougere\u002Fschema",[354,439,386],{"class":378},[354,441,389],{"class":364},[354,443,445],{"class":356,"line":444},3,[354,446,448],{"emptyLinePlaceholder":447},true,"\n",[354,450,452,456,459,462,464,466,470,474],{"class":356,"line":451},4,[354,453,455],{"class":454},"s76I7","const",[354,457,458],{"class":368}," PostInput ",[354,460,461],{"class":364},"=",[354,463,369],{"class":368},[354,465,328],{"class":364},[354,467,469],{"class":468},"s4mR9","object",[354,471,473],{"class":472},"srlTG","(",[354,475,476],{"class":364},"{\n",[354,478,480,484,487,489,491,494,497,499,502,504,508,511,513,516,518,521,523],{"class":356,"line":479},5,[354,481,483],{"class":482},"sHtqg","  title",[354,485,486],{"class":364},":",[354,488,369],{"class":368},[354,490,328],{"class":364},[354,492,493],{"class":468},"string",[354,495,496],{"class":472},"()",[354,498,328],{"class":364},[354,500,501],{"class":468},"min",[354,503,473],{"class":472},[354,505,507],{"class":506},"s3dPA","3",[354,509,510],{"class":472},")",[354,512,328],{"class":364},[354,514,515],{"class":468},"max",[354,517,473],{"class":472},[354,519,520],{"class":506},"80",[354,522,510],{"class":472},[354,524,525],{"class":364},",\n",[354,527,529,532,534,536,538,540,542,544,547,549],{"class":356,"line":528},6,[354,530,531],{"class":482},"  body",[354,533,486],{"class":364},[354,535,369],{"class":368},[354,537,328],{"class":364},[354,539,493],{"class":468},[354,541,496],{"class":472},[354,543,328],{"class":364},[354,545,546],{"class":468},"optional",[354,548,496],{"class":472},[354,550,525],{"class":364},[354,552,554,557,559,561,563,566,568,571,573,575,578,580,582,584,586,588],{"class":356,"line":553},7,[354,555,556],{"class":482},"  tags",[354,558,486],{"class":364},[354,560,369],{"class":368},[354,562,328],{"class":364},[354,564,565],{"class":468},"array",[354,567,473],{"class":472},[354,569,570],{"class":368},"z",[354,572,328],{"class":364},[354,574,493],{"class":468},[354,576,577],{"class":472},"())",[354,579,328],{"class":364},[354,581,515],{"class":468},[354,583,473],{"class":472},[354,585,507],{"class":506},[354,587,510],{"class":472},[354,589,525],{"class":364},[354,591,593,596,598],{"class":356,"line":592},8,[354,594,595],{"class":364},"}",[354,597,510],{"class":472},[354,599,389],{"class":364},[354,601,603],{"class":356,"line":602},9,[354,604,448],{"emptyLinePlaceholder":447},[354,606,608,611,614,616,619,621,624,626,629,631],{"class":356,"line":607},10,[354,609,610],{"class":454},"function",[354,612,613],{"class":468}," fieldsOf",[354,615,473],{"class":364},[354,617,469],{"class":618},"shDUQ",[354,620,486],{"class":364},[354,622,369],{"class":623},"sBZYL",[354,625,328],{"class":364},[354,627,628],{"class":623},"ZodObject",[354,630,510],{"class":364},[354,632,633],{"class":364}," {\n",[354,635,637,640,642,645,648,651,654,656,660,662,664,666,668,671,673,675,677],{"class":356,"line":636},11,[354,638,639],{"class":454},"  const",[354,641,365],{"class":364},[354,643,644],{"class":368}," properties",[354,646,647],{"class":364}," =",[354,649,650],{"class":364}," {},",[354,652,653],{"class":368}," required",[354,655,647],{"class":364},[354,657,659],{"class":658},"spAFX"," []",[354,661,372],{"class":364},[354,663,647],{"class":364},[354,665,369],{"class":368},[354,667,328],{"class":364},[354,669,670],{"class":468},"toJSONSchema",[354,672,473],{"class":658},[354,674,469],{"class":368},[354,676,510],{"class":658},[354,678,389],{"class":364},[354,680,682],{"class":356,"line":681},12,[354,683,448],{"emptyLinePlaceholder":447},[354,685,687,690,693,695,698],{"class":356,"line":686},13,[354,688,689],{"class":360},"  return",[354,691,692],{"class":368}," Object",[354,694,328],{"class":364},[354,696,697],{"class":468},"fromEntries",[354,699,700],{"class":658},"(\n",[354,702,704,707,709,712,714,717,719,721,724,726,729,732,734,737,740,744],{"class":356,"line":703},14,[354,705,706],{"class":368},"    Object",[354,708,328],{"class":364},[354,710,711],{"class":468},"entries",[354,713,473],{"class":658},[354,715,716],{"class":368},"properties",[354,718,510],{"class":658},[354,720,328],{"class":364},[354,722,723],{"class":468},"map",[354,725,473],{"class":658},[354,727,728],{"class":364},"([",[354,730,731],{"class":618},"key",[354,733,402],{"class":364},[354,735,736],{"class":618}," shape",[354,738,739],{"class":364},"])",[354,741,743],{"class":742},"scTuO"," =>",[354,745,633],{"class":364},[354,747,749,752,755,757,760,763,765,768,770,772,774,777,779,782,785,787],{"class":356,"line":748},15,[354,750,751],{"class":454},"      const",[354,753,754],{"class":368}," field",[354,756,647],{"class":364},[354,758,759],{"class":364}," new",[354,761,405],{"class":762},"sgjsB",[354,764,473],{"class":658},[354,766,767],{"class":364},"{",[354,769,736],{"class":482},[354,771,486],{"class":364},[354,773,736],{"class":368},[354,775,776],{"class":360}," as",[354,778,428],{"class":623},[354,780,781],{"class":364}," },",[354,783,784],{"class":368}," key",[354,786,510],{"class":658},[354,788,389],{"class":364},[354,790,792],{"class":356,"line":791},16,[354,793,448],{"emptyLinePlaceholder":447},[354,795,797,800,803,805,807,809,811,814,816,818,820,823,825,828,830,832,835,838],{"class":356,"line":796},17,[354,798,799],{"class":360},"      return",[354,801,802],{"class":658}," [",[354,804,731],{"class":368},[354,806,402],{"class":364},[354,808,653],{"class":368},[354,810,328],{"class":364},[354,812,813],{"class":468},"includes",[354,815,473],{"class":658},[354,817,731],{"class":368},[354,819,510],{"class":658},[354,821,822],{"class":364}," ?",[354,824,754],{"class":368},[354,826,827],{"class":364}," :",[354,829,410],{"class":468},[354,831,473],{"class":658},[354,833,834],{"class":368},"field",[354,836,837],{"class":658},")]",[354,839,389],{"class":364},[354,841,843,846,848],{"class":356,"line":842},18,[354,844,845],{"class":364},"    }",[354,847,510],{"class":658},[354,849,525],{"class":364},[354,851,853,856],{"class":356,"line":852},19,[354,854,855],{"class":658},"  )",[354,857,389],{"class":364},[354,859,861],{"class":356,"line":860},20,[354,862,863],{"class":364},"}\n",[354,865,867],{"class":356,"line":866},21,[354,868,448],{"emptyLinePlaceholder":447},[354,870,872,875,878,881,884,887,889,891],{"class":356,"line":871},22,[354,873,874],{"class":360},"export",[354,876,877],{"class":360}," default",[354,879,880],{"class":454}," class",[354,882,883],{"class":623}," Post",[354,885,886],{"class":454}," extends",[354,888,399],{"class":468},[354,890,473],{"class":472},[354,892,476],{"class":364},[354,894,896,899,901,903,905],{"class":356,"line":895},23,[354,897,898],{"class":482},"  id",[354,900,486],{"class":364},[354,902,415],{"class":468},[354,904,496],{"class":472},[354,906,525],{"class":364},[354,908,910,913,915,917,919,922,924],{"class":356,"line":909},24,[354,911,912],{"class":482},"  authorId",[354,914,486],{"class":364},[354,916,420],{"class":468},[354,918,473],{"class":472},[354,920,921],{"class":368},"Author",[354,923,510],{"class":472},[354,925,525],{"class":364},[354,927,929,932,935,937,940,942],{"class":356,"line":928},25,[354,930,931],{"class":364},"  ...",[354,933,934],{"class":468},"fieldsOf",[354,936,473],{"class":472},[354,938,939],{"class":368},"PostInput",[354,941,510],{"class":472},[354,943,525],{"class":364},[354,945,947,949,951],{"class":356,"line":946},26,[354,948,595],{"class":364},[354,950,510],{"class":472},[354,952,953],{"class":364}," {}\n",[13,955,956,957],{},"Zod states the shape. The key, the relation and who writes what stay in Fougere's words, beside\nit. A refusal reads as any other: ",[44,958,959],{},"title: String is too short (2 \u003C 3).",[13,961,962,963,129,966,969,970,973,974,977,978,982,983,986,987,990,991,986,994,996],{},"A shape admits every keyword the validator judges, so ",[44,964,965],{},".positive()",[44,967,968],{},"z.literal()"," and\n",[44,971,972],{},".multipleOf()"," pass as Zod writes them. Two things are refused when the field is built, naming\nthe keyword: a union of types, which no column can hold, and ",[44,975,976],{},".default()"," — a default is the\n",[16,979,981],{"href":980},"\u002Fdocs\u002Fconcepts\u002Fentity","lifecycle","'s, not the shape's. ",[44,984,985],{},".transform()"," and ",[44,988,989],{},"z.date()"," never reach\nFougere: Zod itself cannot write them as JSON Schema. Use ",[44,992,993],{},"oneOf(…)",[44,995,161],{}," for those fields.",[34,998,1000],{"id":999},"what-has-no-equivalent","What has no equivalent",[13,1002,1003,1004,1007],{},"A Prisma model says what the column ",[22,1005,1006],{},"is",". That is one of four axes. The other three have\nno column to map from, and they are why the conversion is not mechanical:",[1009,1010,1011,1030,1046],"ul",{},[1012,1013,1014,1019,1020,1022,1023,1025,1026,1029],"li",{},[22,1015,1016,1018],{},[44,1017,981],{}," — who writes the value, and when."," ",[44,1021,274],{}," is not ",[44,1024,269],{},"\nwith a nicer name: it also states that the value cannot be rewritten on update.\n",[44,1027,1028],{},"readOnly(oneOf(…))"," states that the client never supplies it at all.",[1012,1031,1032,1019,1038,1041,1042,1045],{},[22,1033,1034,1037],{},[44,1035,1036],{},"boundary"," — who may see it.",[44,1039,1040],{},"writeOnly()"," for the password that goes in and never\ncomes out. ",[44,1043,1044],{},"readOnly()"," for the field the server stamps.",[1012,1047,1048,1019,1054,129,1057,129,1060,129,1063,1066],{},[22,1049,1050,1053],{},[44,1051,1052],{},"role"," — what part it plays.",[44,1055,1056],{},"primary",[44,1058,1059],{},"ref",[44,1061,1062],{},"many",[44,1064,1065],{},"unique"," — read by the DDL for\nkeys and constraints, and by the card for relations.",[13,1068,1069,1070,1073,1074,1077],{},"You enforce all three today. They live in a service method, a DTO, a ",[44,1071,1072],{},"select:"," clause, an\n",[44,1075,1076],{},"@Exclude()"," decorator, a review comment. They are real rules with no single home.",[1079,1080,1081],"blockquote",{},[13,1082,1083],{},"The conversion is not mechanical because you are writing down, for the first time, rules\nyou were already applying.",[13,1085,1086,1087,1090],{},"That is the work, and it is also the return: from that declaration the validator, the\ntable, the GraphQL type, the REST route and the form contract are all projections — see\n",[16,1088,1089],{"href":980},"Entities"," for the four axes in full.",[34,1092,1094],{"id":1093},"what-stays-where-it-is","What stays where it is",[1009,1096,1097,1103,1113],{},[1012,1098,1099,1102],{},[22,1100,1101],{},"Your storage."," Fougere claims no ownership of it. In the routes you have not converted,\nkeep querying exactly as you do now.",[1012,1104,1105,1108,1109,1112],{},[22,1106,1107],{},"Unconverted tables."," Nothing at boot requires the whole database to be declared. The\nscan finds what is in ",[44,1110,1111],{},"entities\u002F",", and is silent about the rest.",[1012,1114,1115,1019,1118,1121,1122,328],{},[22,1116,1117],{},"Raw statements on a converted entity.",[44,1119,1120],{},"storage.client"," is the escape hatch on the storage\nport — the underlying Kysely instance for the SQL adapter. It is the one path the validator\ndoes not sit on, and it is not scoped to the entity; see\n",[16,1123,1125],{"href":1124},"\u002Fdocs\u002Fextending\u002Fsource-adapter#client-and-what-it-costs","Storage",[34,1127,1129],{"id":1128},"standard-schema","Standard Schema",[13,1131,1132,1133,1138],{},"An entity is a ",[16,1134,1129],{"href":1135,"rel":1136},"https:\u002F\u002Fstandardschema.dev\u002F",[1137],"nofollow",". It is the smallest way to\nuse Fougere: one package, one class, inside the framework you already have.",[345,1140,1142],{"className":347,"code":1141,"language":349,"meta":350,"style":350},"import { entity, primary, text, bool } from '@fougere\u002Fschema';\n\nexport default class Post extends entity({\n  id: primary(),\n  title: text({ min: 1, max: 200 }),\n  draft: bool({ default: false }),\n}) {}\n\nPost['~standard'];\n\u002F\u002F → { version: 1, vendor: 'fougere', validate }\n",[44,1143,1144,1178,1182,1200,1212,1248,1275,1283,1287,1307],{"__ignoreMap":350},[354,1145,1146,1148,1150,1152,1154,1156,1158,1161,1163,1166,1168,1170,1172,1174,1176],{"class":356,"line":357},[354,1147,361],{"class":360},[354,1149,365],{"class":364},[354,1151,399],{"class":368},[354,1153,402],{"class":364},[354,1155,415],{"class":368},[354,1157,402],{"class":364},[354,1159,1160],{"class":368}," text",[354,1162,402],{"class":364},[354,1164,1165],{"class":368}," bool",[354,1167,372],{"class":364},[354,1169,375],{"class":360},[354,1171,379],{"class":378},[354,1173,437],{"class":382},[354,1175,386],{"class":378},[354,1177,389],{"class":364},[354,1179,1180],{"class":356,"line":392},[354,1181,448],{"emptyLinePlaceholder":447},[354,1183,1184,1186,1188,1190,1192,1194,1196,1198],{"class":356,"line":444},[354,1185,874],{"class":360},[354,1187,877],{"class":360},[354,1189,880],{"class":454},[354,1191,883],{"class":623},[354,1193,886],{"class":454},[354,1195,399],{"class":468},[354,1197,473],{"class":472},[354,1199,476],{"class":364},[354,1201,1202,1204,1206,1208,1210],{"class":356,"line":451},[354,1203,898],{"class":482},[354,1205,486],{"class":364},[354,1207,415],{"class":468},[354,1209,496],{"class":472},[354,1211,525],{"class":364},[354,1213,1214,1216,1218,1220,1222,1224,1227,1229,1232,1234,1237,1239,1242,1244,1246],{"class":356,"line":479},[354,1215,483],{"class":482},[354,1217,486],{"class":364},[354,1219,1160],{"class":468},[354,1221,473],{"class":472},[354,1223,767],{"class":364},[354,1225,1226],{"class":482}," min",[354,1228,486],{"class":364},[354,1230,1231],{"class":506}," 1",[354,1233,402],{"class":364},[354,1235,1236],{"class":482}," max",[354,1238,486],{"class":364},[354,1240,1241],{"class":506}," 200",[354,1243,372],{"class":364},[354,1245,510],{"class":472},[354,1247,525],{"class":364},[354,1249,1250,1253,1255,1257,1259,1261,1263,1265,1269,1271,1273],{"class":356,"line":528},[354,1251,1252],{"class":482},"  draft",[354,1254,486],{"class":364},[354,1256,1165],{"class":468},[354,1258,473],{"class":472},[354,1260,767],{"class":364},[354,1262,877],{"class":482},[354,1264,486],{"class":364},[354,1266,1268],{"class":1267},"slmMI"," false",[354,1270,372],{"class":364},[354,1272,510],{"class":472},[354,1274,525],{"class":364},[354,1276,1277,1279,1281],{"class":356,"line":553},[354,1278,595],{"class":364},[354,1280,510],{"class":472},[354,1282,953],{"class":364},[354,1284,1285],{"class":356,"line":592},[354,1286,448],{"emptyLinePlaceholder":447},[354,1288,1289,1292,1295,1297,1300,1302,1305],{"class":356,"line":602},[354,1290,1291],{"class":368},"Post",[354,1293,1294],{"class":472},"[",[354,1296,386],{"class":378},[354,1298,1299],{"class":382},"~standard",[354,1301,386],{"class":378},[354,1303,1304],{"class":472},"]",[354,1306,389],{"class":364},[354,1308,1309],{"class":356,"line":607},[354,1310,1312],{"class":1311},"skXKP","\u002F\u002F → { version: 1, vendor: 'fougere', validate }\n",[13,1314,1315,1317,1318,1320],{},[44,1316,1299],{}," is a static getter on the class, so ",[44,1319,1291],{}," itself is the schema — there is\nnothing to wrap and no adapter package to install.",[1322,1323,1325],"h3",{"id":1324},"where-it-is-accepted","Where it is accepted",[13,1327,1328,1329,129,1332,986,1335,1338],{},"Any library that reads the spec takes an entity directly: tRPC, Hono, TanStack Form, and\n— announced for NestJS 12 — a Standard Schema in ",[44,1330,1331],{},"@Body",[44,1333,1334],{},"@Query",[44,1336,1337],{},"@Param",", as the\nsuccessor to class-validator.",[13,1340,1341],{},"Derivations carry the interface too, which is what makes it useful at a route boundary —\nthe shape a caller may propose is rarely the whole row:",[345,1343,1345],{"className":347,"code":1344,"language":349,"meta":350,"style":350},"export class PostDraft extends Post.pick('title') {}\nexport class PostPatch extends Post.omit('id').partial() {}\n\nPostDraft['~standard'].validate({ title: 'Hello' });  \u002F\u002F → { value: { title: 'Hello' } }\n",[44,1346,1347,1378,1416,1420],{"__ignoreMap":350},[354,1348,1349,1351,1353,1356,1358,1360,1362,1365,1367,1369,1372,1374,1376],{"class":356,"line":357},[354,1350,874],{"class":360},[354,1352,880],{"class":454},[354,1354,1355],{"class":623}," PostDraft",[354,1357,886],{"class":454},[354,1359,883],{"class":368},[354,1361,328],{"class":364},[354,1363,1364],{"class":468},"pick",[354,1366,473],{"class":472},[354,1368,386],{"class":378},[354,1370,1371],{"class":382},"title",[354,1373,386],{"class":378},[354,1375,510],{"class":472},[354,1377,953],{"class":364},[354,1379,1380,1382,1384,1387,1389,1391,1393,1396,1398,1400,1403,1405,1407,1409,1412,1414],{"class":356,"line":392},[354,1381,874],{"class":360},[354,1383,880],{"class":454},[354,1385,1386],{"class":623}," PostPatch",[354,1388,886],{"class":454},[354,1390,883],{"class":368},[354,1392,328],{"class":364},[354,1394,1395],{"class":468},"omit",[354,1397,473],{"class":472},[354,1399,386],{"class":378},[354,1401,1402],{"class":382},"id",[354,1404,386],{"class":378},[354,1406,510],{"class":472},[354,1408,328],{"class":364},[354,1410,1411],{"class":468},"partial",[354,1413,496],{"class":472},[354,1415,953],{"class":364},[354,1417,1418],{"class":356,"line":444},[354,1419,448],{"emptyLinePlaceholder":447},[354,1421,1422,1425,1427,1429,1431,1433,1435,1437,1440,1442,1444,1447,1449,1451,1454,1456,1458,1460,1463],{"class":356,"line":451},[354,1423,1424],{"class":368},"PostDraft",[354,1426,1294],{"class":472},[354,1428,386],{"class":378},[354,1430,1299],{"class":382},[354,1432,386],{"class":378},[354,1434,1304],{"class":472},[354,1436,328],{"class":364},[354,1438,1439],{"class":468},"validate",[354,1441,473],{"class":472},[354,1443,767],{"class":364},[354,1445,1446],{"class":482}," title",[354,1448,486],{"class":364},[354,1450,379],{"class":378},[354,1452,1453],{"class":382},"Hello",[354,1455,386],{"class":378},[354,1457,372],{"class":364},[354,1459,510],{"class":472},[354,1461,1462],{"class":364},";",[354,1464,1465],{"class":1311},"  \u002F\u002F → { value: { title: 'Hello' } }\n",[13,1467,1468,129,1470,129,1472,986,1474,1477,1478,328],{},[44,1469,1364],{},[44,1471,1395],{},[44,1473,1411],{},[44,1475,1476],{},"extend"," all produce a class that is itself a Standard\nSchema. See ",[16,1479,1480],{"href":980},"Views",[1322,1482,1484],{"id":1483},"the-result-shape","The result shape",[13,1486,1487,1488,1491],{},"Validation is ",[22,1489,1490],{},"synchronous"," — the spec allows a promise, this vendor never returns one.",[345,1493,1495],{"className":347,"code":1494,"language":349,"meta":350,"style":350},"const result = Post['~standard'].validate({ id: 'abc', title: '' });\n\nif (result.issues) {\n  result.issues[0].message;  \u002F\u002F 'String is too short (0 \u003C 1).'\n  result.issues[0].path;     \u002F\u002F [{ key: 'title' }]\n} else {\n  result.value;              \u002F\u002F the validated, decoded row\n}\n",[44,1496,1497,1553,1557,1578,1604,1628,1637,1651],{"__ignoreMap":350},[354,1498,1499,1501,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1529,1531,1533,1536,1538,1540,1542,1544,1547,1549,1551],{"class":356,"line":357},[354,1500,455],{"class":454},[354,1502,1503],{"class":368}," result ",[354,1505,461],{"class":364},[354,1507,883],{"class":368},[354,1509,1294],{"class":472},[354,1511,386],{"class":378},[354,1513,1299],{"class":382},[354,1515,386],{"class":378},[354,1517,1304],{"class":472},[354,1519,328],{"class":364},[354,1521,1439],{"class":468},[354,1523,473],{"class":472},[354,1525,767],{"class":364},[354,1527,1528],{"class":482}," id",[354,1530,486],{"class":364},[354,1532,379],{"class":378},[354,1534,1535],{"class":382},"abc",[354,1537,386],{"class":378},[354,1539,402],{"class":364},[354,1541,1446],{"class":482},[354,1543,486],{"class":364},[354,1545,1546],{"class":378}," ''",[354,1548,372],{"class":364},[354,1550,510],{"class":472},[354,1552,389],{"class":364},[354,1554,1555],{"class":356,"line":392},[354,1556,448],{"emptyLinePlaceholder":447},[354,1558,1559,1562,1565,1568,1570,1574,1576],{"class":356,"line":444},[354,1560,1561],{"class":360},"if",[354,1563,1564],{"class":472}," (",[354,1566,1567],{"class":368},"result",[354,1569,328],{"class":364},[354,1571,1573],{"class":1572},"sy9f4","issues",[354,1575,510],{"class":472},[354,1577,633],{"class":364},[354,1579,1580,1583,1585,1587,1589,1592,1594,1596,1599,1601],{"class":356,"line":451},[354,1581,1582],{"class":368},"  result",[354,1584,328],{"class":364},[354,1586,1573],{"class":1572},[354,1588,1294],{"class":658},[354,1590,1591],{"class":506},"0",[354,1593,1304],{"class":658},[354,1595,328],{"class":364},[354,1597,1598],{"class":1572},"message",[354,1600,1462],{"class":364},[354,1602,1603],{"class":1311},"  \u002F\u002F 'String is too short (0 \u003C 1).'\n",[354,1605,1606,1608,1610,1612,1614,1616,1618,1620,1623,1625],{"class":356,"line":479},[354,1607,1582],{"class":368},[354,1609,328],{"class":364},[354,1611,1573],{"class":1572},[354,1613,1294],{"class":658},[354,1615,1591],{"class":506},[354,1617,1304],{"class":658},[354,1619,328],{"class":364},[354,1621,1622],{"class":1572},"path",[354,1624,1462],{"class":364},[354,1626,1627],{"class":1311},"     \u002F\u002F [{ key: 'title' }]\n",[354,1629,1630,1632,1635],{"class":356,"line":528},[354,1631,595],{"class":364},[354,1633,1634],{"class":360}," else",[354,1636,633],{"class":364},[354,1638,1639,1641,1643,1646,1648],{"class":356,"line":553},[354,1640,1582],{"class":368},[354,1642,328],{"class":364},[354,1644,1645],{"class":1572},"value",[354,1647,1462],{"class":364},[354,1649,1650],{"class":1311},"              \u002F\u002F the validated, decoded row\n",[354,1652,1653],{"class":356,"line":592},[354,1654,863],{"class":364},[13,1656,1657,1659,1660,1663,1664,1667,1668,1019,1671,1673],{},[44,1658,1622],{}," is a list of ",[44,1661,1662],{},"{ key }"," segments, per the spec. An error about the input as a whole\n— a ",[44,1665,1666],{},"null",", a non-object — carries ",[22,1669,1670],{},"no",[44,1672,1622],{}," at all, rather than an empty one.",[13,1675,1676,1677,1679,1680,1684,1685,1688,1689,1691,1692,1695],{},"The ",[44,1678,1645],{}," is the ",[1681,1682,1683],"em",{},"decoded"," row, not the raw input: a field declaring a ",[44,1686,1687],{},"Date"," comes\nback as a ",[44,1690,1687],{},", because the ",[16,1693,1694],{"href":980},"boundary axis"," runs its inbound\nconversion as part of the verdict.",[1322,1697,1699],{"id":1698},"defaults-are-not-filled","Defaults are not filled",[13,1701,1702],{},"One behaviour differs from most vendors, and it is the doctrine rather than an omission.",[345,1704,1706],{"className":347,"code":1705,"language":349,"meta":350,"style":350},"const { value } = Post['~standard'].validate({ id: 'abc', title: 'Hello' });\n'draft' in value;  \u002F\u002F false — even though draft declares { default: false }\n",[44,1707,1708,1769],{"__ignoreMap":350},[354,1709,1710,1712,1714,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767],{"class":356,"line":357},[354,1711,455],{"class":454},[354,1713,365],{"class":364},[354,1715,1716],{"class":368}," value ",[354,1718,595],{"class":364},[354,1720,647],{"class":364},[354,1722,883],{"class":368},[354,1724,1294],{"class":472},[354,1726,386],{"class":378},[354,1728,1299],{"class":382},[354,1730,386],{"class":378},[354,1732,1304],{"class":472},[354,1734,328],{"class":364},[354,1736,1439],{"class":468},[354,1738,473],{"class":472},[354,1740,767],{"class":364},[354,1742,1528],{"class":482},[354,1744,486],{"class":364},[354,1746,379],{"class":378},[354,1748,1535],{"class":382},[354,1750,386],{"class":378},[354,1752,402],{"class":364},[354,1754,1446],{"class":482},[354,1756,486],{"class":364},[354,1758,379],{"class":378},[354,1760,1453],{"class":382},[354,1762,386],{"class":378},[354,1764,372],{"class":364},[354,1766,510],{"class":472},[354,1768,389],{"class":364},[354,1770,1771,1773,1776,1778,1781,1784,1786],{"class":356,"line":392},[354,1772,386],{"class":378},[354,1774,1775],{"class":382},"draft",[354,1777,386],{"class":378},[354,1779,1780],{"class":364}," in",[354,1782,1783],{"class":368}," value",[354,1785,1462],{"class":364},[354,1787,1788],{"class":1311},"  \u002F\u002F false — even though draft declares { default: false }\n",[13,1790,1791,1792,1794,1795,1798,1799,1802],{},"The validator decides whether an absent ",[44,1793,1775],{}," is ",[1681,1796,1797],{},"legal",". It is, so the input passes. But\n",[22,1800,1801],{},"filling"," the hole belongs to the storage, at the point of persistence — a value that\nwould appear from nowhere during validation is a value the caller never sent and cannot\nbe held to. Validation and realization stay separate, so the same input validated twice never gains a\nfield on the way through.",[13,1804,1805,1806,1808],{},"If you are replacing a Zod schema whose ",[44,1807,976],{}," you relied on at the route, that\nline has to move to wherever the row is written.",[1322,1810,1812],{"id":1811},"what-does-not-cross","What does not cross",[13,1814,1815,1816,1819,1820,1822],{},"Standard Schema is one function: ",[44,1817,1818],{},"validate(value) → value | issues",". It carries the\n",[22,1821,338],{}," axis and nothing else.",[69,1824,1825,1839],{},[72,1826,1827],{},[75,1828,1829,1831,1836],{},[78,1830],{},[78,1832,1833,1834],{},"crosses ",[44,1835,1299],{},[78,1837,1838],{},"stays home",[85,1840,1841,1853,1865,1877],{},[75,1842,1843,1848,1851],{},[90,1844,1845,1847],{},[44,1846,338],{}," — the JSON Schema keywords",[90,1849,1850],{},"✅",[90,1852],{},[75,1854,1855,1860,1862],{},[90,1856,1857,1859],{},[44,1858,1052],{}," — primary, relations, unique",[90,1861],{},[90,1863,1864],{},"the DDL, the GraphQL type",[75,1866,1867,1872,1874],{},[90,1868,1869,1871],{},[44,1870,981],{}," — who writes, and when",[90,1873],{},[90,1875,1876],{},"the storage that stamps it",[75,1878,1879,1884,1887],{},[90,1880,1881,1883],{},[44,1882,1036],{}," — direction, conversions",[90,1885,1886],{},"partly — inbound decode runs",[90,1888,1889,1892,1893],{},[44,1890,1891],{},"Visibility.input"," \u002F ",[44,1894,1895],{},"Visibility.output",[13,1897,1898,1899,1902],{},"So a consumer outside Fougere gets the validator, in the browser or on its server, with the\nsame rules the facade applies. It does not get the table, the surfaces or the form\ncontract — those read ",[44,1900,1901],{},"Post.getFields()",", which is a Fougere call.",[13,1904,1905,1906,1909,1910,1913,1914,328],{},"For the serializable form of the same declaration — the one that crosses a ",[1681,1907,1908],{},"process"," or\na ",[1681,1911,1912],{},"language"," rather than a library boundary — see ",[16,1915,1917],{"href":1916},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","the identity card",[1919,1920,1921],"style",{},"html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .sgjsB, html code.shiki .sgjsB{--shiki-light:#6182B8;--shiki-default:#EFCD8F;--shiki-dark:#82AAFF}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 .slmMI, html code.shiki .slmMI{--shiki-light:#FF5370;--shiki-default:#EE9F6B;--shiki-dark:#FF9CAC}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}",{"title":350,"searchDepth":392,"depth":392,"links":1923},[1924,1925,1926,1927,1928,1929],{"id":36,"depth":392,"text":37},{"id":66,"depth":392,"text":67},{"id":331,"depth":392,"text":332},{"id":999,"depth":392,"text":1000},{"id":1093,"depth":392,"text":1094},{"id":1128,"depth":392,"text":1129,"children":1930},[1931,1932,1933,1934],{"id":1324,"depth":444,"text":1325},{"id":1483,"depth":444,"text":1484},{"id":1698,"depth":444,"text":1699},{"id":1811,"depth":444,"text":1812},"A Prisma or Drizzle model, converted one entity at a time.","md",[225],"task",{},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema",{"title":8,"description":1935},"docs\u002F7.adopt\u002F3.bring-your-schema",null,[1945],"entity","01q8tgN4ClBnHxEJPUMb4dqXWrxVJSY5kYKdwOmzqEE",[1948,1950,1953,1956,1959,1962,1965,1968,1971,1977,1983,1987,1991,1995,1999,2003,2007,2012,2016,2020,2025,2029,2034,2038,2042,2046,2050,2054,2058,2062,2066,2070,2073,2075,2079,2083,2087,2090,2093,2096,2098,2101,2104,2107,2110,2113,2116],{"path":980,"title":1949,"uses":1943},"Entity",{"path":1951,"title":1952,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":1954,"title":1955,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":1957,"title":1958,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":1960,"title":1961,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":1963,"title":1964,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":1966,"title":1967,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":1969,"title":1970,"uses":1943},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":1972,"title":1973,"uses":1974},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[1975,1976],"port","frond",{"path":1978,"title":1979,"uses":1980},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[1981,1982],"configuration","handler",{"path":1984,"title":1985,"uses":1986},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[1945,1981],{"path":1988,"title":1989,"uses":1990},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[1981,1945],{"path":1992,"title":1993,"uses":1994},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[1945,1975],{"path":1996,"title":1997,"uses":1998},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[1945],{"path":2000,"title":2001,"uses":2002},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[1945],{"path":2004,"title":2005,"uses":2006},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[1945,1981],{"path":2008,"title":2009,"uses":2010},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[2011],"repository",{"path":2013,"title":2014,"uses":2015},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[2011],{"path":2017,"title":2018,"uses":2019},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[1975,1976],{"path":2021,"title":2022,"uses":2023},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[2024],"fact",{"path":2026,"title":2027,"uses":2028},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[1982,1981],{"path":2030,"title":2031,"uses":2032},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[1982,2033],"facade",{"path":2035,"title":2036,"uses":2037},"\u002Fdocs\u002Fserve\u002Fforms","A form",[1945],{"path":2039,"title":2040,"uses":2041},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[1982],{"path":2043,"title":2044,"uses":2045},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[1981,1976],{"path":2047,"title":2048,"uses":2049},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[1981,1976],{"path":2051,"title":2052,"uses":2053},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[1981],{"path":2055,"title":2056,"uses":2057},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[1981,1982],{"path":2059,"title":2060,"uses":2061},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[1982],{"path":2063,"title":2064,"uses":2065},"\u002Fdocs\u002Frun\u002Ftest","Test",[1945,1975],{"path":2067,"title":2068,"uses":2069},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[1976,1981],{"path":18,"title":2071,"uses":2072},"Add Fougere to an existing app",[1976,1981],{"path":1940,"title":8,"uses":2074},[1945],{"path":2076,"title":2077,"uses":2078},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[1981],{"path":2080,"title":2081,"uses":2082},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[2033,1976],{"path":2084,"title":2085,"uses":2086},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":2088,"title":2089,"uses":1943},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":2091,"title":2092,"uses":1943},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":2094,"title":2095,"uses":1943},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":1916,"title":2097,"uses":1943},"The card and the wire",{"path":2099,"title":2100,"uses":1943},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":2102,"title":2103,"uses":1943},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":2105,"title":2106,"uses":1943},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":2108,"title":2109,"uses":1943},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":2111,"title":2112,"uses":1943},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":2114,"title":2115,"uses":1943},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":2117,"title":2118,"uses":1943},"\u002Fdocs","What is Fougere",[2120],{"title":2121,"path":2117,"stem":2122,"children":2123,"page":-1},"Docs","docs",[2124,2126,2147,2156,2177,2186,2199,2216,2232],{"title":2118,"path":2117,"stem":2125},"docs\u002Findex",{"title":2127,"path":2128,"stem":2129,"children":2130,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[2131,2133,2135,2137,2139,2141,2143,2145],{"title":1949,"path":980,"stem":2132},"docs\u002F1.concepts\u002F1.entity",{"title":1952,"path":1951,"stem":2134},"docs\u002F1.concepts\u002F2.handler",{"title":1955,"path":1954,"stem":2136},"docs\u002F1.concepts\u002F3.repository",{"title":1958,"path":1957,"stem":2138},"docs\u002F1.concepts\u002F4.frond",{"title":1961,"path":1960,"stem":2140},"docs\u002F1.concepts\u002F5.facade",{"title":1964,"path":1963,"stem":2142},"docs\u002F1.concepts\u002F6.fact",{"title":1967,"path":1966,"stem":2144},"docs\u002F1.concepts\u002F7.port",{"title":1970,"path":1969,"stem":2146},"docs\u002F1.concepts\u002F8.configuration",{"title":2148,"path":2149,"stem":2150,"children":2151,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[2152,2154],{"title":1973,"path":1972,"stem":2153},"docs\u002F2.access\u002F1.authentication",{"title":1979,"path":1978,"stem":2155},"docs\u002F2.access\u002F2.state",{"title":2157,"path":2158,"stem":2159,"children":2160,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[2161,2163,2165,2167,2169,2171,2173,2175],{"title":1985,"path":1984,"stem":2162},"docs\u002F3.data\u002F1.sql",{"title":1989,"path":1988,"stem":2164},"docs\u002F3.data\u002F2.several-databases",{"title":1993,"path":1992,"stem":2166},"docs\u002F3.data\u002F3.computed-field",{"title":1997,"path":1996,"stem":2168},"docs\u002F3.data\u002F4.evolve",{"title":2001,"path":2000,"stem":2170},"docs\u002F3.data\u002F5.seeds",{"title":2005,"path":2004,"stem":2172},"docs\u002F3.data\u002F6.values",{"title":2009,"path":2008,"stem":2174},"docs\u002F3.data\u002F7.mirror",{"title":2014,"path":2013,"stem":2176},"docs\u002F3.data\u002F8.together",{"title":2178,"path":2179,"stem":2180,"children":2181,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[2182,2184],{"title":2018,"path":2017,"stem":2183},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":2022,"path":2021,"stem":2185},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":2187,"path":2188,"stem":2189,"children":2190,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[2191,2193,2195,2197],{"title":2027,"path":2026,"stem":2192},"docs\u002F5.serve\u002F1.rest-graphql",{"title":2031,"path":2030,"stem":2194},"docs\u002F5.serve\u002F2.pages",{"title":2036,"path":2035,"stem":2196},"docs\u002F5.serve\u002F3.forms",{"title":2040,"path":2039,"stem":2198},"docs\u002F5.serve\u002F4.admin",{"title":2200,"path":2201,"stem":2202,"children":2203,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[2204,2206,2208,2210,2212,2214],{"title":2044,"path":2043,"stem":2205},"docs\u002F6.run\u002F1.deploy",{"title":2048,"path":2047,"stem":2207},"docs\u002F6.run\u002F2.secure",{"title":2052,"path":2051,"stem":2209},"docs\u002F6.run\u002F3.lifecycle",{"title":2056,"path":2055,"stem":2211},"docs\u002F6.run\u002F4.observe",{"title":2060,"path":2059,"stem":2213},"docs\u002F6.run\u002F5.dev-panel",{"title":2064,"path":2063,"stem":2215},"docs\u002F6.run\u002F6.test",{"title":2217,"path":2218,"stem":2219,"children":2220,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[2221,2223,2225,2226,2228,2230],{"title":2068,"path":2067,"stem":2222},"docs\u002F7.adopt\u002F1.new-project",{"title":2071,"path":18,"stem":2224},"docs\u002F7.adopt\u002F2.existing-app",{"title":8,"path":1940,"stem":1942},{"title":2077,"path":2076,"stem":2227},"docs\u002F7.adopt\u002F4.hosts",{"title":2081,"path":2080,"stem":2229},"docs\u002F7.adopt\u002F5.another-repository",{"title":2085,"path":2084,"stem":2231},"docs\u002F7.adopt\u002F6.demos",{"title":2233,"path":2234,"stem":2235,"children":2236,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[2237,2239,2241,2243,2245,2247,2249,2251,2253,2255],{"title":2089,"path":2088,"stem":2238},"docs\u002F8.extending\u002F1.scan",{"title":2092,"path":2091,"stem":2240},"docs\u002F8.extending\u002F10.without-compiler",{"title":2095,"path":2094,"stem":2242},"docs\u002F8.extending\u002F2.boot",{"title":2097,"path":1916,"stem":2244},"docs\u002F8.extending\u002F3.card-and-wire",{"title":2100,"path":2099,"stem":2246},"docs\u002F8.extending\u002F4.extension-points",{"title":2103,"path":2102,"stem":2248},"docs\u002F8.extending\u002F5.vocabulary",{"title":2106,"path":2105,"stem":2250},"docs\u002F8.extending\u002F6.extensions",{"title":2109,"path":2108,"stem":2252},"docs\u002F8.extending\u002F7.source-adapter",{"title":2112,"path":2111,"stem":2254},"docs\u002F8.extending\u002F8.surface",{"title":2115,"path":2114,"stem":2256},"docs\u002F8.extending\u002F9.foreign-frond",1794396613885]