[{"data":1,"prerenderedAt":1018},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Ffield-transforms":123,"\u002Fguides\u002Ffield-transforms-surround":1013},[4,9,31,107,118],{"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,87,92,97,102],{"title":38,"path":39,"stem":40,"icon":41},"Aggregate queries","\u002Fguides\u002Faggregate-queries","03.guides\u002Faggregate-queries","i-tabler-chart-histogram",{"title":43,"path":44,"stem":45,"icon":46},"Audit Log","\u002Fguides\u002Faudit-log","03.guides\u002Faudit-log","i-tabler-history",{"title":48,"path":49,"stem":50,"icon":51},"Cursor pagination","\u002Fguides\u002Fcursor-pagination","03.guides\u002Fcursor-pagination","i-tabler-arrow-bar-to-down",{"title":53,"path":54,"stem":55,"icon":56},"Domain Events","\u002Fguides\u002Fdomain-events","03.guides\u002Fdomain-events","i-tabler-broadcast",{"title":58,"path":59,"stem":60,"icon":61},"Field transforms","\u002Fguides\u002Ffield-transforms","03.guides\u002Ffield-transforms","i-tabler-transform",{"title":63,"path":64,"stem":65,"icon":66},"Field visibility","\u002Fguides\u002Ffield-visibility","03.guides\u002Ffield-visibility","i-tabler-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Lifecycle hooks","\u002Fguides\u002Flifecycle-hooks","03.guides\u002Flifecycle-hooks","i-tabler-arrows-split",{"title":73,"path":74,"stem":75,"icon":76},"Migrations","\u002Fguides\u002Fmigrations","03.guides\u002Fmigrations","i-tabler-database-export",{"title":78,"path":79,"stem":80,"icon":81},"Optimistic locking","\u002Fguides\u002Foptimistic-locking","03.guides\u002Foptimistic-locking","i-tabler-lock-check",{"title":83,"path":84,"stem":85,"icon":86},"Production playground","\u002Fguides\u002Fplayground","03.guides\u002Fplayground","i-tabler-flask",{"title":88,"path":89,"stem":90,"icon":91},"Queries and filters","\u002Fguides\u002Fqueries-and-filters","03.guides\u002Fqueries-and-filters","i-tabler-filter",{"title":93,"path":94,"stem":95,"icon":96},"Relations","\u002Fguides\u002Frelations","03.guides\u002Frelations","i-tabler-link",{"title":98,"path":99,"stem":100,"icon":101},"Schema consistency","\u002Fguides\u002Fschema-consistency","03.guides\u002Fschema-consistency","i-tabler-database-search",{"title":103,"path":104,"stem":105,"icon":106},"Validation","\u002Fguides\u002Fvalidation","03.guides\u002Fvalidation","i-tabler-checkup-list",{"title":108,"icon":109,"path":110,"stem":111,"children":112,"page":30},"Adapters","i-tabler-plug","\u002Fadapters","04.adapters",[113],{"title":114,"path":115,"stem":116,"icon":117},"PostgreSQL adapter","\u002Fadapters\u002Fpostgresql","04.adapters\u002Fpostgresql","i-simple-icons-postgresql",{"title":119,"path":120,"stem":121,"icon":122},"Current limitations","\u002Fcurrent-limitations","05.current-limitations","i-tabler-circle-dashed-x",{"id":124,"title":58,"body":125,"description":1006,"extension":1007,"links":1008,"meta":1009,"navigation":1010,"path":59,"seo":1011,"stem":60,"__hash__":1012},"docs\u002F03.guides\u002Ffield-transforms.md",{"type":126,"value":127,"toc":1002},"minimark",[128,132,137,145,650,653,813,819,823,826,949,952,987,998],[129,130,131],"p",{},"Field transforms convert values immediately before they are sent to the\ndatabase adapter. They are useful for password hashing, encryption and\ncanonical normalization.",[133,134,136],"h2",{"id":135},"hash-a-password","Hash a password",[129,138,139,140,144],{},"Declare an asynchronous ",[141,142,143],"code",{},"transform"," on the column metadata:",[146,147,152],"pre",{"className":148,"code":149,"language":150,"meta":151,"style":151},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { hash } from 'argon2'\nimport { defineTable } from '@opensya\u002Fpersistence'\n\nexport const usersMetadata = defineTable({\n  name: 'users',\n  collectionName: 'users',\n  columns: [\n    \u002F\u002F Other columns...\n    {\n      name: 'password',\n      columnName: 'password_hash',\n      type: 'string',\n      nullable: false,\n      primaryKey: false,\n      unique: false,\n      hidden: true,\n      validators: [\n        {\n          name: 'password-length',\n          validate(value) {\n            return typeof value === 'string' && value.length >= 12\n              ? { valid: true }\n              : { valid: false, message: 'Use at least 12 characters.' }\n          }\n        }\n      ],\n      transform(value) {\n        return hash(value as string)\n      }\n    }\n  ],\n  relations: [],\n  tableValidators: []\n})\n","ts","",[141,153,154,187,208,215,240,261,277,288,295,301,318,335,352,366,378,390,403,413,419,436,454,493,511,542,548,554,562,576,598,604,610,618,631,642],{"__ignoreMap":151},[155,156,159,163,167,171,174,177,180,184],"span",{"class":157,"line":158},"line",1,[155,160,162],{"class":161},"s7zQu","import",[155,164,166],{"class":165},"sMK4o"," {",[155,168,170],{"class":169},"sTEyZ"," hash",[155,172,173],{"class":165}," }",[155,175,176],{"class":161}," from",[155,178,179],{"class":165}," '",[155,181,183],{"class":182},"sfazB","argon2",[155,185,186],{"class":165},"'\n",[155,188,190,192,194,197,199,201,203,206],{"class":157,"line":189},2,[155,191,162],{"class":161},[155,193,166],{"class":165},[155,195,196],{"class":169}," defineTable",[155,198,173],{"class":165},[155,200,176],{"class":161},[155,202,179],{"class":165},[155,204,205],{"class":182},"@opensya\u002Fpersistence",[155,207,186],{"class":165},[155,209,211],{"class":157,"line":210},3,[155,212,214],{"emptyLinePlaceholder":213},true,"\n",[155,216,218,221,225,228,231,234,237],{"class":157,"line":217},4,[155,219,220],{"class":161},"export",[155,222,224],{"class":223},"spNyl"," const",[155,226,227],{"class":169}," usersMetadata ",[155,229,230],{"class":165},"=",[155,232,196],{"class":233},"s2Zo4",[155,235,236],{"class":169},"(",[155,238,239],{"class":165},"{\n",[155,241,243,247,250,252,255,258],{"class":157,"line":242},5,[155,244,246],{"class":245},"swJcz","  name",[155,248,249],{"class":165},":",[155,251,179],{"class":165},[155,253,254],{"class":182},"users",[155,256,257],{"class":165},"'",[155,259,260],{"class":165},",\n",[155,262,264,267,269,271,273,275],{"class":157,"line":263},6,[155,265,266],{"class":245},"  collectionName",[155,268,249],{"class":165},[155,270,179],{"class":165},[155,272,254],{"class":182},[155,274,257],{"class":165},[155,276,260],{"class":165},[155,278,280,283,285],{"class":157,"line":279},7,[155,281,282],{"class":245},"  columns",[155,284,249],{"class":165},[155,286,287],{"class":169}," [\n",[155,289,291],{"class":157,"line":290},8,[155,292,294],{"class":293},"sHwdD","    \u002F\u002F Other columns...\n",[155,296,298],{"class":157,"line":297},9,[155,299,300],{"class":165},"    {\n",[155,302,304,307,309,311,314,316],{"class":157,"line":303},10,[155,305,306],{"class":245},"      name",[155,308,249],{"class":165},[155,310,179],{"class":165},[155,312,313],{"class":182},"password",[155,315,257],{"class":165},[155,317,260],{"class":165},[155,319,321,324,326,328,331,333],{"class":157,"line":320},11,[155,322,323],{"class":245},"      columnName",[155,325,249],{"class":165},[155,327,179],{"class":165},[155,329,330],{"class":182},"password_hash",[155,332,257],{"class":165},[155,334,260],{"class":165},[155,336,338,341,343,345,348,350],{"class":157,"line":337},12,[155,339,340],{"class":245},"      type",[155,342,249],{"class":165},[155,344,179],{"class":165},[155,346,347],{"class":182},"string",[155,349,257],{"class":165},[155,351,260],{"class":165},[155,353,355,358,360,364],{"class":157,"line":354},13,[155,356,357],{"class":245},"      nullable",[155,359,249],{"class":165},[155,361,363],{"class":362},"sfNiH"," false",[155,365,260],{"class":165},[155,367,369,372,374,376],{"class":157,"line":368},14,[155,370,371],{"class":245},"      primaryKey",[155,373,249],{"class":165},[155,375,363],{"class":362},[155,377,260],{"class":165},[155,379,381,384,386,388],{"class":157,"line":380},15,[155,382,383],{"class":245},"      unique",[155,385,249],{"class":165},[155,387,363],{"class":362},[155,389,260],{"class":165},[155,391,393,396,398,401],{"class":157,"line":392},16,[155,394,395],{"class":245},"      hidden",[155,397,249],{"class":165},[155,399,400],{"class":362}," true",[155,402,260],{"class":165},[155,404,406,409,411],{"class":157,"line":405},17,[155,407,408],{"class":245},"      validators",[155,410,249],{"class":165},[155,412,287],{"class":169},[155,414,416],{"class":157,"line":415},18,[155,417,418],{"class":165},"        {\n",[155,420,422,425,427,429,432,434],{"class":157,"line":421},19,[155,423,424],{"class":245},"          name",[155,426,249],{"class":165},[155,428,179],{"class":165},[155,430,431],{"class":182},"password-length",[155,433,257],{"class":165},[155,435,260],{"class":165},[155,437,439,442,444,448,451],{"class":157,"line":438},20,[155,440,441],{"class":245},"          validate",[155,443,236],{"class":165},[155,445,447],{"class":446},"sHdIc","value",[155,449,450],{"class":165},")",[155,452,453],{"class":165}," {\n",[155,455,457,460,463,466,469,471,473,475,478,480,483,486,489],{"class":157,"line":456},21,[155,458,459],{"class":161},"            return",[155,461,462],{"class":165}," typeof",[155,464,465],{"class":169}," value",[155,467,468],{"class":165}," ===",[155,470,179],{"class":165},[155,472,347],{"class":182},[155,474,257],{"class":165},[155,476,477],{"class":165}," &&",[155,479,465],{"class":169},[155,481,482],{"class":165},".",[155,484,485],{"class":169},"length",[155,487,488],{"class":165}," >=",[155,490,492],{"class":491},"sbssI"," 12\n",[155,494,496,499,501,504,506,508],{"class":157,"line":495},22,[155,497,498],{"class":165},"              ?",[155,500,166],{"class":165},[155,502,503],{"class":245}," valid",[155,505,249],{"class":165},[155,507,400],{"class":362},[155,509,510],{"class":165}," }\n",[155,512,514,517,519,521,523,525,528,531,533,535,538,540],{"class":157,"line":513},23,[155,515,516],{"class":165},"              :",[155,518,166],{"class":165},[155,520,503],{"class":245},[155,522,249],{"class":165},[155,524,363],{"class":362},[155,526,527],{"class":165},",",[155,529,530],{"class":245}," message",[155,532,249],{"class":165},[155,534,179],{"class":165},[155,536,537],{"class":182},"Use at least 12 characters.",[155,539,257],{"class":165},[155,541,510],{"class":165},[155,543,545],{"class":157,"line":544},24,[155,546,547],{"class":165},"          }\n",[155,549,551],{"class":157,"line":550},25,[155,552,553],{"class":165},"        }\n",[155,555,557,560],{"class":157,"line":556},26,[155,558,559],{"class":169},"      ]",[155,561,260],{"class":165},[155,563,565,568,570,572,574],{"class":157,"line":564},27,[155,566,567],{"class":245},"      transform",[155,569,236],{"class":165},[155,571,447],{"class":446},[155,573,450],{"class":165},[155,575,453],{"class":165},[155,577,579,582,584,586,588,591,595],{"class":157,"line":578},28,[155,580,581],{"class":161},"        return",[155,583,170],{"class":233},[155,585,236],{"class":245},[155,587,447],{"class":169},[155,589,590],{"class":161}," as",[155,592,594],{"class":593},"sBMFI"," string",[155,596,597],{"class":245},")\n",[155,599,601],{"class":157,"line":600},29,[155,602,603],{"class":165},"      }\n",[155,605,607],{"class":157,"line":606},30,[155,608,609],{"class":165},"    }\n",[155,611,613,616],{"class":157,"line":612},31,[155,614,615],{"class":169},"  ]",[155,617,260],{"class":165},[155,619,621,624,626,629],{"class":157,"line":620},32,[155,622,623],{"class":245},"  relations",[155,625,249],{"class":165},[155,627,628],{"class":169}," []",[155,630,260],{"class":165},[155,632,634,637,639],{"class":157,"line":633},33,[155,635,636],{"class":245},"  tableValidators",[155,638,249],{"class":165},[155,640,641],{"class":169}," []\n",[155,643,645,648],{"class":157,"line":644},34,[155,646,647],{"class":165},"}",[155,649,597],{"class":169},[129,651,652],{},"Creating or updating the password uses the same metadata rule:",[146,654,656],{"className":148,"code":655,"language":150,"meta":151,"style":151},"await engine.create('users', {\n  password: 'a-long-plain-text-password'\n})\n\nawait engine.updateOne(\n  'users',\n  { conditions: [{ field: 'id', operator: 'eq', value: userId }] },\n  { password: 'a-new-long-password' }\n)\n",[141,657,658,683,697,703,707,721,732,791,809],{"__ignoreMap":151},[155,659,660,663,666,668,671,673,675,677,679,681],{"class":157,"line":158},[155,661,662],{"class":161},"await",[155,664,665],{"class":169}," engine",[155,667,482],{"class":165},[155,669,670],{"class":233},"create",[155,672,236],{"class":169},[155,674,257],{"class":165},[155,676,254],{"class":182},[155,678,257],{"class":165},[155,680,527],{"class":165},[155,682,453],{"class":165},[155,684,685,688,690,692,695],{"class":157,"line":189},[155,686,687],{"class":245},"  password",[155,689,249],{"class":165},[155,691,179],{"class":165},[155,693,694],{"class":182},"a-long-plain-text-password",[155,696,186],{"class":165},[155,698,699,701],{"class":157,"line":210},[155,700,647],{"class":165},[155,702,597],{"class":169},[155,704,705],{"class":157,"line":217},[155,706,214],{"emptyLinePlaceholder":213},[155,708,709,711,713,715,718],{"class":157,"line":242},[155,710,662],{"class":161},[155,712,665],{"class":169},[155,714,482],{"class":165},[155,716,717],{"class":233},"updateOne",[155,719,720],{"class":169},"(\n",[155,722,723,726,728,730],{"class":157,"line":263},[155,724,725],{"class":165},"  '",[155,727,254],{"class":182},[155,729,257],{"class":165},[155,731,260],{"class":165},[155,733,734,737,740,742,745,748,751,753,755,758,760,762,765,767,769,772,774,776,778,780,783,785,788],{"class":157,"line":279},[155,735,736],{"class":165},"  {",[155,738,739],{"class":245}," conditions",[155,741,249],{"class":165},[155,743,744],{"class":169}," [",[155,746,747],{"class":165},"{",[155,749,750],{"class":245}," field",[155,752,249],{"class":165},[155,754,179],{"class":165},[155,756,757],{"class":182},"id",[155,759,257],{"class":165},[155,761,527],{"class":165},[155,763,764],{"class":245}," operator",[155,766,249],{"class":165},[155,768,179],{"class":165},[155,770,771],{"class":182},"eq",[155,773,257],{"class":165},[155,775,527],{"class":165},[155,777,465],{"class":245},[155,779,249],{"class":165},[155,781,782],{"class":169}," userId ",[155,784,647],{"class":165},[155,786,787],{"class":169},"] ",[155,789,790],{"class":165},"},\n",[155,792,793,795,798,800,802,805,807],{"class":157,"line":290},[155,794,736],{"class":165},[155,796,797],{"class":245}," password",[155,799,249],{"class":165},[155,801,179],{"class":165},[155,803,804],{"class":182},"a-new-long-password",[155,806,257],{"class":165},[155,808,510],{"class":165},[155,810,811],{"class":157,"line":297},[155,812,597],{"class":169},[129,814,815,816,818],{},"The validator receives the submitted plain-text value. The transform then\nhashes it, and only the transformed value reaches the adapter. On update, the\ntransform runs only when ",[141,817,313],{}," is present in the patch, so unrelated\nupdates never hash an existing hash again.",[133,820,822],{"id":821},"transformation-context","Transformation context",[129,824,825],{},"The transformer may be asynchronous and receives the mutation context:",[146,827,829],{"className":148,"code":828,"language":150,"meta":151,"style":151},"transform(value, { operation, table, field, user, tenantId, requestId }) {\n  return encryptionService.encrypt(value, {\n    operation,\n    table,\n    field,\n    user,\n    tenantId,\n    requestId\n  })\n}\n",[141,830,831,876,897,904,911,918,925,932,937,944],{"__ignoreMap":151},[155,832,833,835,838,840,842,845,847,850,852,854,856,859,861,864,866,869,871,874],{"class":157,"line":158},[155,834,143],{"class":233},[155,836,837],{"class":169},"(value",[155,839,527],{"class":165},[155,841,166],{"class":165},[155,843,844],{"class":169}," operation",[155,846,527],{"class":165},[155,848,849],{"class":169}," table",[155,851,527],{"class":165},[155,853,750],{"class":169},[155,855,527],{"class":165},[155,857,858],{"class":169}," user",[155,860,527],{"class":165},[155,862,863],{"class":169}," tenantId",[155,865,527],{"class":165},[155,867,868],{"class":169}," requestId ",[155,870,647],{"class":165},[155,872,873],{"class":169},") ",[155,875,239],{"class":165},[155,877,878,881,884,886,889,891,893,895],{"class":157,"line":189},[155,879,880],{"class":161},"  return",[155,882,883],{"class":169}," encryptionService",[155,885,482],{"class":165},[155,887,888],{"class":233},"encrypt",[155,890,236],{"class":245},[155,892,447],{"class":169},[155,894,527],{"class":165},[155,896,453],{"class":165},[155,898,899,902],{"class":157,"line":210},[155,900,901],{"class":169},"    operation",[155,903,260],{"class":165},[155,905,906,909],{"class":157,"line":217},[155,907,908],{"class":169},"    table",[155,910,260],{"class":165},[155,912,913,916],{"class":157,"line":242},[155,914,915],{"class":169},"    field",[155,917,260],{"class":165},[155,919,920,923],{"class":157,"line":263},[155,921,922],{"class":169},"    user",[155,924,260],{"class":165},[155,926,927,930],{"class":157,"line":279},[155,928,929],{"class":169},"    tenantId",[155,931,260],{"class":165},[155,933,934],{"class":157,"line":290},[155,935,936],{"class":169},"    requestId\n",[155,938,939,942],{"class":157,"line":297},[155,940,941],{"class":165},"  }",[155,943,597],{"class":245},[155,945,946],{"class":157,"line":303},[155,947,948],{"class":165},"}\n",[129,950,951],{},"The execution order is:",[953,954,955,959,969,972,975,978],"ol",{},[956,957,958],"li",{},"create defaults;",[956,960,961,964,965,968],{},[141,962,963],{},"beforeCreate"," or ",[141,966,967],{},"beforeUpdate"," hooks;",[956,970,971],{},"structural, field and table validation;",[956,973,974],{},"field transforms;",[956,976,977],{},"adapter write;",[956,979,980,964,983,986],{},[141,981,982],{},"afterCreate",[141,984,985],{},"afterUpdate"," hooks and audit recording.",[129,988,989,990,993,994,997],{},"Transforms affect writes only. ",[141,991,992],{},"hidden"," and ",[141,995,996],{},"visibility"," remain responsible\nfor filtering values returned to callers.",[999,1000,1001],"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 pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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);}",{"title":151,"searchDepth":158,"depth":189,"links":1003},[1004,1005],{"id":135,"depth":189,"text":136},{"id":821,"depth":189,"text":822},"Transform validated field values immediately before database writes.","md",null,{},{"icon":61},{"title":58,"description":1006},"qHZv0AvWIH-NYSi6AZhBmop1Hl5-krSm5KC2csyBkWc",[1014,1016],{"title":53,"path":54,"stem":55,"description":1015,"icon":56,"children":-1},"Persist typed business events atomically and publish them from an outbox.",{"title":63,"path":64,"stem":65,"description":1017,"icon":66,"children":-1},"Remove hidden and context-sensitive fields from every engine result.",1783964086906]