[{"data":1,"prerenderedAt":1076},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fmigrations":123,"\u002Fguides\u002Fmigrations-surround":1071},[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":73,"body":125,"description":1064,"extension":1065,"links":1066,"meta":1067,"navigation":1068,"path":74,"seo":1069,"stem":75,"__hash__":1070},"docs\u002F03.guides\u002Fmigrations.md",{"type":126,"value":127,"toc":1056},"minimark",[128,132,137,153,365,368,376,389,393,396,563,570,655,658,662,665,692,795,810,813,864,868,931,934,937,977,981,1010,1020,1024,1052],[129,130,131],"p",{},"Persistence migrations describe how a versioned schema snapshot evolves into\nthe metadata currently registered by the application. The generated artifact\nis database-neutral; the active adapter renders and executes its operations.",[133,134,136],"h2",{"id":135},"store-migration-files","Store migration files",[129,138,139,140,144,145,148,149,152],{},"Persistence includes filesystem helpers for keeping ordered JSON artifacts in\nsource control. ",[141,142,143],"code",{},"loadMigrations()"," reads numbered files in lexical order,\n",[141,146,147],{},"lastMigration()"," returns the last recorded schema snapshot, and\n",[141,150,151],{},"saveMigration()"," creates the directory and writes the next numbered file.",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  lastMigration,\n  loadMigrations,\n  saveMigration\n} from '@opensya\u002Fpersistence\u002Fmigrations'\n\nconst directory = '.\u002Fmigrations'\nconst migrations = await loadMigrations(directory)\n\nconst migration = engine.migrations.generate({\n  name: 'add-user-age',\n  previous: lastMigration(migrations)\n})\n\nawait saveMigration(directory, migration)\n","ts","",[141,161,162,175,185,193,199,218,225,245,265,270,300,320,334,342,347],{"__ignoreMap":159},[163,164,167,171],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"s7zQu","import",[163,172,174],{"class":173},"sMK4o"," {\n",[163,176,178,182],{"class":165,"line":177},2,[163,179,181],{"class":180},"sTEyZ","  lastMigration",[163,183,184],{"class":173},",\n",[163,186,188,191],{"class":165,"line":187},3,[163,189,190],{"class":180},"  loadMigrations",[163,192,184],{"class":173},[163,194,196],{"class":165,"line":195},4,[163,197,198],{"class":180},"  saveMigration\n",[163,200,202,205,208,211,215],{"class":165,"line":201},5,[163,203,204],{"class":173},"}",[163,206,207],{"class":169}," from",[163,209,210],{"class":173}," '",[163,212,214],{"class":213},"sfazB","@opensya\u002Fpersistence\u002Fmigrations",[163,216,217],{"class":173},"'\n",[163,219,221],{"class":165,"line":220},6,[163,222,224],{"emptyLinePlaceholder":223},true,"\n",[163,226,228,232,235,238,240,243],{"class":165,"line":227},7,[163,229,231],{"class":230},"spNyl","const",[163,233,234],{"class":180}," directory ",[163,236,237],{"class":173},"=",[163,239,210],{"class":173},[163,241,242],{"class":213},".\u002Fmigrations",[163,244,217],{"class":173},[163,246,248,250,253,255,258,262],{"class":165,"line":247},8,[163,249,231],{"class":230},[163,251,252],{"class":180}," migrations ",[163,254,237],{"class":173},[163,256,257],{"class":169}," await",[163,259,261],{"class":260},"s2Zo4"," loadMigrations",[163,263,264],{"class":180},"(directory)\n",[163,266,268],{"class":165,"line":267},9,[163,269,224],{"emptyLinePlaceholder":223},[163,271,273,275,278,280,283,286,289,291,294,297],{"class":165,"line":272},10,[163,274,231],{"class":230},[163,276,277],{"class":180}," migration ",[163,279,237],{"class":173},[163,281,282],{"class":180}," engine",[163,284,285],{"class":173},".",[163,287,288],{"class":180},"migrations",[163,290,285],{"class":173},[163,292,293],{"class":260},"generate",[163,295,296],{"class":180},"(",[163,298,299],{"class":173},"{\n",[163,301,303,307,310,312,315,318],{"class":165,"line":302},11,[163,304,306],{"class":305},"swJcz","  name",[163,308,309],{"class":173},":",[163,311,210],{"class":173},[163,313,314],{"class":213},"add-user-age",[163,316,317],{"class":173},"'",[163,319,184],{"class":173},[163,321,323,326,328,331],{"class":165,"line":322},12,[163,324,325],{"class":305},"  previous",[163,327,309],{"class":173},[163,329,330],{"class":260}," lastMigration",[163,332,333],{"class":180},"(migrations)\n",[163,335,337,339],{"class":165,"line":336},13,[163,338,204],{"class":173},[163,340,341],{"class":180},")\n",[163,343,345],{"class":165,"line":344},14,[163,346,224],{"emptyLinePlaceholder":223},[163,348,350,353,356,359,362],{"class":165,"line":349},15,[163,351,352],{"class":169},"await",[163,354,355],{"class":260}," saveMigration",[163,357,358],{"class":180},"(directory",[163,360,361],{"class":173},",",[163,363,364],{"class":180}," migration)\n",[129,366,367],{},"The generated filename uses an ordered prefix, for example:",[154,369,374],{"className":370,"code":372,"language":373,"meta":159},[371],"language-text","migrations\u002F\n├── 001-create-users-a82cdb26e5c1.json\n└── 002-add-user-age-4d79be92fe10.json\n","text",[141,375,372],{"__ignoreMap":159},[129,377,378,379,381,382,384,385,388],{},"When the directory is empty or does not exist, ",[141,380,143],{}," returns an\nempty array and ",[141,383,147],{}," returns ",[141,386,387],{},"EMPTY_SCHEMA_SNAPSHOT",". The same\nworkflow therefore handles the first migration without special branching.",[133,390,392],{"id":391},"generate-without-filesystem-helpers","Generate without filesystem helpers",[129,394,395],{},"Artifacts can also be managed by another storage layer or build tool. The\nfirst migration starts from an empty snapshot:",[154,397,399],{"className":156,"code":398,"language":158,"meta":159,"style":159},"import { writeFile } from 'node:fs\u002Fpromises'\nimport {\n  EMPTY_SCHEMA_SNAPSHOT,\n  serializeMigration\n} from '@opensya\u002Fpersistence\u002Fmigrations'\n\nconst migration = engine.migrations.generate({\n  name: 'create initial schema',\n  previous: EMPTY_SCHEMA_SNAPSHOT\n})\n\nawait writeFile(\n  `migrations\u002F${migration.id}.json`,\n  serializeMigration(migration)\n)\n",[141,400,401,423,429,436,441,453,457,479,494,503,509,513,522,551,559],{"__ignoreMap":159},[163,402,403,405,408,411,414,416,418,421],{"class":165,"line":166},[163,404,170],{"class":169},[163,406,407],{"class":173}," {",[163,409,410],{"class":180}," writeFile",[163,412,413],{"class":173}," }",[163,415,207],{"class":169},[163,417,210],{"class":173},[163,419,420],{"class":213},"node:fs\u002Fpromises",[163,422,217],{"class":173},[163,424,425,427],{"class":165,"line":177},[163,426,170],{"class":169},[163,428,174],{"class":173},[163,430,431,434],{"class":165,"line":187},[163,432,433],{"class":180},"  EMPTY_SCHEMA_SNAPSHOT",[163,435,184],{"class":173},[163,437,438],{"class":165,"line":195},[163,439,440],{"class":180},"  serializeMigration\n",[163,442,443,445,447,449,451],{"class":165,"line":201},[163,444,204],{"class":173},[163,446,207],{"class":169},[163,448,210],{"class":173},[163,450,214],{"class":213},[163,452,217],{"class":173},[163,454,455],{"class":165,"line":220},[163,456,224],{"emptyLinePlaceholder":223},[163,458,459,461,463,465,467,469,471,473,475,477],{"class":165,"line":227},[163,460,231],{"class":230},[163,462,277],{"class":180},[163,464,237],{"class":173},[163,466,282],{"class":180},[163,468,285],{"class":173},[163,470,288],{"class":180},[163,472,285],{"class":173},[163,474,293],{"class":260},[163,476,296],{"class":180},[163,478,299],{"class":173},[163,480,481,483,485,487,490,492],{"class":165,"line":247},[163,482,306],{"class":305},[163,484,309],{"class":173},[163,486,210],{"class":173},[163,488,489],{"class":213},"create initial schema",[163,491,317],{"class":173},[163,493,184],{"class":173},[163,495,496,498,500],{"class":165,"line":267},[163,497,325],{"class":305},[163,499,309],{"class":173},[163,501,502],{"class":180}," EMPTY_SCHEMA_SNAPSHOT\n",[163,504,505,507],{"class":165,"line":272},[163,506,204],{"class":173},[163,508,341],{"class":180},[163,510,511],{"class":165,"line":302},[163,512,224],{"emptyLinePlaceholder":223},[163,514,515,517,519],{"class":165,"line":322},[163,516,352],{"class":169},[163,518,410],{"class":260},[163,520,521],{"class":180},"(\n",[163,523,524,527,530,533,536,538,541,543,546,549],{"class":165,"line":336},[163,525,526],{"class":173},"  `",[163,528,529],{"class":213},"migrations\u002F",[163,531,532],{"class":173},"${",[163,534,535],{"class":180},"migration",[163,537,285],{"class":173},[163,539,540],{"class":180},"id",[163,542,204],{"class":173},[163,544,545],{"class":213},".json",[163,547,548],{"class":173},"`",[163,550,184],{"class":173},[163,552,553,556],{"class":165,"line":344},[163,554,555],{"class":260},"  serializeMigration",[163,557,558],{"class":180},"(migration)\n",[163,560,561],{"class":165,"line":349},[163,562,341],{"class":180},[129,564,565,566,569],{},"For later migrations, pass the ",[141,567,568],{},"next"," snapshot from the last committed\nartifact:",[154,571,573],{"className":156,"code":572,"language":158,"meta":159,"style":159},"const migration = engine.migrations.generate({\n  name: 'add user status',\n  previous: migrations.at(-1)?.next ?? EMPTY_SCHEMA_SNAPSHOT\n})\n",[141,574,575,597,612,649],{"__ignoreMap":159},[163,576,577,579,581,583,585,587,589,591,593,595],{"class":165,"line":166},[163,578,231],{"class":230},[163,580,277],{"class":180},[163,582,237],{"class":173},[163,584,282],{"class":180},[163,586,285],{"class":173},[163,588,288],{"class":180},[163,590,285],{"class":173},[163,592,293],{"class":260},[163,594,296],{"class":180},[163,596,299],{"class":173},[163,598,599,601,603,605,608,610],{"class":165,"line":177},[163,600,306],{"class":305},[163,602,309],{"class":173},[163,604,210],{"class":173},[163,606,607],{"class":213},"add user status",[163,609,317],{"class":173},[163,611,184],{"class":173},[163,613,614,616,618,621,623,626,628,631,635,638,641,644,647],{"class":165,"line":187},[163,615,325],{"class":305},[163,617,309],{"class":173},[163,619,620],{"class":180}," migrations",[163,622,285],{"class":173},[163,624,625],{"class":260},"at",[163,627,296],{"class":180},[163,629,630],{"class":173},"-",[163,632,634],{"class":633},"sbssI","1",[163,636,637],{"class":180},")",[163,639,640],{"class":173},"?.",[163,642,643],{"class":180},"next ",[163,645,646],{"class":173},"??",[163,648,502],{"class":180},[163,650,651,653],{"class":165,"line":195},[163,652,204],{"class":173},[163,654,341],{"class":180},[129,656,657],{},"Snapshots contain only physical schema information. Validators, hooks, field\nvisibility and runtime function defaults are not converted into database DDL.",[133,659,661],{"id":660},"review-the-plan","Review the plan",[129,663,664],{},"Reload the committed artifacts and append a newly generated migration if it\nhas not been saved yet:",[154,666,668],{"className":156,"code":667,"language":158,"meta":159,"style":159},"const migrations = await loadMigrations('.\u002Fmigrations')\n",[141,669,670],{"__ignoreMap":159},[163,671,672,674,676,678,680,682,684,686,688,690],{"class":165,"line":166},[163,673,231],{"class":230},[163,675,252],{"class":180},[163,677,237],{"class":173},[163,679,257],{"class":169},[163,681,261],{"class":260},[163,683,296],{"class":180},[163,685,317],{"class":173},[163,687,242],{"class":213},[163,689,317],{"class":173},[163,691,341],{"class":180},[154,693,695],{"className":156,"code":694,"language":158,"meta":159,"style":159},"const plan = await engine.migrations.plan(migrations)\n\nfor (const migration of plan.migrations) {\n  console.log(migration.migrationId)\n  console.log(migration.statements)\n}\n",[141,696,697,721,725,750,771,790],{"__ignoreMap":159},[163,698,699,701,704,706,708,710,712,714,716,719],{"class":165,"line":166},[163,700,231],{"class":230},[163,702,703],{"class":180}," plan ",[163,705,237],{"class":173},[163,707,257],{"class":169},[163,709,282],{"class":180},[163,711,285],{"class":173},[163,713,288],{"class":180},[163,715,285],{"class":173},[163,717,718],{"class":260},"plan",[163,720,333],{"class":180},[163,722,723],{"class":165,"line":177},[163,724,224],{"emptyLinePlaceholder":223},[163,726,727,730,733,735,737,740,743,745,748],{"class":165,"line":187},[163,728,729],{"class":169},"for",[163,731,732],{"class":180}," (",[163,734,231],{"class":230},[163,736,277],{"class":180},[163,738,739],{"class":173},"of",[163,741,742],{"class":180}," plan",[163,744,285],{"class":173},[163,746,747],{"class":180},"migrations) ",[163,749,299],{"class":173},[163,751,752,755,757,760,762,764,766,769],{"class":165,"line":195},[163,753,754],{"class":180},"  console",[163,756,285],{"class":173},[163,758,759],{"class":260},"log",[163,761,296],{"class":305},[163,763,535],{"class":180},[163,765,285],{"class":173},[163,767,768],{"class":180},"migrationId",[163,770,341],{"class":305},[163,772,773,775,777,779,781,783,785,788],{"class":165,"line":201},[163,774,754],{"class":180},[163,776,285],{"class":173},[163,778,759],{"class":260},[163,780,296],{"class":305},[163,782,535],{"class":180},[163,784,285],{"class":173},[163,786,787],{"class":180},"statements",[163,789,341],{"class":305},[163,791,792],{"class":165,"line":220},[163,793,794],{"class":173},"}\n",[129,796,797,798,801,802,805,806,809],{},"Every logical operation is classified as ",[141,799,800],{},"safe",", ",[141,803,804],{},"destructive"," or\n",[141,807,808],{},"irreversible",". Adding a nullable column is safe; dropping a column or table is\nirreversible because Persistence cannot restore its data.",[129,811,812],{},"Use a dry run to obtain the complete physical plan without changing the\ndatabase:",[154,814,816],{"className":156,"code":815,"language":158,"meta":159,"style":159},"const result = await engine.migrations.apply(migrations, {\n  dryRun: true\n})\n",[141,817,818,847,858],{"__ignoreMap":159},[163,819,820,822,825,827,829,831,833,835,837,840,843,845],{"class":165,"line":166},[163,821,231],{"class":230},[163,823,824],{"class":180}," result ",[163,826,237],{"class":173},[163,828,257],{"class":169},[163,830,282],{"class":180},[163,832,285],{"class":173},[163,834,288],{"class":180},[163,836,285],{"class":173},[163,838,839],{"class":260},"apply",[163,841,842],{"class":180},"(migrations",[163,844,361],{"class":173},[163,846,174],{"class":173},[163,848,849,852,854],{"class":165,"line":177},[163,850,851],{"class":305},"  dryRun",[163,853,309],{"class":173},[163,855,857],{"class":856},"sfNiH"," true\n",[163,859,860,862],{"class":165,"line":187},[163,861,204],{"class":173},[163,863,341],{"class":180},[133,865,867],{"id":866},"apply-pending-migrations","Apply pending migrations",[154,869,871],{"className":156,"code":870,"language":158,"meta":159,"style":159},"const result = await engine.migrations.apply(migrations)\n\nconsole.log(result.applied)\nconsole.log(result.skipped)\n",[141,872,873,895,899,916],{"__ignoreMap":159},[163,874,875,877,879,881,883,885,887,889,891,893],{"class":165,"line":166},[163,876,231],{"class":230},[163,878,824],{"class":180},[163,880,237],{"class":173},[163,882,257],{"class":169},[163,884,282],{"class":180},[163,886,285],{"class":173},[163,888,288],{"class":180},[163,890,285],{"class":173},[163,892,839],{"class":260},[163,894,333],{"class":180},[163,896,897],{"class":165,"line":177},[163,898,224],{"emptyLinePlaceholder":223},[163,900,901,904,906,908,911,913],{"class":165,"line":187},[163,902,903],{"class":180},"console",[163,905,285],{"class":173},[163,907,759],{"class":260},[163,909,910],{"class":180},"(result",[163,912,285],{"class":173},[163,914,915],{"class":180},"applied)\n",[163,917,918,920,922,924,926,928],{"class":165,"line":195},[163,919,903],{"class":180},[163,921,285],{"class":173},[163,923,759],{"class":260},[163,925,910],{"class":180},[163,927,285],{"class":173},[163,929,930],{"class":180},"skipped)\n",[129,932,933],{},"Files must be passed in their numbered order. The loader already guarantees\nthat order. Applied migrations are skipped, so the complete list can be used\nfor every deployment.",[129,935,936],{},"Destructive plans are rejected unless they are explicitly approved after\nreview:",[154,938,940],{"className":156,"code":939,"language":158,"meta":159,"style":159},"await engine.migrations.apply(migrations, {\n  allowDestructive: true\n})\n",[141,941,942,962,971],{"__ignoreMap":159},[163,943,944,946,948,950,952,954,956,958,960],{"class":165,"line":166},[163,945,352],{"class":169},[163,947,282],{"class":180},[163,949,285],{"class":173},[163,951,288],{"class":180},[163,953,285],{"class":173},[163,955,839],{"class":260},[163,957,842],{"class":180},[163,959,361],{"class":173},[163,961,174],{"class":173},[163,963,964,967,969],{"class":165,"line":177},[163,965,966],{"class":305},"  allowDestructive",[163,968,309],{"class":173},[163,970,857],{"class":856},[163,972,973,975],{"class":165,"line":187},[163,974,204],{"class":173},[163,976,341],{"class":180},[133,978,980],{"id":979},"inspect-status","Inspect status",[154,982,984],{"className":156,"code":983,"language":158,"meta":159,"style":159},"const status = await engine.migrations.status(migrations)\n",[141,985,986],{"__ignoreMap":159},[163,987,988,990,993,995,997,999,1001,1003,1005,1008],{"class":165,"line":166},[163,989,231],{"class":230},[163,991,992],{"class":180}," status ",[163,994,237],{"class":173},[163,996,257],{"class":169},[163,998,282],{"class":180},[163,1000,285],{"class":173},[163,1002,288],{"class":180},[163,1004,285],{"class":173},[163,1006,1007],{"class":260},"status",[163,1009,333],{"class":180},[129,1011,1012,1015,1016,1019],{},[141,1013,1014],{},"PostgreAdapter"," records applied identifiers, checksums, timestamps, execution\ndurations and failed attempts in ",[141,1017,1018],{},"_opensya_migrations",". Reapplying the same\nartifact is idempotent. A failed artifact remains retryable with the same\nchecksum. Changing an artifact after an attempt causes a checksum error.",[133,1021,1023],{"id":1022},"deployment-rules","Deployment rules",[1025,1026,1027,1031,1037,1040,1043,1046,1049],"ul",{},[1028,1029,1030],"li",{},"Commit generated artifacts with the application code.",[1028,1032,1033,1034,1036],{},"Use ",[141,1035,151],{}," or another strategy that preserves an explicit order.",[1028,1038,1039],{},"Review the rendered plan before deployment.",[1028,1041,1042],{},"Never edit an applied migration; generate a corrective migration.",[1028,1044,1045],{},"Require explicit approval for destructive operations.",[1028,1047,1048],{},"Keep migration files in their original order.",[1028,1050,1051],{},"Do not run migrations automatically on every application startup.",[1053,1054,1055],"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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":159,"searchDepth":166,"depth":177,"links":1057},[1058,1059,1060,1061,1062,1063],{"id":135,"depth":177,"text":136},{"id":391,"depth":177,"text":392},{"id":660,"depth":177,"text":661},{"id":866,"depth":177,"text":867},{"id":979,"depth":177,"text":980},{"id":1022,"depth":177,"text":1023},"Generate, review and execute versioned database migrations from Persistence metadata.","md",null,{},{"icon":76},{"title":73,"description":1064},"snfjhsnLKZh3FmEgBtxtFDTy3CKQ2iTTJJEz-Nxkmy4",[1072,1074],{"title":68,"path":69,"stem":70,"description":1073,"icon":71,"children":-1},"Run ordered domain behavior around transactional mutations.",{"title":78,"path":79,"stem":80,"description":1075,"icon":81,"children":-1},"Prevent concurrent users from silently overwriting each other's changes.",1783964086972]