[{"data":1,"prerenderedAt":925},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Fmetadata-and-registry":103,"\u002Fconcepts\u002Fmetadata-and-registry-surround":920},[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":21,"body":105,"description":913,"extension":914,"links":915,"meta":916,"navigation":917,"path":22,"seo":918,"stem":23,"__hash__":919},"docs\u002F02.concepts\u002Fmetadata-and-registry.md",{"type":106,"value":107,"toc":905},"minimark",[108,112,117,307,324,328,421,424,428,539,554,582,586,714,717,721,805,808,812,857,864,867,895,901],[109,110,111],"p",{},"Metadata is the source of truth consumed by validation, relation resolution,\nserialization, audit, schema checks and type inference.",[113,114,116],"h2",{"id":115},"preserve-literal-types","Preserve literal types",[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  name: 'users',\n  collectionName: 'app_users',\n  columns: [\u002F* ... *\u002F],\n  relations: [],\n  tableValidators: [],\n  indexes: [],\n  audit: { enabled: true, excludedFields: ['password'] }\n})\n","ts","",[125,126,127,158,181,198,218,231,243,255,298],"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,165,168,171,175,178],{"class":130,"line":160},2,[128,162,164],{"class":163},"swJcz","  name",[128,166,167],{"class":146},":",[128,169,170],{"class":146}," '",[128,172,174],{"class":173},"sfazB","users",[128,176,177],{"class":146},"'",[128,179,180],{"class":146},",\n",[128,182,184,187,189,191,194,196],{"class":130,"line":183},3,[128,185,186],{"class":163},"  collectionName",[128,188,167],{"class":146},[128,190,170],{"class":146},[128,192,193],{"class":173},"app_users",[128,195,177],{"class":146},[128,197,180],{"class":146},[128,199,201,204,206,209,213,216],{"class":130,"line":200},4,[128,202,203],{"class":163},"  columns",[128,205,167],{"class":146},[128,207,208],{"class":142}," [",[128,210,212],{"class":211},"sHwdD","\u002F* ... *\u002F",[128,214,215],{"class":142},"]",[128,217,180],{"class":146},[128,219,221,224,226,229],{"class":130,"line":220},5,[128,222,223],{"class":163},"  relations",[128,225,167],{"class":146},[128,227,228],{"class":142}," []",[128,230,180],{"class":146},[128,232,234,237,239,241],{"class":130,"line":233},6,[128,235,236],{"class":163},"  tableValidators",[128,238,167],{"class":146},[128,240,228],{"class":142},[128,242,180],{"class":146},[128,244,246,249,251,253],{"class":130,"line":245},7,[128,247,248],{"class":163},"  indexes",[128,250,167],{"class":146},[128,252,228],{"class":142},[128,254,180],{"class":146},[128,256,258,261,263,266,269,271,275,278,281,283,285,287,290,292,295],{"class":130,"line":257},8,[128,259,260],{"class":163},"  audit",[128,262,167],{"class":146},[128,264,265],{"class":146}," {",[128,267,268],{"class":163}," enabled",[128,270,167],{"class":146},[128,272,274],{"class":273},"sfNiH"," true",[128,276,277],{"class":146},",",[128,279,280],{"class":163}," excludedFields",[128,282,167],{"class":146},[128,284,208],{"class":142},[128,286,177],{"class":146},[128,288,289],{"class":173},"password",[128,291,177],{"class":146},[128,293,294],{"class":142},"] ",[128,296,297],{"class":146},"}\n",[128,299,301,304],{"class":130,"line":300},9,[128,302,303],{"class":146},"}",[128,305,306],{"class":142},")\n",[308,309,313],"callout",{"color":310,"icon":311,"variant":312},"warning","i-tabler-alert-triangle","subtle",[109,314,315,316,319,320,323],{},"Avoid ",[125,317,318],{},"const users: TableMetadata = {...}"," when you need inference. That\nannotation widens ",[125,321,322],{},"\"users\"",", field names and column types to generic strings.",[113,325,327],{"id":326},"table-shape","Table shape",[118,329,331],{"className":120,"code":330,"language":122,"meta":123,"style":123},"interface TableMetadata {\n  name: string\n  collectionName: string\n  columns: ColumnMetadata[]\n  relations: RelationMetadata[]\n  tableValidators: TableValidatorMetadata[]\n  indexes?: IndexMetadata[]\n  audit?: AuditMetadata\n}\n",[125,332,333,345,354,362,374,385,396,408,417],{"__ignoreMap":123},[128,334,335,338,342],{"class":130,"line":131},[128,336,337],{"class":138},"interface",[128,339,341],{"class":340},"sBMFI"," TableMetadata",[128,343,344],{"class":146}," {\n",[128,346,347,349,351],{"class":130,"line":160},[128,348,164],{"class":163},[128,350,167],{"class":146},[128,352,353],{"class":340}," string\n",[128,355,356,358,360],{"class":130,"line":183},[128,357,186],{"class":163},[128,359,167],{"class":146},[128,361,353],{"class":340},[128,363,364,366,368,371],{"class":130,"line":200},[128,365,203],{"class":163},[128,367,167],{"class":146},[128,369,370],{"class":340}," ColumnMetadata",[128,372,373],{"class":142},"[]\n",[128,375,376,378,380,383],{"class":130,"line":220},[128,377,223],{"class":163},[128,379,167],{"class":146},[128,381,382],{"class":340}," RelationMetadata",[128,384,373],{"class":142},[128,386,387,389,391,394],{"class":130,"line":233},[128,388,236],{"class":163},[128,390,167],{"class":146},[128,392,393],{"class":340}," TableValidatorMetadata",[128,395,373],{"class":142},[128,397,398,400,403,406],{"class":130,"line":245},[128,399,248],{"class":163},[128,401,402],{"class":146},"?:",[128,404,405],{"class":340}," IndexMetadata",[128,407,373],{"class":142},[128,409,410,412,414],{"class":130,"line":257},[128,411,260],{"class":163},[128,413,402],{"class":146},[128,415,416],{"class":340}," AuditMetadata\n",[128,418,419],{"class":130,"line":300},[128,420,297],{"class":146},[109,422,423],{},"Logical names are used by the engine; physical names are used by the adapter.",[113,425,427],{"id":426},"column-types-and-inference","Column types and inference",[429,430,431,444],"table",{},[432,433,434],"thead",{},[435,436,437,441],"tr",{},[438,439,440],"th",{},"Metadata type",[438,442,443],{},"Runtime and inferred type",[445,446,447,469,481,492,503,515,527],"tbody",{},[435,448,449,465],{},[450,451,452,455,456,455,459,455,462],"td",{},[125,453,454],{},"uuid",", ",[125,457,458],{},"string",[125,460,461],{},"text",[125,463,464],{},"date",[450,466,467],{},[125,468,458],{},[435,470,471,476],{},[450,472,473],{},[125,474,475],{},"integer",[450,477,478],{},[125,479,480],{},"number",[435,482,483,488],{},[450,484,485],{},[125,486,487],{},"bigint",[450,489,490],{},[125,491,487],{},[435,493,494,499],{},[450,495,496],{},[125,497,498],{},"boolean",[450,500,501],{},[125,502,498],{},[435,504,505,510],{},[450,506,507],{},[125,508,509],{},"timestamp",[450,511,512],{},[125,513,514],{},"Date",[435,516,517,522],{},[450,518,519],{},[125,520,521],{},"decimal",[450,523,524],{},[125,525,526],{},"string | number",[435,528,529,534],{},[450,530,531],{},[125,532,533],{},"json",[450,535,536],{},[125,537,538],{},"unknown",[109,540,541,542,545,546,549,550,553],{},"A nullable column becomes ",[125,543,544],{},"T | null",". ",[125,547,548],{},"hidden: true"," removes the field from the\ninferred result. A field using a dynamic ",[125,551,552],{},"visibility"," resolver becomes optional.",[118,555,557],{"className":120,"code":556,"language":122,"meta":123,"style":123},"type User = InferTableEntity\u003Ctypeof users>\n",[125,558,559],{"__ignoreMap":123},[128,560,561,564,567,570,573,576,579],{"class":130,"line":131},[128,562,563],{"class":138},"type",[128,565,566],{"class":340}," User",[128,568,569],{"class":146}," =",[128,571,572],{"class":340}," InferTableEntity",[128,574,575],{"class":146},"\u003Ctypeof",[128,577,578],{"class":142}," users",[128,580,581],{"class":146},">\n",[113,583,585],{"id":584},"defaults-and-validators","Defaults and validators",[118,587,589],{"className":120,"code":588,"language":122,"meta":123,"style":123},"{\n  name: 'createdAt',\n  columnName: 'created_at',\n  type: 'timestamp',\n  nullable: false,\n  primaryKey: false,\n  unique: false,\n  default: () => new Date(),\n  validators: []\n}\n",[125,590,591,595,610,626,641,653,664,675,699,709],{"__ignoreMap":123},[128,592,593],{"class":130,"line":131},[128,594,157],{"class":146},[128,596,597,599,601,603,606,608],{"class":130,"line":160},[128,598,164],{"class":340},[128,600,167],{"class":146},[128,602,170],{"class":146},[128,604,605],{"class":173},"createdAt",[128,607,177],{"class":146},[128,609,180],{"class":146},[128,611,612,615,617,619,622,624],{"class":130,"line":183},[128,613,614],{"class":340},"  columnName",[128,616,167],{"class":146},[128,618,170],{"class":146},[128,620,621],{"class":173},"created_at",[128,623,177],{"class":146},[128,625,180],{"class":146},[128,627,628,631,633,635,637,639],{"class":130,"line":200},[128,629,630],{"class":340},"  type",[128,632,167],{"class":146},[128,634,170],{"class":146},[128,636,509],{"class":173},[128,638,177],{"class":146},[128,640,180],{"class":146},[128,642,643,646,648,651],{"class":130,"line":220},[128,644,645],{"class":340},"  nullable",[128,647,167],{"class":146},[128,649,650],{"class":273}," false",[128,652,180],{"class":146},[128,654,655,658,660,662],{"class":130,"line":233},[128,656,657],{"class":340},"  primaryKey",[128,659,167],{"class":146},[128,661,650],{"class":273},[128,663,180],{"class":146},[128,665,666,669,671,673],{"class":130,"line":245},[128,667,668],{"class":340},"  unique",[128,670,167],{"class":146},[128,672,650],{"class":273},[128,674,180],{"class":146},[128,676,677,680,683,686,689,692,695,697],{"class":130,"line":257},[128,678,679],{"class":134},"  default",[128,681,682],{"class":163},": ",[128,684,685],{"class":146},"()",[128,687,688],{"class":138}," =>",[128,690,691],{"class":146}," new",[128,693,694],{"class":150}," Date",[128,696,685],{"class":163},[128,698,180],{"class":146},[128,700,701,704,706],{"class":130,"line":300},[128,702,703],{"class":340},"  validators",[128,705,167],{"class":146},[128,707,708],{"class":163}," []\n",[128,710,712],{"class":130,"line":711},10,[128,713,297],{"class":146},[109,715,716],{},"Defaults are applied for missing creation fields before before-create hooks.\nValidators may be synchronous or asynchronous.",[113,718,720],{"id":719},"indexes","Indexes",[118,722,724],{"className":120,"code":723,"language":122,"meta":123,"style":123},"indexes: [\n  {\n    name: 'applications_tenant_status_idx',\n    fields: ['tenantId', 'status'],\n    unique: false\n  }\n]\n",[125,725,726,735,740,756,785,795,800],{"__ignoreMap":123},[128,727,728,730,732],{"class":130,"line":131},[128,729,719],{"class":340},[128,731,167],{"class":146},[128,733,734],{"class":142}," [\n",[128,736,737],{"class":130,"line":160},[128,738,739],{"class":146},"  {\n",[128,741,742,745,747,749,752,754],{"class":130,"line":183},[128,743,744],{"class":163},"    name",[128,746,167],{"class":146},[128,748,170],{"class":146},[128,750,751],{"class":173},"applications_tenant_status_idx",[128,753,177],{"class":146},[128,755,180],{"class":146},[128,757,758,761,763,765,767,770,772,774,776,779,781,783],{"class":130,"line":200},[128,759,760],{"class":163},"    fields",[128,762,167],{"class":146},[128,764,208],{"class":142},[128,766,177],{"class":146},[128,768,769],{"class":173},"tenantId",[128,771,177],{"class":146},[128,773,277],{"class":146},[128,775,170],{"class":146},[128,777,778],{"class":173},"status",[128,780,177],{"class":146},[128,782,215],{"class":142},[128,784,180],{"class":146},[128,786,787,790,792],{"class":130,"line":220},[128,788,789],{"class":163},"    unique",[128,791,167],{"class":146},[128,793,794],{"class":273}," false\n",[128,796,797],{"class":130,"line":233},[128,798,799],{"class":146},"  }\n",[128,801,802],{"class":130,"line":245},[128,803,804],{"class":142},"]\n",[109,806,807],{},"Index fields use logical column names and preserve order. Registry validation\nrejects empty indexes, duplicate names and unknown fields.",[113,809,811],{"id":810},"typed-registry","Typed registry",[118,813,815],{"className":120,"code":814,"language":122,"meta":123,"style":123},"const registry = createMetadataRegistry(users, posts, applications)\nregistry.lock()\n",[125,816,817,843],{"__ignoreMap":123},[128,818,819,822,825,827,830,833,835,838,840],{"class":130,"line":131},[128,820,821],{"class":138},"const",[128,823,824],{"class":142}," registry ",[128,826,147],{"class":146},[128,828,829],{"class":150}," createMetadataRegistry",[128,831,832],{"class":142},"(users",[128,834,277],{"class":146},[128,836,837],{"class":142}," posts",[128,839,277],{"class":146},[128,841,842],{"class":142}," applications)\n",[128,844,845,848,851,854],{"class":130,"line":160},[128,846,847],{"class":142},"registry",[128,849,850],{"class":146},".",[128,852,853],{"class":150},"lock",[128,855,856],{"class":142},"()\n",[109,858,859,860,863],{},"The registry carries its table map into ",[125,861,862],{},"QueryEngine",". TypeScript then restricts\ntable names and infers return types from the selected table.",[109,865,866],{},"The registry validates:",[868,869,870,874,877,880,883,886,889],"ul",{},[871,872,873],"li",{},"unique physical collection names;",[871,875,876],{},"unique logical and physical columns;",[871,878,879],{},"at least one primary key per table;",[871,881,882],{},"valid relation targets and fields;",[871,884,885],{},"valid junction tables;",[871,887,888],{},"declared indexes;",[871,890,891,892,850],{},"fields listed in ",[125,893,894],{},"audit.excludedFields",[109,896,897,900],{},[125,898,899],{},"lock()"," aggregates validation errors and makes registration immutable.",[902,903,904],"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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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":906},[907,908,909,910,911,912],{"id":115,"depth":160,"text":116},{"id":326,"depth":160,"text":327},{"id":426,"depth":160,"text":427},{"id":584,"depth":160,"text":585},{"id":719,"depth":160,"text":720},{"id":810,"depth":160,"text":811},"Define the domain model once and preserve it through the typed runtime.","md",null,{},{"icon":24},{"title":21,"description":913},"xV_06DMM_jjSuLafu2K_BFzD672fjrPDeuIy_SyPIJg",[921,923],{"title":16,"path":17,"stem":18,"description":922,"icon":19,"children":-1},"How metadata, execution services, and database adapters work together.",{"title":26,"path":27,"stem":28,"description":924,"icon":29,"children":-1},"Execute typed reads, safe mutations and application transactions.",1783784235117]