[{"data":1,"prerenderedAt":1181},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fvalidation":103,"\u002Fguides\u002Fvalidation-surround":1176},[4,9,31,87,98],{"title":5,"path":6,"stem":7,"icon":8},"Getting started","\u002Fgetting-started","01.getting-started","i-tabler-rocket",{"title":10,"icon":11,"path":12,"stem":13,"children":14,"page":30},"Concepts","i-tabler-code","\u002Fconcepts","02.concepts",[15,20,25],{"title":16,"path":17,"stem":18,"icon":19},"Architecture","\u002Fconcepts\u002Farchitecture","02.concepts\u002Farchitecture","i-tabler-sitemap",{"title":21,"path":22,"stem":23,"icon":24},"Metadata and registry","\u002Fconcepts\u002Fmetadata-and-registry","02.concepts\u002Fmetadata-and-registry","i-tabler-schema",{"title":26,"path":27,"stem":28,"icon":29},"Query Engine","\u002Fconcepts\u002Fquery-engine","02.concepts\u002Fquery-engine","i-tabler-engine",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"Guide","i-tabler-arrow-ramp-right","\u002Fguides","03.guides",[37,42,47,52,57,62,67,72,77,82],{"title":38,"path":39,"stem":40,"icon":41},"Audit Log","\u002Fguides\u002Faudit-log","03.guides\u002Faudit-log","i-tabler-history",{"title":43,"path":44,"stem":45,"icon":46},"Cursor pagination","\u002Fguides\u002Fcursor-pagination","03.guides\u002Fcursor-pagination","i-tabler-arrow-bar-to-down",{"title":48,"path":49,"stem":50,"icon":51},"Domain Events","\u002Fguides\u002Fdomain-events","03.guides\u002Fdomain-events","i-tabler-broadcast",{"title":53,"path":54,"stem":55,"icon":56},"Field visibility","\u002Fguides\u002Ffield-visibility","03.guides\u002Ffield-visibility","i-tabler-eye-off",{"title":58,"path":59,"stem":60,"icon":61},"Lifecycle hooks","\u002Fguides\u002Flifecycle-hooks","03.guides\u002Flifecycle-hooks","i-tabler-arrows-split",{"title":63,"path":64,"stem":65,"icon":66},"Production playground","\u002Fguides\u002Fplayground","03.guides\u002Fplayground","i-tabler-flask",{"title":68,"path":69,"stem":70,"icon":71},"Queries and filters","\u002Fguides\u002Fqueries-and-filters","03.guides\u002Fqueries-and-filters","i-tabler-filter",{"title":73,"path":74,"stem":75,"icon":76},"Relations","\u002Fguides\u002Frelations","03.guides\u002Frelations","i-tabler-link",{"title":78,"path":79,"stem":80,"icon":81},"Schema consistency","\u002Fguides\u002Fschema-consistency","03.guides\u002Fschema-consistency","i-tabler-database-search",{"title":83,"path":84,"stem":85,"icon":86},"Validation","\u002Fguides\u002Fvalidation","03.guides\u002Fvalidation","i-tabler-checkup-list",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":30},"Adapters","i-tabler-plug","\u002Fadapters","04.adapters",[93],{"title":94,"path":95,"stem":96,"icon":97},"Drizzle adapter","\u002Fadapters\u002Fdrizzle","04.adapters\u002Fdrizzle","i-simple-icons-drizzle",{"title":99,"path":100,"stem":101,"icon":102},"Current limitations","\u002Fcurrent-limitations","05.current-limitations","i-tabler-circle-dashed-x",{"id":104,"title":83,"body":105,"description":1169,"extension":1170,"links":1171,"meta":1172,"navigation":1173,"path":84,"seo":1174,"stem":85,"__hash__":1175},"docs\u002F03.guides\u002Fvalidation.md",{"type":106,"value":107,"toc":1161},"minimark",[108,112,117,125,237,241,532,535,672,675,679,682,907,914,918,947,951,954,957,961,1100,1103,1141,1144,1151,1157],[109,110,111],"p",{},"Create and update operations run structural, field, and table validation inside the mutation transaction.",[113,114,116],"h2",{"id":115},"structural-validation","Structural validation",[109,118,119,120,124],{},"Structural rules come from ",[121,122,123],"code",{},"ColumnMetadata",".",[126,127,128,141],"table",{},[129,130,131],"thead",{},[132,133,134,138],"tr",{},[135,136,137],"th",{},"Metadata type",[135,139,140],{},"Valid value",[142,143,144,160,170,179,189,198,208,227],"tbody",{},[132,145,146,150],{},[147,148,149],"td",{},"non-nullable column",[147,151,152,153,156,157],{},"neither ",[121,154,155],{},"null"," nor ",[121,158,159],{},"undefined",[132,161,162,167],{},[147,163,164],{},[121,165,166],{},"integer",[147,168,169],{},"integer number",[132,171,172,177],{},[147,173,174],{},[121,175,176],{},"bigint",[147,178,176],{},[132,180,181,186],{},[147,182,183],{},[121,184,185],{},"decimal",[147,187,188],{},"string or number",[132,190,191,196],{},[147,192,193],{},[121,194,195],{},"boolean",[147,197,195],{},[132,199,200,205],{},[147,201,202],{},[121,203,204],{},"timestamp",[147,206,207],{},"Date",[132,209,210,225],{},[147,211,212,215,216,215,219,215,222],{},[121,213,214],{},"uuid",", ",[121,217,218],{},"string",[121,220,221],{},"text",[121,223,224],{},"date",[147,226,218],{},[132,228,229,234],{},[147,230,231],{},[121,232,233],{},"json",[147,235,236],{},"any value",[113,238,240],{"id":239},"field-validators","Field validators",[242,243,248],"pre",{"className":244,"code":245,"language":246,"meta":247,"style":247},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  name: 'email',\n  columnName: 'email',\n  type: 'string',\n  nullable: false,\n  primaryKey: false,\n  unique: true,\n  validators: [\n    {\n      name: 'email-format',\n      validate(value, entity) {\n        return typeof value === 'string' && value.includes('@')\n          ? { valid: true }\n          : { valid: false, message: 'Enter a valid email.' }\n      }\n    }\n  ]\n}\n","ts","",[121,249,250,259,282,298,314,328,340,353,365,371,388,413,459,478,508,514,520,526],{"__ignoreMap":247},[251,252,255],"span",{"class":253,"line":254},"line",1,[251,256,258],{"class":257},"sMK4o","{\n",[251,260,262,266,269,272,276,279],{"class":253,"line":261},2,[251,263,265],{"class":264},"sBMFI","  name",[251,267,268],{"class":257},":",[251,270,271],{"class":257}," '",[251,273,275],{"class":274},"sfazB","email",[251,277,278],{"class":257},"'",[251,280,281],{"class":257},",\n",[251,283,285,288,290,292,294,296],{"class":253,"line":284},3,[251,286,287],{"class":264},"  columnName",[251,289,268],{"class":257},[251,291,271],{"class":257},[251,293,275],{"class":274},[251,295,278],{"class":257},[251,297,281],{"class":257},[251,299,301,304,306,308,310,312],{"class":253,"line":300},4,[251,302,303],{"class":264},"  type",[251,305,268],{"class":257},[251,307,271],{"class":257},[251,309,218],{"class":274},[251,311,278],{"class":257},[251,313,281],{"class":257},[251,315,317,320,322,326],{"class":253,"line":316},5,[251,318,319],{"class":264},"  nullable",[251,321,268],{"class":257},[251,323,325],{"class":324},"sfNiH"," false",[251,327,281],{"class":257},[251,329,331,334,336,338],{"class":253,"line":330},6,[251,332,333],{"class":264},"  primaryKey",[251,335,268],{"class":257},[251,337,325],{"class":324},[251,339,281],{"class":257},[251,341,343,346,348,351],{"class":253,"line":342},7,[251,344,345],{"class":264},"  unique",[251,347,268],{"class":257},[251,349,350],{"class":324}," true",[251,352,281],{"class":257},[251,354,356,359,361],{"class":253,"line":355},8,[251,357,358],{"class":264},"  validators",[251,360,268],{"class":257},[251,362,364],{"class":363},"swJcz"," [\n",[251,366,368],{"class":253,"line":367},9,[251,369,370],{"class":257},"    {\n",[251,372,374,377,379,381,384,386],{"class":253,"line":373},10,[251,375,376],{"class":363},"      name",[251,378,268],{"class":257},[251,380,271],{"class":257},[251,382,383],{"class":274},"email-format",[251,385,278],{"class":257},[251,387,281],{"class":257},[251,389,391,394,397,401,404,407,410],{"class":253,"line":390},11,[251,392,393],{"class":363},"      validate",[251,395,396],{"class":257},"(",[251,398,400],{"class":399},"sHdIc","value",[251,402,403],{"class":257},",",[251,405,406],{"class":399}," entity",[251,408,409],{"class":257},")",[251,411,412],{"class":257}," {\n",[251,414,416,420,423,427,430,432,434,436,439,441,443,447,449,451,454,456],{"class":253,"line":415},12,[251,417,419],{"class":418},"s7zQu","        return",[251,421,422],{"class":257}," typeof",[251,424,426],{"class":425},"sTEyZ"," value",[251,428,429],{"class":257}," ===",[251,431,271],{"class":257},[251,433,218],{"class":274},[251,435,278],{"class":257},[251,437,438],{"class":257}," &&",[251,440,426],{"class":425},[251,442,124],{"class":257},[251,444,446],{"class":445},"s2Zo4","includes",[251,448,396],{"class":363},[251,450,278],{"class":257},[251,452,453],{"class":274},"@",[251,455,278],{"class":257},[251,457,458],{"class":363},")\n",[251,460,462,465,468,471,473,475],{"class":253,"line":461},13,[251,463,464],{"class":257},"          ?",[251,466,467],{"class":257}," {",[251,469,470],{"class":363}," valid",[251,472,268],{"class":257},[251,474,350],{"class":324},[251,476,477],{"class":257}," }\n",[251,479,481,484,486,488,490,492,494,497,499,501,504,506],{"class":253,"line":480},14,[251,482,483],{"class":257},"          :",[251,485,467],{"class":257},[251,487,470],{"class":363},[251,489,268],{"class":257},[251,491,325],{"class":324},[251,493,403],{"class":257},[251,495,496],{"class":363}," message",[251,498,268],{"class":257},[251,500,271],{"class":257},[251,502,503],{"class":274},"Enter a valid email.",[251,505,278],{"class":257},[251,507,477],{"class":257},[251,509,511],{"class":253,"line":510},15,[251,512,513],{"class":257},"      }\n",[251,515,517],{"class":253,"line":516},16,[251,518,519],{"class":257},"    }\n",[251,521,523],{"class":253,"line":522},17,[251,524,525],{"class":363},"  ]\n",[251,527,529],{"class":253,"line":528},18,[251,530,531],{"class":257},"}\n",[109,533,534],{},"The validator receives the field value and the complete read-only entity. It may return immediately or return a promise.",[242,536,538],{"className":244,"code":537,"language":246,"meta":247,"style":247},"{\n  name: 'email-availability',\n  async validate(value) {\n    const available = await isEmailAvailable(String(value))\n\n    return available\n      ? { valid: true }\n      : { valid: false, message: 'Email already exists.' }\n  }\n}\n",[121,539,540,544,559,576,606,612,620,635,663,668],{"__ignoreMap":247},[251,541,542],{"class":253,"line":254},[251,543,258],{"class":257},[251,545,546,548,550,552,555,557],{"class":253,"line":261},[251,547,265],{"class":264},[251,549,268],{"class":257},[251,551,271],{"class":257},[251,553,554],{"class":274},"email-availability",[251,556,278],{"class":257},[251,558,281],{"class":257},[251,560,561,564,567,569,571,574],{"class":253,"line":284},[251,562,563],{"class":425},"  async",[251,565,566],{"class":445}," validate",[251,568,396],{"class":363},[251,570,400],{"class":425},[251,572,573],{"class":363},") ",[251,575,258],{"class":257},[251,577,578,582,585,588,591,594,596,599,601,603],{"class":253,"line":300},[251,579,581],{"class":580},"spNyl","    const",[251,583,584],{"class":425}," available",[251,586,587],{"class":257}," =",[251,589,590],{"class":418}," await",[251,592,593],{"class":445}," isEmailAvailable",[251,595,396],{"class":363},[251,597,598],{"class":445},"String",[251,600,396],{"class":363},[251,602,400],{"class":425},[251,604,605],{"class":363},"))\n",[251,607,608],{"class":253,"line":316},[251,609,611],{"emptyLinePlaceholder":610},true,"\n",[251,613,614,617],{"class":253,"line":330},[251,615,616],{"class":418},"    return",[251,618,619],{"class":425}," available\n",[251,621,622,625,627,629,631,633],{"class":253,"line":342},[251,623,624],{"class":257},"      ?",[251,626,467],{"class":257},[251,628,470],{"class":363},[251,630,268],{"class":257},[251,632,350],{"class":324},[251,634,477],{"class":257},[251,636,637,640,642,644,646,648,650,652,654,656,659,661],{"class":253,"line":355},[251,638,639],{"class":257},"      :",[251,641,467],{"class":257},[251,643,470],{"class":363},[251,645,268],{"class":257},[251,647,325],{"class":324},[251,649,403],{"class":257},[251,651,496],{"class":363},[251,653,268],{"class":257},[251,655,271],{"class":257},[251,657,658],{"class":274},"Email already exists.",[251,660,278],{"class":257},[251,662,477],{"class":257},[251,664,665],{"class":253,"line":367},[251,666,667],{"class":257},"  }\n",[251,669,670],{"class":253,"line":373},[251,671,531],{"class":257},[109,673,674],{},"Database constraints should still enforce race-sensitive rules such as uniqueness.",[113,676,678],{"id":677},"table-validators","Table validators",[109,680,681],{},"Use table validators when the rule depends on multiple fields.",[242,683,685],{"className":244,"code":684,"language":246,"meta":247,"style":247},"{\n  name: 'valid-period',\n  fields: ['startsAt', 'endsAt'],\n  validate(entity) {\n    const startsAt = entity.startsAt\n    const endsAt = entity.endsAt\n\n    if (\n      startsAt instanceof Date &&\n      endsAt instanceof Date &&\n      endsAt \u003C= startsAt\n    ) {\n      return {\n        valid: false,\n        message: 'End must be after start.'\n      }\n    }\n\n    return { valid: true }\n  }\n}\n",[121,686,687,691,706,737,751,767,783,787,795,809,820,830,837,844,855,870,874,878,882,897,902],{"__ignoreMap":247},[251,688,689],{"class":253,"line":254},[251,690,258],{"class":257},[251,692,693,695,697,699,702,704],{"class":253,"line":261},[251,694,265],{"class":264},[251,696,268],{"class":257},[251,698,271],{"class":257},[251,700,701],{"class":274},"valid-period",[251,703,278],{"class":257},[251,705,281],{"class":257},[251,707,708,711,713,716,718,721,723,725,727,730,732,735],{"class":253,"line":284},[251,709,710],{"class":264},"  fields",[251,712,268],{"class":257},[251,714,715],{"class":363}," [",[251,717,278],{"class":257},[251,719,720],{"class":274},"startsAt",[251,722,278],{"class":257},[251,724,403],{"class":257},[251,726,271],{"class":257},[251,728,729],{"class":274},"endsAt",[251,731,278],{"class":257},[251,733,734],{"class":363},"]",[251,736,281],{"class":257},[251,738,739,742,744,747,749],{"class":253,"line":300},[251,740,741],{"class":445},"  validate",[251,743,396],{"class":363},[251,745,746],{"class":425},"entity",[251,748,573],{"class":363},[251,750,258],{"class":257},[251,752,753,755,758,760,762,764],{"class":253,"line":316},[251,754,581],{"class":580},[251,756,757],{"class":425}," startsAt",[251,759,587],{"class":257},[251,761,406],{"class":425},[251,763,124],{"class":257},[251,765,766],{"class":425},"startsAt\n",[251,768,769,771,774,776,778,780],{"class":253,"line":330},[251,770,581],{"class":580},[251,772,773],{"class":425}," endsAt",[251,775,587],{"class":257},[251,777,406],{"class":425},[251,779,124],{"class":257},[251,781,782],{"class":425},"endsAt\n",[251,784,785],{"class":253,"line":342},[251,786,611],{"emptyLinePlaceholder":610},[251,788,789,792],{"class":253,"line":355},[251,790,791],{"class":418},"    if",[251,793,794],{"class":363}," (\n",[251,796,797,800,803,806],{"class":253,"line":367},[251,798,799],{"class":425},"      startsAt",[251,801,802],{"class":257}," instanceof",[251,804,805],{"class":264}," Date",[251,807,808],{"class":257}," &&\n",[251,810,811,814,816,818],{"class":253,"line":373},[251,812,813],{"class":425},"      endsAt",[251,815,802],{"class":257},[251,817,805],{"class":264},[251,819,808],{"class":257},[251,821,822,824,827],{"class":253,"line":390},[251,823,813],{"class":425},[251,825,826],{"class":257}," \u003C=",[251,828,829],{"class":425}," startsAt\n",[251,831,832,835],{"class":253,"line":415},[251,833,834],{"class":363},"    ) ",[251,836,258],{"class":257},[251,838,839,842],{"class":253,"line":461},[251,840,841],{"class":418},"      return",[251,843,412],{"class":257},[251,845,846,849,851,853],{"class":253,"line":480},[251,847,848],{"class":363},"        valid",[251,850,268],{"class":257},[251,852,325],{"class":324},[251,854,281],{"class":257},[251,856,857,860,862,864,867],{"class":253,"line":510},[251,858,859],{"class":363},"        message",[251,861,268],{"class":257},[251,863,271],{"class":257},[251,865,866],{"class":274},"End must be after start.",[251,868,869],{"class":257},"'\n",[251,871,872],{"class":253,"line":516},[251,873,513],{"class":257},[251,875,876],{"class":253,"line":522},[251,877,519],{"class":257},[251,879,880],{"class":253,"line":528},[251,881,611],{"emptyLinePlaceholder":610},[251,883,885,887,889,891,893,895],{"class":253,"line":884},19,[251,886,616],{"class":418},[251,888,467],{"class":257},[251,890,470],{"class":363},[251,892,268],{"class":257},[251,894,350],{"class":324},[251,896,477],{"class":257},[251,898,900],{"class":253,"line":899},20,[251,901,667],{"class":257},[251,903,905],{"class":253,"line":904},21,[251,906,531],{"class":257},[109,908,909,910,913],{},"During partial updates, the validator runs when at least one field listed in ",[121,911,912],{},"fields"," is touched.",[113,915,917],{"id":916},"create-validation","Create validation",[919,920,922,927,931,935,939,943],"steps",{"level":921},"3",[923,924,926],"h3",{"id":925},"apply-defaults","Apply defaults",[923,928,930],{"id":929},"transform-data-through-before-create-hooks","Transform data through before-create hooks",[923,932,934],{"id":933},"reject-fields-absent-from-metadata","Reject fields absent from metadata",[923,936,938],{"id":937},"validate-every-column","Validate every column",[923,940,942],{"id":941},"run-every-table-validator","Run every table validator",[923,944,946],{"id":945},"insert-only-when-there-are-no-failures","Insert only when there are no failures",[113,948,950],{"id":949},"update-validation","Update validation",[109,952,953],{},"The engine loads current rows, applies before-update hooks, merges the resolved patch with each current entity, then validates only touched columns and relevant table validators.",[109,955,956],{},"This ensures cross-field validators see the post-update entity without rewriting untouched data.",[113,958,960],{"id":959},"validationerror","ValidationError",[242,962,964],{"className":244,"code":963,"language":246,"meta":247,"style":247},"try {\n  await engine.create('users', input)\n} catch (error) {\n  if (error instanceof ValidationError) {\n    console.error(error.message)\n    console.error(error.table)\n    console.error(error.failures)\n  }\n}\n",[121,965,966,973,1002,1015,1035,1055,1073,1092,1096],{"__ignoreMap":247},[251,967,968,971],{"class":253,"line":254},[251,969,970],{"class":418},"try",[251,972,412],{"class":257},[251,974,975,978,981,983,986,988,990,993,995,997,1000],{"class":253,"line":261},[251,976,977],{"class":418},"  await",[251,979,980],{"class":425}," engine",[251,982,124],{"class":257},[251,984,985],{"class":445},"create",[251,987,396],{"class":363},[251,989,278],{"class":257},[251,991,992],{"class":274},"users",[251,994,278],{"class":257},[251,996,403],{"class":257},[251,998,999],{"class":425}," input",[251,1001,458],{"class":363},[251,1003,1004,1007,1010,1013],{"class":253,"line":284},[251,1005,1006],{"class":257},"}",[251,1008,1009],{"class":418}," catch",[251,1011,1012],{"class":425}," (error) ",[251,1014,258],{"class":257},[251,1016,1017,1020,1023,1026,1028,1031,1033],{"class":253,"line":300},[251,1018,1019],{"class":418},"  if",[251,1021,1022],{"class":363}," (",[251,1024,1025],{"class":425},"error",[251,1027,802],{"class":257},[251,1029,1030],{"class":264}," ValidationError",[251,1032,573],{"class":363},[251,1034,258],{"class":257},[251,1036,1037,1040,1042,1044,1046,1048,1050,1053],{"class":253,"line":316},[251,1038,1039],{"class":425},"    console",[251,1041,124],{"class":257},[251,1043,1025],{"class":445},[251,1045,396],{"class":363},[251,1047,1025],{"class":425},[251,1049,124],{"class":257},[251,1051,1052],{"class":425},"message",[251,1054,458],{"class":363},[251,1056,1057,1059,1061,1063,1065,1067,1069,1071],{"class":253,"line":330},[251,1058,1039],{"class":425},[251,1060,124],{"class":257},[251,1062,1025],{"class":445},[251,1064,396],{"class":363},[251,1066,1025],{"class":425},[251,1068,124],{"class":257},[251,1070,126],{"class":425},[251,1072,458],{"class":363},[251,1074,1075,1077,1079,1081,1083,1085,1087,1090],{"class":253,"line":342},[251,1076,1039],{"class":425},[251,1078,124],{"class":257},[251,1080,1025],{"class":445},[251,1082,396],{"class":363},[251,1084,1025],{"class":425},[251,1086,124],{"class":257},[251,1088,1089],{"class":425},"failures",[251,1091,458],{"class":363},[251,1093,1094],{"class":253,"line":355},[251,1095,667],{"class":257},[251,1097,1098],{"class":253,"line":367},[251,1099,531],{"class":257},[109,1101,1102],{},"A failure contains a field and message:",[242,1104,1106],{"className":244,"code":1105,"language":246,"meta":247,"style":247},"interface FieldValidationFailure {\n  field: string\n  message: string\n}\n",[121,1107,1108,1118,1128,1137],{"__ignoreMap":247},[251,1109,1110,1113,1116],{"class":253,"line":254},[251,1111,1112],{"class":580},"interface",[251,1114,1115],{"class":264}," FieldValidationFailure",[251,1117,412],{"class":257},[251,1119,1120,1123,1125],{"class":253,"line":261},[251,1121,1122],{"class":363},"  field",[251,1124,268],{"class":257},[251,1126,1127],{"class":264}," string\n",[251,1129,1130,1133,1135],{"class":253,"line":284},[251,1131,1132],{"class":363},"  message",[251,1134,268],{"class":257},[251,1136,1127],{"class":264},[251,1138,1139],{"class":253,"line":300},[251,1140,531],{"class":257},[109,1142,1143],{},"The error message now includes the aggregated failure summary:",[242,1145,1149],{"className":1146,"code":1148,"language":221,"meta":247},[1147],"language-text","Validation failed for table \"users\": email: Enter a valid email.; name: This field is required.\n",[121,1150,1148],{"__ignoreMap":247},[109,1152,1153,1154,1156],{},"The structured ",[121,1155,1089],{}," array remains available for API error responses and form mapping.",[1158,1159,1160],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":247,"searchDepth":254,"depth":261,"links":1162},[1163,1164,1165,1166,1167,1168],{"id":115,"depth":261,"text":116},{"id":239,"depth":261,"text":240},{"id":677,"depth":261,"text":678},{"id":916,"depth":261,"text":917},{"id":949,"depth":261,"text":950},{"id":959,"depth":261,"text":960},"Validate structure and domain rules before data reaches the adapter.","md",null,{},{"icon":86},{"title":83,"description":1169},"kVZQ579wmDwJGJcHulxNm0XdsG8_ASUGj0vafGcDFw4",[1177,1179],{"title":78,"path":79,"stem":80,"description":1178,"icon":81,"children":-1},"Detect drift between declared metadata and live PostgreSQL tables.",{"title":94,"path":95,"stem":96,"description":1180,"icon":97,"children":-1},"PostgreSQL query execution, runtime table construction, transactions, and schema introspection.",1783784235117]