[{"data":1,"prerenderedAt":676},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Faudit-log":103,"\u002Fguides\u002Faudit-log-surround":671},[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":38,"body":105,"description":664,"extension":665,"links":666,"meta":667,"navigation":668,"path":39,"seo":669,"stem":40,"__hash__":670},"docs\u002F03.guides\u002Faudit-log.md",{"type":106,"value":107,"toc":657},"minimark",[108,112,117,242,245,249,284,291,295,396,400,625,635,638,642,653],[109,110,111],"p",{},"Audit entries are written through the same transaction adapter as the mutation.\nIf audit persistence fails, the domain mutation rolls back.",[113,114,116],"h2",{"id":115},"enable-a-table","Enable a table",[118,119,124],"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export const users = defineTable({\n  \u002F\u002F ...\n  audit: {\n    enabled: true,\n    excludedFields: ['password', 'refreshToken']\n  }\n})\n","ts","",[125,126,127,158,165,178,193,227,233],"code",{"__ignoreMap":123},[128,129,132,136,140,144,148,152,155],"span",{"class":130,"line":131},"line",1,[128,133,135],{"class":134},"s7zQu","export",[128,137,139],{"class":138},"spNyl"," const",[128,141,143],{"class":142},"sTEyZ"," users ",[128,145,147],{"class":146},"sMK4o","=",[128,149,151],{"class":150},"s2Zo4"," defineTable",[128,153,154],{"class":142},"(",[128,156,157],{"class":146},"{\n",[128,159,161],{"class":130,"line":160},2,[128,162,164],{"class":163},"sHwdD","  \u002F\u002F ...\n",[128,166,168,172,175],{"class":130,"line":167},3,[128,169,171],{"class":170},"swJcz","  audit",[128,173,174],{"class":146},":",[128,176,177],{"class":146}," {\n",[128,179,181,184,186,190],{"class":130,"line":180},4,[128,182,183],{"class":170},"    enabled",[128,185,174],{"class":146},[128,187,189],{"class":188},"sfNiH"," true",[128,191,192],{"class":146},",\n",[128,194,196,199,201,204,207,211,213,216,219,222,224],{"class":130,"line":195},5,[128,197,198],{"class":170},"    excludedFields",[128,200,174],{"class":146},[128,202,203],{"class":142}," [",[128,205,206],{"class":146},"'",[128,208,210],{"class":209},"sfazB","password",[128,212,206],{"class":146},[128,214,215],{"class":146},",",[128,217,218],{"class":146}," '",[128,220,221],{"class":209},"refreshToken",[128,223,206],{"class":146},[128,225,226],{"class":142},"]\n",[128,228,230],{"class":130,"line":229},6,[128,231,232],{"class":146},"  }\n",[128,234,236,239],{"class":130,"line":235},7,[128,237,238],{"class":146},"}",[128,240,241],{"class":142},")\n",[109,243,244],{},"Excluded fields never appear in snapshots or computed changes. The registry\nrejects unknown excluded fields.",[113,246,248],{"id":247},"create-the-audit-table","Create the audit table",[118,250,252],{"className":120,"code":251,"language":122,"meta":123,"style":123},"const auditLogs = createAuditLogMetadata()\nadapter.buildTable(auditLogs)\n",[125,253,254,270],{"__ignoreMap":123},[128,255,256,259,262,264,267],{"class":130,"line":131},[128,257,258],{"class":138},"const",[128,260,261],{"class":142}," auditLogs ",[128,263,147],{"class":146},[128,265,266],{"class":150}," createAuditLogMetadata",[128,268,269],{"class":142},"()\n",[128,271,272,275,278,281],{"class":130,"line":160},[128,273,274],{"class":142},"adapter",[128,276,277],{"class":146},".",[128,279,280],{"class":150},"buildTable",[128,282,283],{"class":142},"(auditLogs)\n",[109,285,286,287,290],{},"Create the corresponding physical ",[125,288,289],{},"audit_logs"," table with your migration\nworkflow. The helper only supplies runtime metadata.",[113,292,294],{"id":293},"configure-the-engine","Configure the engine",[118,296,298],{"className":120,"code":297,"language":122,"meta":123,"style":123},"const audit = createAuditManager(\n  createDatabaseAuditWriter('auditLogs')\n)\n\nconst engine = createQueryEngine(\n  registry,\n  adapter,\n  hooks,\n  serializer,\n  audit\n)\n",[125,299,300,315,331,335,341,355,362,369,377,385,391],{"__ignoreMap":123},[128,301,302,304,307,309,312],{"class":130,"line":131},[128,303,258],{"class":138},[128,305,306],{"class":142}," audit ",[128,308,147],{"class":146},[128,310,311],{"class":150}," createAuditManager",[128,313,314],{"class":142},"(\n",[128,316,317,320,322,324,327,329],{"class":130,"line":160},[128,318,319],{"class":150},"  createDatabaseAuditWriter",[128,321,154],{"class":142},[128,323,206],{"class":146},[128,325,326],{"class":209},"auditLogs",[128,328,206],{"class":146},[128,330,241],{"class":142},[128,332,333],{"class":130,"line":167},[128,334,241],{"class":142},[128,336,337],{"class":130,"line":180},[128,338,340],{"emptyLinePlaceholder":339},true,"\n",[128,342,343,345,348,350,353],{"class":130,"line":195},[128,344,258],{"class":138},[128,346,347],{"class":142}," engine ",[128,349,147],{"class":146},[128,351,352],{"class":150}," createQueryEngine",[128,354,314],{"class":142},[128,356,357,360],{"class":130,"line":229},[128,358,359],{"class":142},"  registry",[128,361,192],{"class":146},[128,363,364,367],{"class":130,"line":235},[128,365,366],{"class":142},"  adapter",[128,368,192],{"class":146},[128,370,372,375],{"class":130,"line":371},8,[128,373,374],{"class":142},"  hooks",[128,376,192],{"class":146},[128,378,380,383],{"class":130,"line":379},9,[128,381,382],{"class":142},"  serializer",[128,384,192],{"class":146},[128,386,388],{"class":130,"line":387},10,[128,389,390],{"class":142},"  audit\n",[128,392,394],{"class":130,"line":393},11,[128,395,241],{"class":142},[113,397,399],{"id":398},"entry-shape","Entry shape",[118,401,403],{"className":120,"code":402,"language":122,"meta":123,"style":123},"interface AuditEntry {\n  id: string\n  operation: 'create' | 'update' | 'delete'\n  table: string\n  entityId: Record\u003Cstring, unknown>\n  before: Record\u003Cstring, unknown> | null\n  after: Record\u003Cstring, unknown> | null\n  changes: Record\u003Cstring, { before?: unknown; after?: unknown }>\n  actor?: unknown\n  tenantId?: string\n  requestId?: string\n  occurredAt: Date\n}\n",[125,404,405,416,426,460,469,493,518,541,580,590,599,608,619],{"__ignoreMap":123},[128,406,407,410,414],{"class":130,"line":131},[128,408,409],{"class":138},"interface",[128,411,413],{"class":412},"sBMFI"," AuditEntry",[128,415,177],{"class":146},[128,417,418,421,423],{"class":130,"line":160},[128,419,420],{"class":170},"  id",[128,422,174],{"class":146},[128,424,425],{"class":412}," string\n",[128,427,428,431,433,435,438,440,443,445,448,450,452,454,457],{"class":130,"line":167},[128,429,430],{"class":170},"  operation",[128,432,174],{"class":146},[128,434,218],{"class":146},[128,436,437],{"class":209},"create",[128,439,206],{"class":146},[128,441,442],{"class":146}," |",[128,444,218],{"class":146},[128,446,447],{"class":209},"update",[128,449,206],{"class":146},[128,451,442],{"class":146},[128,453,218],{"class":146},[128,455,456],{"class":209},"delete",[128,458,459],{"class":146},"'\n",[128,461,462,465,467],{"class":130,"line":180},[128,463,464],{"class":170},"  table",[128,466,174],{"class":146},[128,468,425],{"class":412},[128,470,471,474,476,479,482,485,487,490],{"class":130,"line":195},[128,472,473],{"class":170},"  entityId",[128,475,174],{"class":146},[128,477,478],{"class":412}," Record",[128,480,481],{"class":146},"\u003C",[128,483,484],{"class":412},"string",[128,486,215],{"class":146},[128,488,489],{"class":412}," unknown",[128,491,492],{"class":146},">\n",[128,494,495,498,500,502,504,506,508,510,513,515],{"class":130,"line":229},[128,496,497],{"class":170},"  before",[128,499,174],{"class":146},[128,501,478],{"class":412},[128,503,481],{"class":146},[128,505,484],{"class":412},[128,507,215],{"class":146},[128,509,489],{"class":412},[128,511,512],{"class":146},">",[128,514,442],{"class":146},[128,516,517],{"class":412}," null\n",[128,519,520,523,525,527,529,531,533,535,537,539],{"class":130,"line":235},[128,521,522],{"class":170},"  after",[128,524,174],{"class":146},[128,526,478],{"class":412},[128,528,481],{"class":146},[128,530,484],{"class":412},[128,532,215],{"class":146},[128,534,489],{"class":412},[128,536,512],{"class":146},[128,538,442],{"class":146},[128,540,517],{"class":412},[128,542,543,546,548,550,552,554,556,559,562,565,567,570,573,575,577],{"class":130,"line":371},[128,544,545],{"class":170},"  changes",[128,547,174],{"class":146},[128,549,478],{"class":412},[128,551,481],{"class":146},[128,553,484],{"class":412},[128,555,215],{"class":146},[128,557,558],{"class":146}," {",[128,560,561],{"class":170}," before",[128,563,564],{"class":146},"?:",[128,566,489],{"class":412},[128,568,569],{"class":146},";",[128,571,572],{"class":170}," after",[128,574,564],{"class":146},[128,576,489],{"class":412},[128,578,579],{"class":146}," }>\n",[128,581,582,585,587],{"class":130,"line":379},[128,583,584],{"class":170},"  actor",[128,586,564],{"class":146},[128,588,589],{"class":412}," unknown\n",[128,591,592,595,597],{"class":130,"line":387},[128,593,594],{"class":170},"  tenantId",[128,596,564],{"class":146},[128,598,425],{"class":412},[128,600,601,604,606],{"class":130,"line":393},[128,602,603],{"class":170},"  requestId",[128,605,564],{"class":146},[128,607,425],{"class":412},[128,609,611,614,616],{"class":130,"line":610},12,[128,612,613],{"class":170},"  occurredAt",[128,615,174],{"class":146},[128,617,618],{"class":412}," Date\n",[128,620,622],{"class":130,"line":621},13,[128,623,624],{"class":146},"}\n",[109,626,627,628,631,632,277],{},"The actor, tenant and request come from ",[125,629,630],{},"QueryContextInput",". Composite primary\nkeys are preserved in ",[125,633,634],{},"entityId",[109,636,637],{},"Bulk updates and deletes create one entry per affected entity. Reads never\nproduce audit entries, and the standard audit table has auditing disabled to\navoid recursion.",[113,639,641],{"id":640},"custom-storage","Custom storage",[109,643,644,645,648,649,652],{},"Implement ",[125,646,647],{},"AuditWriter"," when entries must use a different table or storage\nformat. Always write through the adapter passed to ",[125,650,651],{},"write()"," to preserve\natomicity.",[654,655,656],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}",{"title":123,"searchDepth":131,"depth":160,"links":658},[659,660,661,662,663],{"id":115,"depth":160,"text":116},{"id":247,"depth":160,"text":248},{"id":293,"depth":160,"text":294},{"id":398,"depth":160,"text":399},{"id":640,"depth":160,"text":641},"Record transactional mutation history with actors and field changes.","md",null,{},{"icon":41},{"title":38,"description":664},"2Mpmb4fMPS-9Z379wF4UrpRi72q-BGBwheo1-K66VhU",[672,674],{"title":26,"path":27,"stem":28,"description":673,"icon":29,"children":-1},"Execute typed reads, safe mutations and application transactions.",{"title":43,"path":44,"stem":45,"description":675,"icon":46,"children":-1},"Page through changing datasets with stable keyset filters.",1783784235117]