[{"data":1,"prerenderedAt":1961},["ShallowReactive",2],{"page-\u002Fcore\u002Fguides\u002Fparsing-and-validating":3,"navigation":1586},{"collection":4,"page":5},"docs_en",{"id":6,"title":7,"body":8,"description":1578,"extension":1579,"meta":1580,"navigation":95,"path":1581,"rawbody":1582,"seo":1583,"stem":1584,"__hash__":1585},"docs_en\u002Fcore\u002F2.guides\u002F1.parsing-and-validating.md","Parsing and validating",{"type":9,"value":10,"toc":1567},"minimark",[11,34,46,118,124,181,226,230,252,907,957,964,970,975,1063,1073,1076,1325,1359,1363,1379,1403,1410,1416,1502,1505,1532,1544,1548,1563],[12,13,14,18,19,22,23,28,29,33],"p",{},[15,16,17],"code",{},"@welldot\u002Fcore"," defines what a valid ",[15,20,21],{},".well"," file is. The same validators back the ",[24,25,27],"a",{"href":26},"\u002Fformat\u002Freference\u002Fjson-schema","JSON Schema",", the welldot.org editor and this site's ",[24,30,32],{"href":31},"\u002Fai\u002Fmcp","MCP validator",", so every tool agrees.",[35,36,38,41,42,45],"h2",{"id":37},"parsewell-text-in-well-out",[15,39,40],{},"parseWell",": text in, ",[15,43,44],{},"Well"," out",[47,48,53],"pre",{"className":49,"code":50,"language":51,"meta":52,"style":52},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { parseWell } from '@welldot\u002Fcore';\n\nconst well = parseWell(text);\n","ts","",[15,54,55,90,97],{"__ignoreMap":52},[56,57,60,64,68,72,75,78,81,84,87],"span",{"class":58,"line":59},"line",1,[56,61,63],{"class":62},"s7zQu","import",[56,65,67],{"class":66},"sMK4o"," {",[56,69,71],{"class":70},"sTEyZ"," parseWell",[56,73,74],{"class":66}," }",[56,76,77],{"class":62}," from",[56,79,80],{"class":66}," '",[56,82,17],{"class":83},"sfazB",[56,85,86],{"class":66},"'",[56,88,89],{"class":66},";\n",[56,91,93],{"class":58,"line":92},2,[56,94,96],{"emptyLinePlaceholder":95},true,"\n",[56,98,100,104,107,110,113,116],{"class":58,"line":99},3,[56,101,103],{"class":102},"spNyl","const",[56,105,106],{"class":70}," well ",[56,108,109],{"class":66},"=",[56,111,71],{"class":112},"s2Zo4",[56,114,115],{"class":70},"(text)",[56,117,89],{"class":66},[12,119,120,123],{},[15,121,122],{},"parseWell(json: string): Well"," does four things, in order:",[125,126,127,131,163,174],"ol",{},[128,129,130],"li",{},"Parses the JSON text.",[128,132,133,134,137,138,142,143,146,147,150,151,154,155,158,159,162],{},"Reads ",[15,135,136],{},"version"," and decides how to read the file, following ",[24,139,141],{"href":140},"\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#parser-version-handling","parser version handling",": ",[15,144,145],{},"1"," is upgraded to v2, ",[15,148,149],{},"2"," and any ",[15,152,153],{},"\"2.x\""," are read as v2, a missing version is read as v2, anything else throws an ",[15,156,157],{},"Error"," naming the value (",[15,160,161],{},"Unsupported .well format version: \"3.0\"",").",[128,164,165,166,169,170,173],{},"Validates the document against ",[15,167,168],{},"WellSchema"," and throws a ",[15,171,172],{},"ZodError"," on failure.",[128,175,176,177,162],{},"Returns the validated data with every unknown member kept, at every level, including inside array items (",[24,178,180],{"href":179},"\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#extensibility","extensibility",[12,182,183,184,188,189,192,193,196,197,200,201,192,204,207,208,192,211,207,214,217,218,221,222,225],{},"The v1 upgrade applies the normalizations from ",[24,185,187],{"href":186},"\u002Fformat\u002Fspec\u002Fv2\u002Foverview#changes-from-v1","changes from v1",": flat ",[15,190,191],{},"lat",", ",[15,194,195],{},"lng"," and ",[15,198,199],{},"elevation"," become ",[15,202,203],{},"location",[15,205,206],{},"fgdc_texture"," becomes ",[15,209,210],{},"texture",[15,212,213],{},"screen_slot_mm",[15,215,216],{},"screen_slot",", and the ",[15,219,220],{},"bole_hole"," typo becomes ",[15,223,224],{},"bore_hole",".",[35,227,229],{"id":228},"readable-error-messages","Readable error messages",[12,231,232,233,235,236,239,240,243,244,247,248,251],{},"A ",[15,234,172],{}," carries an ",[15,237,238],{},"issues"," array. Each issue has a ",[15,241,242],{},"path"," (field names and array indexes) and a ",[15,245,246],{},"message",". This helper turns them into the ",[15,249,250],{},"field[0].name: message"," form used across the docs:",[47,253,256],{"className":49,"code":254,"filename":255,"language":51,"meta":52,"style":52},"import { parseWell, type Well } from '@welldot\u002Fcore';\n\ntype Issue = { path: (string | number)[]; message: string };\n\nexport type Result =\n  | { valid: true; well: Well }\n  | { valid: false; errors: string[] };\n\nfunction formatPath(path: (string | number)[]): string {\n  return path.reduce\u003Cstring>(\n    (out, seg) =>\n      typeof seg === 'number' ? `${out}[${seg}]` : out ? `${out}.${seg}` : seg,\n    '',\n  );\n}\n\nexport function validate(text: string): Result {\n  try {\n    return { valid: true, well: parseWell(text) };\n  } catch (error) {\n    if (error instanceof Error && error.name === 'ZodError') {\n      const { issues } = error as Error & { issues: Issue[] };\n      return {\n        valid: false,\n        errors: issues.map(i => `${formatPath(i.path)}: ${i.message}`),\n      };\n    }\n    \u002F\u002F Invalid JSON or an unsupported version\n    return { valid: false, errors: [(error as Error).message] };\n  }\n}\n","validate.ts",[15,257,258,287,291,341,346,360,388,417,422,457,481,501,576,584,592,598,603,629,637,669,688,727,764,772,784,838,844,850,857,896,902],{"__ignoreMap":52},[56,259,260,262,264,266,269,272,275,277,279,281,283,285],{"class":58,"line":59},[56,261,63],{"class":62},[56,263,67],{"class":66},[56,265,71],{"class":70},[56,267,268],{"class":66},",",[56,270,271],{"class":62}," type",[56,273,274],{"class":70}," Well",[56,276,74],{"class":66},[56,278,77],{"class":62},[56,280,80],{"class":66},[56,282,17],{"class":83},[56,284,86],{"class":66},[56,286,89],{"class":66},[56,288,289],{"class":58,"line":92},[56,290,96],{"emptyLinePlaceholder":95},[56,292,293,296,300,303,305,309,312,315,318,321,324,327,330,333,335,338],{"class":58,"line":99},[56,294,295],{"class":102},"type",[56,297,299],{"class":298},"sBMFI"," Issue",[56,301,302],{"class":66}," =",[56,304,67],{"class":66},[56,306,308],{"class":307},"swJcz"," path",[56,310,311],{"class":66},":",[56,313,314],{"class":70}," (",[56,316,317],{"class":298},"string",[56,319,320],{"class":66}," |",[56,322,323],{"class":298}," number",[56,325,326],{"class":70},")[]",[56,328,329],{"class":66},";",[56,331,332],{"class":307}," message",[56,334,311],{"class":66},[56,336,337],{"class":298}," string",[56,339,340],{"class":66}," };\n",[56,342,344],{"class":58,"line":343},4,[56,345,96],{"emptyLinePlaceholder":95},[56,347,349,352,354,357],{"class":58,"line":348},5,[56,350,351],{"class":62},"export",[56,353,271],{"class":102},[56,355,356],{"class":298}," Result",[56,358,359],{"class":66}," =\n",[56,361,363,366,368,371,373,376,378,381,383,385],{"class":58,"line":362},6,[56,364,365],{"class":66},"  |",[56,367,67],{"class":66},[56,369,370],{"class":307}," valid",[56,372,311],{"class":66},[56,374,375],{"class":298}," true",[56,377,329],{"class":66},[56,379,380],{"class":307}," well",[56,382,311],{"class":66},[56,384,274],{"class":298},[56,386,387],{"class":66}," }\n",[56,389,391,393,395,397,399,402,404,407,409,411,414],{"class":58,"line":390},7,[56,392,365],{"class":66},[56,394,67],{"class":66},[56,396,370],{"class":307},[56,398,311],{"class":66},[56,400,401],{"class":298}," false",[56,403,329],{"class":66},[56,405,406],{"class":307}," errors",[56,408,311],{"class":66},[56,410,337],{"class":298},[56,412,413],{"class":70},"[] ",[56,415,416],{"class":66},"};\n",[56,418,420],{"class":58,"line":419},8,[56,421,96],{"emptyLinePlaceholder":95},[56,423,425,428,431,434,437,439,441,443,445,447,449,452,454],{"class":58,"line":424},9,[56,426,427],{"class":102},"function",[56,429,430],{"class":112}," formatPath",[56,432,433],{"class":66},"(",[56,435,242],{"class":436},"sHdIc",[56,438,311],{"class":66},[56,440,314],{"class":70},[56,442,317],{"class":298},[56,444,320],{"class":66},[56,446,323],{"class":298},[56,448,326],{"class":70},[56,450,451],{"class":66},"):",[56,453,337],{"class":298},[56,455,456],{"class":66}," {\n",[56,458,460,463,465,467,470,473,475,478],{"class":58,"line":459},10,[56,461,462],{"class":62},"  return",[56,464,308],{"class":70},[56,466,225],{"class":66},[56,468,469],{"class":112},"reduce",[56,471,472],{"class":66},"\u003C",[56,474,317],{"class":298},[56,476,477],{"class":66},">",[56,479,480],{"class":307},"(\n",[56,482,484,487,490,492,495,498],{"class":58,"line":483},11,[56,485,486],{"class":66},"    (",[56,488,489],{"class":436},"out",[56,491,268],{"class":66},[56,493,494],{"class":436}," seg",[56,496,497],{"class":66},")",[56,499,500],{"class":102}," =>\n",[56,502,504,507,509,512,514,517,519,522,525,527,530,533,536,539,541,544,547,550,552,554,556,558,560,562,564,566,569,571,573],{"class":58,"line":503},12,[56,505,506],{"class":66},"      typeof",[56,508,494],{"class":70},[56,510,511],{"class":66}," ===",[56,513,80],{"class":66},[56,515,516],{"class":83},"number",[56,518,86],{"class":66},[56,520,521],{"class":66}," ?",[56,523,524],{"class":66}," `${",[56,526,489],{"class":70},[56,528,529],{"class":66},"}",[56,531,532],{"class":83},"[",[56,534,535],{"class":66},"${",[56,537,538],{"class":70},"seg",[56,540,529],{"class":66},[56,542,543],{"class":83},"]",[56,545,546],{"class":66},"`",[56,548,549],{"class":66}," :",[56,551,45],{"class":70},[56,553,521],{"class":66},[56,555,524],{"class":66},[56,557,489],{"class":70},[56,559,529],{"class":66},[56,561,225],{"class":83},[56,563,535],{"class":66},[56,565,538],{"class":70},[56,567,568],{"class":66},"}`",[56,570,549],{"class":66},[56,572,494],{"class":70},[56,574,575],{"class":66},",\n",[56,577,579,582],{"class":58,"line":578},13,[56,580,581],{"class":66},"    ''",[56,583,575],{"class":66},[56,585,587,590],{"class":58,"line":586},14,[56,588,589],{"class":307},"  )",[56,591,89],{"class":66},[56,593,595],{"class":58,"line":594},15,[56,596,597],{"class":66},"}\n",[56,599,601],{"class":58,"line":600},16,[56,602,96],{"emptyLinePlaceholder":95},[56,604,606,608,611,614,616,619,621,623,625,627],{"class":58,"line":605},17,[56,607,351],{"class":62},[56,609,610],{"class":102}," function",[56,612,613],{"class":112}," validate",[56,615,433],{"class":66},[56,617,618],{"class":436},"text",[56,620,311],{"class":66},[56,622,337],{"class":298},[56,624,451],{"class":66},[56,626,356],{"class":298},[56,628,456],{"class":66},[56,630,632,635],{"class":58,"line":631},18,[56,633,634],{"class":62},"  try",[56,636,456],{"class":66},[56,638,640,643,645,647,649,652,654,656,658,660,662,664,667],{"class":58,"line":639},19,[56,641,642],{"class":62},"    return",[56,644,67],{"class":66},[56,646,370],{"class":307},[56,648,311],{"class":66},[56,650,375],{"class":651},"sfNiH",[56,653,268],{"class":66},[56,655,380],{"class":307},[56,657,311],{"class":66},[56,659,71],{"class":112},[56,661,433],{"class":307},[56,663,618],{"class":70},[56,665,666],{"class":307},") ",[56,668,416],{"class":66},[56,670,672,675,678,680,683,685],{"class":58,"line":671},20,[56,673,674],{"class":66},"  }",[56,676,677],{"class":62}," catch",[56,679,314],{"class":307},[56,681,682],{"class":70},"error",[56,684,666],{"class":307},[56,686,687],{"class":66},"{\n",[56,689,691,694,696,698,701,704,707,710,712,715,717,719,721,723,725],{"class":58,"line":690},21,[56,692,693],{"class":62},"    if",[56,695,314],{"class":307},[56,697,682],{"class":70},[56,699,700],{"class":66}," instanceof",[56,702,703],{"class":298}," Error",[56,705,706],{"class":66}," &&",[56,708,709],{"class":70}," error",[56,711,225],{"class":66},[56,713,714],{"class":70},"name",[56,716,511],{"class":66},[56,718,80],{"class":66},[56,720,172],{"class":83},[56,722,86],{"class":66},[56,724,666],{"class":307},[56,726,687],{"class":66},[56,728,730,733,735,738,740,742,744,747,749,752,754,756,758,760,762],{"class":58,"line":729},22,[56,731,732],{"class":102},"      const",[56,734,67],{"class":66},[56,736,737],{"class":70}," issues",[56,739,74],{"class":66},[56,741,302],{"class":66},[56,743,709],{"class":70},[56,745,746],{"class":62}," as",[56,748,703],{"class":298},[56,750,751],{"class":66}," &",[56,753,67],{"class":66},[56,755,737],{"class":307},[56,757,311],{"class":66},[56,759,299],{"class":298},[56,761,413],{"class":307},[56,763,416],{"class":66},[56,765,767,770],{"class":58,"line":766},23,[56,768,769],{"class":62},"      return",[56,771,456],{"class":66},[56,773,775,778,780,782],{"class":58,"line":774},24,[56,776,777],{"class":307},"        valid",[56,779,311],{"class":66},[56,781,401],{"class":651},[56,783,575],{"class":66},[56,785,787,790,792,794,796,799,801,804,807,809,812,815,817,820,822,824,826,828,830,832,834,836],{"class":58,"line":786},25,[56,788,789],{"class":307},"        errors",[56,791,311],{"class":66},[56,793,737],{"class":70},[56,795,225],{"class":66},[56,797,798],{"class":112},"map",[56,800,433],{"class":307},[56,802,803],{"class":436},"i",[56,805,806],{"class":102}," =>",[56,808,524],{"class":66},[56,810,811],{"class":112},"formatPath",[56,813,814],{"class":70},"(i",[56,816,225],{"class":66},[56,818,819],{"class":70},"path)",[56,821,529],{"class":66},[56,823,142],{"class":83},[56,825,535],{"class":66},[56,827,803],{"class":70},[56,829,225],{"class":66},[56,831,246],{"class":70},[56,833,568],{"class":66},[56,835,497],{"class":307},[56,837,575],{"class":66},[56,839,841],{"class":58,"line":840},26,[56,842,843],{"class":66},"      };\n",[56,845,847],{"class":58,"line":846},27,[56,848,849],{"class":66},"    }\n",[56,851,853],{"class":58,"line":852},28,[56,854,856],{"class":855},"sHwdD","    \u002F\u002F Invalid JSON or an unsupported version\n",[56,858,860,862,864,866,868,870,872,874,876,879,881,883,885,887,889,891,894],{"class":58,"line":859},29,[56,861,642],{"class":62},[56,863,67],{"class":66},[56,865,370],{"class":307},[56,867,311],{"class":66},[56,869,401],{"class":651},[56,871,268],{"class":66},[56,873,406],{"class":307},[56,875,311],{"class":66},[56,877,878],{"class":307}," [(",[56,880,682],{"class":70},[56,882,746],{"class":62},[56,884,703],{"class":298},[56,886,497],{"class":307},[56,888,225],{"class":66},[56,890,246],{"class":70},[56,892,893],{"class":307},"] ",[56,895,416],{"class":66},[56,897,899],{"class":58,"line":898},30,[56,900,901],{"class":66},"  }\n",[56,903,905],{"class":58,"line":904},31,[56,906,597],{"class":66},[47,908,910],{"className":49,"code":909,"language":51,"meta":52,"style":52},"validate(\n  '{\"version\":\"2.4\",\"bore_hole\":[{\"from\":0,\"to\":\"60 m\",\"diameter\":254}]}',\n);\n\u002F\u002F { valid: false, errors: [\n\u002F\u002F   'bore_hole[0].to: Expected number, received string',\n\u002F\u002F   'well_case: Required', …\n\u002F\u002F ] }\n",[15,911,912,919,931,937,942,947,952],{"__ignoreMap":52},[56,913,914,917],{"class":58,"line":59},[56,915,916],{"class":112},"validate",[56,918,480],{"class":70},[56,920,921,924,927,929],{"class":58,"line":92},[56,922,923],{"class":66},"  '",[56,925,926],{"class":83},"{\"version\":\"2.4\",\"bore_hole\":[{\"from\":0,\"to\":\"60 m\",\"diameter\":254}]}",[56,928,86],{"class":66},[56,930,575],{"class":66},[56,932,933,935],{"class":58,"line":99},[56,934,497],{"class":70},[56,936,89],{"class":66},[56,938,939],{"class":58,"line":343},[56,940,941],{"class":855},"\u002F\u002F { valid: false, errors: [\n",[56,943,944],{"class":58,"line":348},[56,945,946],{"class":855},"\u002F\u002F   'bore_hole[0].to: Expected number, received string',\n",[56,948,949],{"class":58,"line":362},[56,950,951],{"class":855},"\u002F\u002F   'well_case: Required', …\n",[56,953,954],{"class":58,"line":390},[56,955,956],{"class":855},"\u002F\u002F ] }\n",[12,958,959,963],{},[24,960,962],{"href":961},"\u002Fformat\u002Fguides\u002Fvalidating","Validating"," explains the common messages.",[35,965,967,969],{"id":966},"wellschema-and-the-object-schemas",[15,968,168],{}," and the object schemas",[12,971,972,974],{},[15,973,168],{}," is the Zod schema of a whole document. Use it to check an object you already have, for example one assembled by a form:",[47,976,978],{"className":49,"code":977,"language":51,"meta":52,"style":52},"import { WellSchema } from '@welldot\u002Fcore';\n\nconst result = WellSchema.safeParse(candidate);\nif (!result.success) console.log(result.error.issues);\n",[15,979,980,1001,1005,1026],{"__ignoreMap":52},[56,981,982,984,986,989,991,993,995,997,999],{"class":58,"line":59},[56,983,63],{"class":62},[56,985,67],{"class":66},[56,987,988],{"class":70}," WellSchema",[56,990,74],{"class":66},[56,992,77],{"class":62},[56,994,80],{"class":66},[56,996,17],{"class":83},[56,998,86],{"class":66},[56,1000,89],{"class":66},[56,1002,1003],{"class":58,"line":92},[56,1004,96],{"emptyLinePlaceholder":95},[56,1006,1007,1009,1012,1014,1016,1018,1021,1024],{"class":58,"line":99},[56,1008,103],{"class":102},[56,1010,1011],{"class":70}," result ",[56,1013,109],{"class":66},[56,1015,988],{"class":70},[56,1017,225],{"class":66},[56,1019,1020],{"class":112},"safeParse",[56,1022,1023],{"class":70},"(candidate)",[56,1025,89],{"class":66},[56,1027,1028,1031,1033,1036,1039,1041,1044,1046,1049,1052,1054,1056,1058,1061],{"class":58,"line":343},[56,1029,1030],{"class":62},"if",[56,1032,314],{"class":70},[56,1034,1035],{"class":66},"!",[56,1037,1038],{"class":70},"result",[56,1040,225],{"class":66},[56,1042,1043],{"class":70},"success) console",[56,1045,225],{"class":66},[56,1047,1048],{"class":112},"log",[56,1050,1051],{"class":70},"(result",[56,1053,225],{"class":66},[56,1055,682],{"class":70},[56,1057,225],{"class":66},[56,1059,1060],{"class":70},"issues)",[56,1062,89],{"class":66},[12,1064,1065,1067,1068,1070,1071,225],{},[15,1066,168],{}," checks a v2 object as it is: it does not upgrade v1 data and does not look at ",[15,1069,136],{}," beyond its shape. For files, use ",[15,1072,40],{},[12,1074,1075],{},"Every object has its own schema too, which is handy for validating one record before adding it:",[47,1077,1079],{"className":49,"code":1078,"language":51,"meta":52,"style":52},"import { LithologySchema, WellScreenSchema } from '@welldot\u002Fcore';\n\nLithologySchema.parse({\n  from: 8,\n  to: 30,\n  description: 'Silty sandstone',\n  color: '#c9a27a',\n  texture: { code: 612, vocabulary: 'fgdc' },\n  geologic_unit: 'Botucatu Formation',\n  aquifer_unit: 'Guarani',\n});\n\nWellScreenSchema.safeParse({ from: 36, to: 54, type: 'pvc', diameter: 168.3 });\n\u002F\u002F fails: screen_slot is required\n",[15,1080,1081,1107,1111,1125,1138,1150,1166,1182,1216,1232,1248,1256,1260,1320],{"__ignoreMap":52},[56,1082,1083,1085,1087,1090,1092,1095,1097,1099,1101,1103,1105],{"class":58,"line":59},[56,1084,63],{"class":62},[56,1086,67],{"class":66},[56,1088,1089],{"class":70}," LithologySchema",[56,1091,268],{"class":66},[56,1093,1094],{"class":70}," WellScreenSchema",[56,1096,74],{"class":66},[56,1098,77],{"class":62},[56,1100,80],{"class":66},[56,1102,17],{"class":83},[56,1104,86],{"class":66},[56,1106,89],{"class":66},[56,1108,1109],{"class":58,"line":92},[56,1110,96],{"emptyLinePlaceholder":95},[56,1112,1113,1116,1118,1121,1123],{"class":58,"line":99},[56,1114,1115],{"class":70},"LithologySchema",[56,1117,225],{"class":66},[56,1119,1120],{"class":112},"parse",[56,1122,433],{"class":70},[56,1124,687],{"class":66},[56,1126,1127,1130,1132,1136],{"class":58,"line":343},[56,1128,1129],{"class":307},"  from",[56,1131,311],{"class":66},[56,1133,1135],{"class":1134},"sbssI"," 8",[56,1137,575],{"class":66},[56,1139,1140,1143,1145,1148],{"class":58,"line":348},[56,1141,1142],{"class":307},"  to",[56,1144,311],{"class":66},[56,1146,1147],{"class":1134}," 30",[56,1149,575],{"class":66},[56,1151,1152,1155,1157,1159,1162,1164],{"class":58,"line":362},[56,1153,1154],{"class":307},"  description",[56,1156,311],{"class":66},[56,1158,80],{"class":66},[56,1160,1161],{"class":83},"Silty sandstone",[56,1163,86],{"class":66},[56,1165,575],{"class":66},[56,1167,1168,1171,1173,1175,1178,1180],{"class":58,"line":390},[56,1169,1170],{"class":307},"  color",[56,1172,311],{"class":66},[56,1174,80],{"class":66},[56,1176,1177],{"class":83},"#c9a27a",[56,1179,86],{"class":66},[56,1181,575],{"class":66},[56,1183,1184,1187,1189,1191,1194,1196,1199,1201,1204,1206,1208,1211,1213],{"class":58,"line":419},[56,1185,1186],{"class":307},"  texture",[56,1188,311],{"class":66},[56,1190,67],{"class":66},[56,1192,1193],{"class":307}," code",[56,1195,311],{"class":66},[56,1197,1198],{"class":1134}," 612",[56,1200,268],{"class":66},[56,1202,1203],{"class":307}," vocabulary",[56,1205,311],{"class":66},[56,1207,80],{"class":66},[56,1209,1210],{"class":83},"fgdc",[56,1212,86],{"class":66},[56,1214,1215],{"class":66}," },\n",[56,1217,1218,1221,1223,1225,1228,1230],{"class":58,"line":424},[56,1219,1220],{"class":307},"  geologic_unit",[56,1222,311],{"class":66},[56,1224,80],{"class":66},[56,1226,1227],{"class":83},"Botucatu Formation",[56,1229,86],{"class":66},[56,1231,575],{"class":66},[56,1233,1234,1237,1239,1241,1244,1246],{"class":58,"line":459},[56,1235,1236],{"class":307},"  aquifer_unit",[56,1238,311],{"class":66},[56,1240,80],{"class":66},[56,1242,1243],{"class":83},"Guarani",[56,1245,86],{"class":66},[56,1247,575],{"class":66},[56,1249,1250,1252,1254],{"class":58,"line":483},[56,1251,529],{"class":66},[56,1253,497],{"class":70},[56,1255,89],{"class":66},[56,1257,1258],{"class":58,"line":503},[56,1259,96],{"emptyLinePlaceholder":95},[56,1261,1262,1265,1267,1269,1271,1274,1276,1278,1281,1283,1286,1288,1291,1293,1295,1297,1299,1302,1304,1306,1309,1311,1314,1316,1318],{"class":58,"line":578},[56,1263,1264],{"class":70},"WellScreenSchema",[56,1266,225],{"class":66},[56,1268,1020],{"class":112},[56,1270,433],{"class":70},[56,1272,1273],{"class":66},"{",[56,1275,77],{"class":307},[56,1277,311],{"class":66},[56,1279,1280],{"class":1134}," 36",[56,1282,268],{"class":66},[56,1284,1285],{"class":307}," to",[56,1287,311],{"class":66},[56,1289,1290],{"class":1134}," 54",[56,1292,268],{"class":66},[56,1294,271],{"class":307},[56,1296,311],{"class":66},[56,1298,80],{"class":66},[56,1300,1301],{"class":83},"pvc",[56,1303,86],{"class":66},[56,1305,268],{"class":66},[56,1307,1308],{"class":307}," diameter",[56,1310,311],{"class":66},[56,1312,1313],{"class":1134}," 168.3",[56,1315,74],{"class":66},[56,1317,497],{"class":70},[56,1319,89],{"class":66},[56,1321,1322],{"class":58,"line":586},[56,1323,1324],{"class":855},"\u002F\u002F fails: screen_slot is required\n",[12,1326,1327,1328,192,1331,196,1334,1337,1338,1342,1343,192,1346,192,1349,192,1352,192,1355,1358],{},"They are ordinary Zod schemas, so ",[15,1329,1330],{},".extend",[15,1332,1333],{},".pick",[15,1335,1336],{},".refine"," work as usual. The list is in the ",[24,1339,1341],{"href":1340},"\u002Fcore\u002Fapi","API reference"," under Variables (",[15,1344,1345],{},"BoreHoleSchema",[15,1347,1348],{},"WellCaseSchema",[15,1350,1351],{},"HydrodynamicEventSchema",[15,1353,1354],{},"PermitSchema",[15,1356,1357],{},"WaterSampleSchema",", …).",[35,1360,1362],{"id":1361},"what-the-validators-check-and-what-they-do-not","What the validators check, and what they do not",[12,1364,1365,1366,1369,1370,192,1373,1376,1377,162],{},"They check the schema: required fields, types, closed vocabularies, formats such as ",[15,1367,1368],{},"YYYY-MM-DD"," dates and RFC 3339 instants with an offset, and the cross-field rules the spec makes errors (for example, a water quality result has exactly one of ",[15,1371,1372],{},"value",[15,1374,1375],{},"presence"," or ",[15,1378,618],{},[12,1380,1381,1382,1385,1386,1389,1390,1396,1397,196,1400,225],{},"They do not add rules the spec does not have, and they do not check geometry (",[15,1383,1384],{},"from"," below ",[15,1387,1388],{},"to",", casings inside the hole) or references between records. Those are warnings in the spec, computed by ",[24,1391,1393],{"href":1392},"\u002Futils",[15,1394,1395],{},"@welldot\u002Futils",", for example ",[15,1398,1399],{},"getPermitWarnings",[15,1401,1402],{},"getWaterSampleWarnings",[35,1404,1406,1407],{"id":1405},"legacy-files-deserializewell","Legacy files: ",[15,1408,1409],{},"deserializeWell",[12,1411,1412,1413,1415],{},"Files written by early versions of Well Profiler, before the format had a version field, used other shapes. ",[15,1414,1409],{}," reads them:",[47,1417,1419],{"className":49,"code":1418,"language":51,"meta":52,"style":52},"import { deserializeWell, parseWell, serializeWell } from '@welldot\u002Fcore';\n\nconst restored = deserializeWell(oldText); \u002F\u002F Well, or null for an unversioned file with no profile\nconst well = restored && parseWell(serializeWell(restored)); \u002F\u002F then validate\n",[15,1420,1421,1451,1455,1474],{"__ignoreMap":52},[56,1422,1423,1425,1427,1430,1432,1434,1436,1439,1441,1443,1445,1447,1449],{"class":58,"line":59},[56,1424,63],{"class":62},[56,1426,67],{"class":66},[56,1428,1429],{"class":70}," deserializeWell",[56,1431,268],{"class":66},[56,1433,71],{"class":70},[56,1435,268],{"class":66},[56,1437,1438],{"class":70}," serializeWell",[56,1440,74],{"class":66},[56,1442,77],{"class":62},[56,1444,80],{"class":66},[56,1446,17],{"class":83},[56,1448,86],{"class":66},[56,1450,89],{"class":66},[56,1452,1453],{"class":58,"line":92},[56,1454,96],{"emptyLinePlaceholder":95},[56,1456,1457,1459,1462,1464,1466,1469,1471],{"class":58,"line":99},[56,1458,103],{"class":102},[56,1460,1461],{"class":70}," restored ",[56,1463,109],{"class":66},[56,1465,1429],{"class":112},[56,1467,1468],{"class":70},"(oldText)",[56,1470,329],{"class":66},[56,1472,1473],{"class":855}," \u002F\u002F Well, or null for an unversioned file with no profile\n",[56,1475,1476,1478,1480,1482,1484,1487,1489,1491,1494,1497,1499],{"class":58,"line":343},[56,1477,103],{"class":102},[56,1479,106],{"class":70},[56,1481,109],{"class":66},[56,1483,1461],{"class":70},[56,1485,1486],{"class":66},"&&",[56,1488,71],{"class":112},[56,1490,433],{"class":70},[56,1492,1493],{"class":112},"serializeWell",[56,1495,1496],{"class":70},"(restored))",[56,1498,329],{"class":66},[56,1500,1501],{"class":855}," \u002F\u002F then validate\n",[12,1503,1504],{},"It accepts v2 and v1 files and also:",[1506,1507,1508,1519,1526],"ul",{},[128,1509,1510,1511,1514,1515,1518],{},"the old ",[15,1512,1513],{},"constructive"," \u002F ",[15,1516,1517],{},"geologic"," sub-objects;",[128,1520,1521,1522,1525],{},"diameters in inches (",[15,1523,1524],{},"diam_pol","), converted to millimeters;",[128,1527,1528,1529,1531],{},"the ",[15,1530,220],{}," typo.",[12,1533,1534,1536,1537,1540,1541,1543],{},[15,1535,1409],{}," normalizes but does not validate, and it fills a missing ",[15,1538,1539],{},"well_depth"," with the depth calculated from the construction. It throws on invalid JSON and on an unknown version. Use it when importing old archives, then validate the result as above; use ",[15,1542,40],{}," everywhere else.",[35,1545,1547],{"id":1546},"related","Related",[1506,1549,1550,1555],{},[128,1551,1552,1554],{},[24,1553,27],{"href":26},", for validation in other languages",[128,1556,1557],{},[24,1558,1560,1562],{"href":1559},"\u002Fcore\u002Fapi\u002Ffunctions\u002FparseWell",[15,1561,40],{}," in the API reference",[1564,1565,1566],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":52,"searchDepth":92,"depth":92,"links":1568},[1569,1571,1572,1574,1575,1577],{"id":37,"depth":92,"text":1570},"parseWell: text in, Well out",{"id":228,"depth":92,"text":229},{"id":966,"depth":92,"text":1573},"WellSchema and the object schemas",{"id":1361,"depth":92,"text":1362},{"id":1405,"depth":92,"text":1576},"Legacy files: deserializeWell",{"id":1546,"depth":92,"text":1547},"Validate .well text with parseWell, validate objects with WellSchema and the per-object schemas, turn Zod issues into readable messages, and read legacy files.","md",{},"\u002Fcore\u002Fguides\u002Fparsing-and-validating","---\ntitle: Parsing and validating\ndescription: Validate .well text with parseWell, validate objects with WellSchema and the per-object schemas, turn Zod issues into readable messages, and read legacy files.\n---\n\n`@welldot\u002Fcore` defines what a valid `.well` file is. The same validators back the [JSON Schema](\u002Fformat\u002Freference\u002Fjson-schema), the welldot.org editor and this site's [MCP validator](\u002Fai\u002Fmcp), so every tool agrees.\n\n## `parseWell`: text in, `Well` out\n\n```ts\nimport { parseWell } from '@welldot\u002Fcore';\n\nconst well = parseWell(text);\n```\n\n`parseWell(json: string): Well` does four things, in order:\n\n1. Parses the JSON text.\n2. Reads `version` and decides how to read the file, following [parser version handling](\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#parser-version-handling): `1` is upgraded to v2, `2` and any `\"2.x\"` are read as v2, a missing version is read as v2, anything else throws an `Error` naming the value (`Unsupported .well format version: \"3.0\"`).\n3. Validates the document against `WellSchema` and throws a `ZodError` on failure.\n4. Returns the validated data with every unknown member kept, at every level, including inside array items ([extensibility](\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#extensibility)).\n\nThe v1 upgrade applies the normalizations from [changes from v1](\u002Fformat\u002Fspec\u002Fv2\u002Foverview#changes-from-v1): flat `lat`, `lng` and `elevation` become `location`, `fgdc_texture` becomes `texture`, `screen_slot_mm` becomes `screen_slot`, and the `bole_hole` typo becomes `bore_hole`.\n\n## Readable error messages\n\nA `ZodError` carries an `issues` array. Each issue has a `path` (field names and array indexes) and a `message`. This helper turns them into the `field[0].name: message` form used across the docs:\n\n```ts [validate.ts]\nimport { parseWell, type Well } from '@welldot\u002Fcore';\n\ntype Issue = { path: (string | number)[]; message: string };\n\nexport type Result =\n  | { valid: true; well: Well }\n  | { valid: false; errors: string[] };\n\nfunction formatPath(path: (string | number)[]): string {\n  return path.reduce\u003Cstring>(\n    (out, seg) =>\n      typeof seg === 'number' ? `${out}[${seg}]` : out ? `${out}.${seg}` : seg,\n    '',\n  );\n}\n\nexport function validate(text: string): Result {\n  try {\n    return { valid: true, well: parseWell(text) };\n  } catch (error) {\n    if (error instanceof Error && error.name === 'ZodError') {\n      const { issues } = error as Error & { issues: Issue[] };\n      return {\n        valid: false,\n        errors: issues.map(i => `${formatPath(i.path)}: ${i.message}`),\n      };\n    }\n    \u002F\u002F Invalid JSON or an unsupported version\n    return { valid: false, errors: [(error as Error).message] };\n  }\n}\n```\n\n```ts\nvalidate(\n  '{\"version\":\"2.4\",\"bore_hole\":[{\"from\":0,\"to\":\"60 m\",\"diameter\":254}]}',\n);\n\u002F\u002F { valid: false, errors: [\n\u002F\u002F   'bore_hole[0].to: Expected number, received string',\n\u002F\u002F   'well_case: Required', …\n\u002F\u002F ] }\n```\n\n[Validating](\u002Fformat\u002Fguides\u002Fvalidating) explains the common messages.\n\n## `WellSchema` and the object schemas\n\n`WellSchema` is the Zod schema of a whole document. Use it to check an object you already have, for example one assembled by a form:\n\n```ts\nimport { WellSchema } from '@welldot\u002Fcore';\n\nconst result = WellSchema.safeParse(candidate);\nif (!result.success) console.log(result.error.issues);\n```\n\n`WellSchema` checks a v2 object as it is: it does not upgrade v1 data and does not look at `version` beyond its shape. For files, use `parseWell`.\n\nEvery object has its own schema too, which is handy for validating one record before adding it:\n\n```ts\nimport { LithologySchema, WellScreenSchema } from '@welldot\u002Fcore';\n\nLithologySchema.parse({\n  from: 8,\n  to: 30,\n  description: 'Silty sandstone',\n  color: '#c9a27a',\n  texture: { code: 612, vocabulary: 'fgdc' },\n  geologic_unit: 'Botucatu Formation',\n  aquifer_unit: 'Guarani',\n});\n\nWellScreenSchema.safeParse({ from: 36, to: 54, type: 'pvc', diameter: 168.3 });\n\u002F\u002F fails: screen_slot is required\n```\n\nThey are ordinary Zod schemas, so `.extend`, `.pick` and `.refine` work as usual. The list is in the [API reference](\u002Fcore\u002Fapi) under Variables (`BoreHoleSchema`, `WellCaseSchema`, `HydrodynamicEventSchema`, `PermitSchema`, `WaterSampleSchema`, …).\n\n## What the validators check, and what they do not\n\nThey check the schema: required fields, types, closed vocabularies, formats such as `YYYY-MM-DD` dates and RFC 3339 instants with an offset, and the cross-field rules the spec makes errors (for example, a water quality result has exactly one of `value`, `presence` or `text`).\n\nThey do not add rules the spec does not have, and they do not check geometry (`from` below `to`, casings inside the hole) or references between records. Those are warnings in the spec, computed by [`@welldot\u002Futils`](\u002Futils), for example `getPermitWarnings` and `getWaterSampleWarnings`.\n\n## Legacy files: `deserializeWell`\n\nFiles written by early versions of Well Profiler, before the format had a version field, used other shapes. `deserializeWell` reads them:\n\n```ts\nimport { deserializeWell, parseWell, serializeWell } from '@welldot\u002Fcore';\n\nconst restored = deserializeWell(oldText); \u002F\u002F Well, or null for an unversioned file with no profile\nconst well = restored && parseWell(serializeWell(restored)); \u002F\u002F then validate\n```\n\nIt accepts v2 and v1 files and also:\n\n- the old `constructive` \u002F `geologic` sub-objects;\n- diameters in inches (`diam_pol`), converted to millimeters;\n- the `bole_hole` typo.\n\n`deserializeWell` normalizes but does not validate, and it fills a missing `well_depth` with the depth calculated from the construction. It throws on invalid JSON and on an unknown version. Use it when importing old archives, then validate the result as above; use `parseWell` everywhere else.\n\n## Related\n\n- [JSON Schema](\u002Fformat\u002Freference\u002Fjson-schema), for validation in other languages\n- [`parseWell` in the API reference](\u002Fcore\u002Fapi\u002Ffunctions\u002FparseWell)\n",{"title":7,"description":1578},"core\u002F2.guides\u002F1.parsing-and-validating","gK-BBnSf5C6gWo0V1LiQnFbrHwnRw0aXI5K9kC0VM6I",{"docs_en":1587,"spec":1894,"changelogs":1944},[1588,1607,1626,1677,1783,1837],{"title":1589,"path":1590,"stem":1591,"children":1592},"Ai","\u002Fai","ai",[1593,1596,1600,1604],{"title":1594,"path":1590,"stem":1595},"Introduction","ai\u002Findex",{"title":1597,"path":1598,"stem":1599},"Converting reports with an assistant","\u002Fai\u002Fconversion-skill","ai\u002Fconversion-skill",{"title":1601,"path":1602,"stem":1603},"llms.txt and Markdown pages","\u002Fai\u002Fllms","ai\u002Fllms",{"title":1605,"path":31,"stem":1606},"MCP server","ai\u002Fmcp",{"title":1608,"path":1609,"stem":1610,"children":1611},"Contributing","\u002Fcontributing","contributing",[1612,1614,1618,1622],{"title":1594,"path":1609,"stem":1613},"contributing\u002Findex",{"title":1615,"path":1616,"stem":1617},"Writing docs","\u002Fcontributing\u002Fwriting-docs","contributing\u002F1.writing-docs",{"title":1619,"path":1620,"stem":1621},"Update rules","\u002Fcontributing\u002Fupdate-rules","contributing\u002F2.update-rules",{"title":1623,"path":1624,"stem":1625},"Content components","\u002Fcontributing\u002Fcomponents","contributing\u002Fcomponents",{"title":1627,"path":1628,"stem":1629,"children":1630},"Core","\u002Fcore","core",[1631,1633,1647,1673],{"title":1594,"path":1628,"stem":1632},"core\u002Findex",{"title":1634,"path":1635,"stem":1636,"children":1637,"page":1646},"Getting Started","\u002Fcore\u002Fgetting-started","core\u002F1.getting-started",[1638,1642],{"title":1639,"path":1640,"stem":1641},"Installation","\u002Fcore\u002Fgetting-started\u002Finstallation","core\u002F1.getting-started\u002F1.installation",{"title":1643,"path":1644,"stem":1645},"First use","\u002Fcore\u002Fgetting-started\u002Ffirst-use","core\u002F1.getting-started\u002F2.first-use",false,{"title":1648,"path":1649,"stem":1650,"children":1651,"page":1646},"Guides","\u002Fcore\u002Fguides","core\u002F2.guides",[1652,1653,1657,1661,1665,1669],{"title":7,"path":1581,"stem":1584},{"title":1654,"path":1655,"stem":1656},"Serializing and sharing","\u002Fcore\u002Fguides\u002Fserializing-and-sharing","core\u002F2.guides\u002F2.serializing-and-sharing",{"title":1658,"path":1659,"stem":1660},"Unit conversion","\u002Fcore\u002Fguides\u002Funit-conversion","core\u002F2.guides\u002F3.unit-conversion",{"title":1662,"path":1663,"stem":1664},"Vocabularies and textures","\u002Fcore\u002Fguides\u002Fvocabularies-and-textures","core\u002F2.guides\u002F4.vocabularies-and-textures",{"title":1666,"path":1667,"stem":1668},"Water quality vocabulary","\u002Fcore\u002Fguides\u002Fwater-quality-vocabulary","core\u002F2.guides\u002F5.water-quality-vocabulary",{"title":1670,"path":1671,"stem":1672},"Versions and time zones","\u002Fcore\u002Fguides\u002Fversions-and-time-zones","core\u002F2.guides\u002F6.versions-and-time-zones",{"title":1341,"path":1340,"stem":1674,"children":1675},"core\u002Fapi\u002Findex",[1676],{"title":1341,"path":1340,"stem":1674},{"title":1678,"path":1679,"stem":1680,"children":1681},"Format","\u002Fformat","format",[1682,1684,1704,1733,1755,1773,1779],{"title":1594,"path":1679,"stem":1683},"format\u002Findex",{"title":1634,"path":1685,"stem":1686,"children":1687,"page":1646},"\u002Fformat\u002Fgetting-started","format\u002F1.getting-started",[1688,1692,1696,1700],{"title":1689,"path":1690,"stem":1691},"What is .well?","\u002Fformat\u002Fgetting-started\u002Fwhat-is-well","format\u002F1.getting-started\u002F1.what-is-well",{"title":1693,"path":1694,"stem":1695},"For geologists","\u002Fformat\u002Fgetting-started\u002Ffor-geologists","format\u002F1.getting-started\u002F2.for-geologists",{"title":1697,"path":1698,"stem":1699},"For developers","\u002Fformat\u002Fgetting-started\u002Ffor-developers","format\u002F1.getting-started\u002F3.for-developers",{"title":1701,"path":1702,"stem":1703},"Your first .well file","\u002Fformat\u002Fgetting-started\u002Ffirst-well-file","format\u002F1.getting-started\u002F4.first-well-file",{"title":1705,"path":1706,"stem":1707,"children":1708,"page":1646},"Concepts","\u002Fformat\u002Fconcepts","format\u002F2.concepts",[1709,1713,1717,1721,1725,1729],{"title":1710,"path":1711,"stem":1712},"Depths and intervals","\u002Fformat\u002Fconcepts\u002Fdepths-and-intervals","format\u002F2.concepts\u002F1.depths-and-intervals",{"title":1714,"path":1715,"stem":1716},"Units and precision","\u002Fformat\u002Fconcepts\u002Funits-and-precision","format\u002F2.concepts\u002F2.units-and-precision",{"title":1718,"path":1719,"stem":1720},"Vocabularies","\u002Fformat\u002Fconcepts\u002Fvocabularies","format\u002F2.concepts\u002F3.vocabularies",{"title":1722,"path":1723,"stem":1724},"Profiles","\u002Fformat\u002Fconcepts\u002Fprofiles","format\u002F2.concepts\u002F4.profiles",{"title":1726,"path":1727,"stem":1728},"Versions and deprecation","\u002Fformat\u002Fconcepts\u002Fversions-and-deprecation","format\u002F2.concepts\u002F5.versions-and-deprecation",{"title":1730,"path":1731,"stem":1732},"Extensibility","\u002Fformat\u002Fconcepts\u002Fextensibility","format\u002F2.concepts\u002F6.extensibility",{"title":1648,"path":1734,"stem":1735,"children":1736,"page":1646},"\u002Fformat\u002Fguides","format\u002F3.guides",[1737,1741,1745,1747,1751],{"title":1738,"path":1739,"stem":1740},"Writing a .well by hand","\u002Fformat\u002Fguides\u002Fwriting-by-hand","format\u002F3.guides\u002F1.writing-by-hand",{"title":1742,"path":1743,"stem":1744},"Converting a report","\u002Fformat\u002Fguides\u002Fconverting-a-report","format\u002F3.guides\u002F2.converting-a-report",{"title":962,"path":961,"stem":1746},"format\u002F3.guides\u002F3.validating",{"title":1748,"path":1749,"stem":1750},"Extending for your own needs","\u002Fformat\u002Fguides\u002Fextending","format\u002F3.guides\u002F4.extending",{"title":1752,"path":1753,"stem":1754},"Building an editor or database on .well","\u002Fformat\u002Fguides\u002Fbuilding-on-well","format\u002F3.guides\u002F5.building-on-well",{"title":1756,"path":1757,"stem":1758,"children":1759},"Overview","\u002Fformat\u002Freference","format\u002F4.reference\u002Findex",[1760,1761,1763,1767],{"title":1756,"path":1757,"stem":1758},{"title":27,"path":26,"stem":1762},"format\u002F4.reference\u002F1.json-schema",{"title":1764,"path":1765,"stem":1766},"Example wells","\u002Fformat\u002Freference\u002Fexamples","format\u002F4.reference\u002F2.examples",{"title":1768,"path":1769,"stem":1770,"children":1771},"Object reference","\u002Fformat\u002Freference\u002Fobjects","format\u002Freference\u002Fobjects\u002Findex",[1772],{"title":1768,"path":1769,"stem":1770},{"title":1774,"path":1775,"stem":1776,"children":1777},"About the spec","\u002Fformat\u002Fspec","format\u002F5.spec\u002Findex",[1778],{"title":1774,"path":1775,"stem":1776},{"title":1780,"path":1781,"stem":1782},"Changelog","\u002Fformat\u002Fchangelog","format\u002F6.changelog",{"title":1784,"path":1785,"stem":1786,"children":1787},"Render","\u002Frender","render",[1788,1790,1800,1832],{"title":1594,"path":1785,"stem":1789},"render\u002Findex",{"title":1634,"path":1791,"stem":1792,"children":1793,"page":1646},"\u002Frender\u002Fgetting-started","render\u002F1.getting-started",[1794,1797],{"title":1639,"path":1795,"stem":1796},"\u002Frender\u002Fgetting-started\u002Finstallation","render\u002F1.getting-started\u002F1.installation",{"title":1643,"path":1798,"stem":1799},"\u002Frender\u002Fgetting-started\u002Ffirst-use","render\u002F1.getting-started\u002F2.first-use",{"title":1648,"path":1801,"stem":1802,"children":1803,"page":1646},"\u002Frender\u002Fguides","render\u002F2.guides",[1804,1808,1812,1816,1820,1824,1828],{"title":1805,"path":1806,"stem":1807},"Panels and layout","\u002Frender\u002Fguides\u002Fpanels-and-layout","render\u002F2.guides\u002F1.panels-and-layout",{"title":1809,"path":1810,"stem":1811},"Layers and labels","\u002Frender\u002Fguides\u002Flayers-and-labels","render\u002F2.guides\u002F2.layers-and-labels",{"title":1813,"path":1814,"stem":1815},"Theming","\u002Frender\u002Fguides\u002Ftheming","render\u002F2.guides\u002F3.theming",{"title":1817,"path":1818,"stem":1819},"Locale and units","\u002Frender\u002Fguides\u002Flocale-and-units","render\u002F2.guides\u002F4.locale-and-units",{"title":1821,"path":1822,"stem":1823},"Legends","\u002Frender\u002Fguides\u002Flegends","render\u002F2.guides\u002F5.legends",{"title":1825,"path":1826,"stem":1827},"Zoom, pan and highlights","\u002Frender\u002Fguides\u002Finteraction","render\u002F2.guides\u002F6.interaction",{"title":1829,"path":1830,"stem":1831},"Using it in a framework","\u002Frender\u002Fguides\u002Fframeworks","render\u002F2.guides\u002F7.frameworks",{"title":1341,"path":1833,"stem":1834,"children":1835},"\u002Frender\u002Fapi","render\u002Fapi\u002Findex",[1836],{"title":1341,"path":1833,"stem":1834},{"title":1838,"path":1392,"stem":1839,"children":1840},"Utils","utils",[1841,1843,1853,1889],{"title":1594,"path":1392,"stem":1842},"utils\u002Findex",{"title":1634,"path":1844,"stem":1845,"children":1846,"page":1646},"\u002Futils\u002Fgetting-started","utils\u002F1.getting-started",[1847,1850],{"title":1639,"path":1848,"stem":1849},"\u002Futils\u002Fgetting-started\u002Finstallation","utils\u002F1.getting-started\u002F1.installation",{"title":1643,"path":1851,"stem":1852},"\u002Futils\u002Fgetting-started\u002Ffirst-use","utils\u002F1.getting-started\u002F2.first-use",{"title":1648,"path":1854,"stem":1855,"children":1856,"page":1646},"\u002Futils\u002Fguides","utils\u002F2.guides",[1857,1861,1865,1869,1873,1877,1881,1885],{"title":1858,"path":1859,"stem":1860},"Geometry and volumes","\u002Futils\u002Fguides\u002Fgeometry-and-volumes","utils\u002F2.guides\u002F1.geometry-and-volumes",{"title":1862,"path":1863,"stem":1864},"Water levels and pumping tests","\u002Futils\u002Fguides\u002Fpumping-tests","utils\u002F2.guides\u002F2.pumping-tests",{"title":1866,"path":1867,"stem":1868},"Permits","\u002Futils\u002Fguides\u002Fpermits","utils\u002F2.guides\u002F3.permits",{"title":1870,"path":1871,"stem":1872},"Operation and production","\u002Futils\u002Fguides\u002Foperation","utils\u002F2.guides\u002F4.operation",{"title":1874,"path":1875,"stem":1876},"Water quality","\u002Futils\u002Fguides\u002Fwater-quality","utils\u002F2.guides\u002F5.water-quality",{"title":1878,"path":1879,"stem":1880},"Logger import","\u002Futils\u002Fguides\u002Flogger-import","utils\u002F2.guides\u002F6.logger-import",{"title":1882,"path":1883,"stem":1884},"SIAGAS import","\u002Futils\u002Fguides\u002Fsiagas-import","utils\u002F2.guides\u002F7.siagas-import",{"title":1886,"path":1887,"stem":1888},"Formatting","\u002Futils\u002Fguides\u002Fformatting","utils\u002F2.guides\u002F8.formatting",{"title":1341,"path":1890,"stem":1891,"children":1892},"\u002Futils\u002Fapi","utils\u002Fapi\u002Findex",[1893],{"title":1341,"path":1890,"stem":1891},[1895],{"title":1678,"path":1679,"stem":1680,"children":1896,"page":1646},[1897],{"title":1898,"path":1775,"stem":1899,"children":1900,"page":1646},"Spec","format\u002Fspec",[1901,1910,1919],{"title":1902,"path":1903,"stem":1904,"children":1905,"page":1646},"Reference","\u002Fformat\u002Fspec\u002Freference","format\u002Fspec\u002Freference",[1906],{"title":1907,"path":1908,"stem":1909},"FGDC Texture Patterns Reference","\u002Fformat\u002Fspec\u002Freference\u002Ffgdc-textures","format\u002Fspec\u002Freference\u002Ffgdc-textures",{"title":1911,"path":1912,"stem":1913,"children":1914,"page":1646},"V1","\u002Fformat\u002Fspec\u002Fv1","format\u002Fspec\u002Fv1",[1915],{"title":1916,"path":1917,"stem":1918},".well File Format Specification","\u002Fformat\u002Fspec\u002Fv1\u002Fwell-format","format\u002Fspec\u002Fv1\u002Fwell-format",{"title":1920,"path":1921,"stem":1922,"children":1923,"page":1646},"V2","\u002Fformat\u002Fspec\u002Fv2","format\u002Fspec\u002Fv2",[1924,1928,1932,1936,1940],{"title":1925,"path":1926,"stem":1927},".well File Format Specification — Version 2.4: Format Reference","\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference","format\u002Fspec\u002Fv2\u002Fformat-reference",{"title":1929,"path":1930,"stem":1931},".well File Format Specification — Version 2.4: Interoperability","\u002Fformat\u002Fspec\u002Fv2\u002Finteroperability","format\u002Fspec\u002Fv2\u002Finteroperability",{"title":1933,"path":1934,"stem":1935},".well File Format Specification — Version 2.4: Object Schemas","\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas","format\u002Fspec\u002Fv2\u002Fobject-schemas",{"title":1937,"path":1938,"stem":1939},".well File Format Specification — Version 2.4: Overview","\u002Fformat\u002Fspec\u002Fv2\u002Foverview","format\u002Fspec\u002Fv2\u002Foverview",{"title":1941,"path":1942,"stem":1943},".well File Format Specification — Version 2.4: Water Quality","\u002Fformat\u002Fspec\u002Fv2\u002Fwater-quality","format\u002Fspec\u002Fv2\u002Fwater-quality",[1945,1950,1956],{"title":1627,"path":1628,"stem":1629,"children":1946,"page":1646},[1947],{"title":17,"path":1948,"stem":1949},"\u002Fcore\u002Fchangelog","core\u002FCHANGELOG",{"title":1784,"path":1785,"stem":1786,"children":1951,"page":1646},[1952],{"title":1953,"path":1954,"stem":1955},"@welldot\u002Frender","\u002Frender\u002Fchangelog","render\u002FCHANGELOG",{"title":1838,"path":1392,"stem":1839,"children":1957,"page":1646},[1958],{"title":1395,"path":1959,"stem":1960},"\u002Futils\u002Fchangelog","utils\u002FCHANGELOG",1793050497037]