[{"data":1,"prerenderedAt":1693},["ShallowReactive",2],{"navigation":3,"\u002Frecipes\u002Ftesting\u002Fvitest":208,"\u002Frecipes\u002Ftesting\u002Fvitest-surround":1688},[4,98,175],{"title":5,"path":6,"stem":7,"children":8,"icon":97},"Guide","\u002Fguide","1.guide\u002F1.index",[9,12,17,22,46,61,79],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fguide\u002Finstallation","1.guide\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick start","\u002Fguide\u002Fquick-start","1.guide\u002F3.quick-start","i-lucide-rocket",{"title":23,"path":24,"stem":25,"children":26,"icon":45},"Server","\u002Fguide\u002Fserver","1.guide\u002F4.server\u002F1.index",[27,30,35,40],{"title":28,"path":24,"stem":25,"icon":29},"Usage","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Config file","\u002Fguide\u002Fserver\u002Fconfig-file","1.guide\u002F4.server\u002F2.config-file","i-lucide-file-cog",{"title":36,"path":37,"stem":38,"icon":39},"Options","\u002Fguide\u002Fserver\u002Foptions","1.guide\u002F4.server\u002F3.options","i-lucide-settings",{"title":41,"path":42,"stem":43,"icon":44},"Advanced","\u002Fguide\u002Fserver\u002Fadvanced","1.guide\u002F4.server\u002F4.advanced","i-lucide-flask-conical",false,{"title":47,"path":48,"stem":49,"children":50,"icon":45},"Client","\u002Fguide\u002Fclient","1.guide\u002F5.client\u002F1.index",[51,53,58],{"title":28,"path":48,"stem":49,"icon":52},"i-lucide-monitor-smartphone",{"title":54,"path":55,"stem":56,"icon":57},"Live queries","\u002Fguide\u002Fclient\u002Flive-queries","1.guide\u002F5.client\u002F2.live-queries","i-lucide-radio",{"title":41,"path":59,"stem":60,"icon":44},"\u002Fguide\u002Fclient\u002Fadvanced","1.guide\u002F5.client\u002F3.advanced",{"title":62,"path":63,"stem":64,"children":65,"icon":45},"Development socket","\u002Fguide\u002Fsocket","1.guide\u002F6.socket\u002F1.index",[66,68,71,74],{"title":28,"path":63,"stem":64,"icon":67},"i-lucide-plug",{"title":36,"path":69,"stem":70,"icon":39},"\u002Fguide\u002Fsocket\u002Foptions","1.guide\u002F6.socket\u002F2.options",{"title":41,"path":72,"stem":73,"icon":44},"\u002Fguide\u002Fsocket\u002Fadvanced","1.guide\u002F6.socket\u002F3.advanced",{"title":75,"path":76,"stem":77,"icon":78},"PGlite in dev, Postgres in prod","\u002Fguide\u002Fsocket\u002Fdevelopment-only","1.guide\u002F6.socket\u002F4.development-only","i-lucide-cloud-upload",{"title":80,"path":81,"stem":82,"children":83,"icon":45},"DevTools & tooling","\u002Fguide\u002Fdevtools","1.guide\u002F7.devtools\u002F1.index",[84,87,92],{"title":85,"path":81,"stem":82,"icon":86},"DevTools tab","i-lucide-wrench",{"title":88,"path":89,"stem":90,"icon":91},"Actions","\u002Fguide\u002Fdevtools\u002Factions","1.guide\u002F7.devtools\u002F2.actions","i-lucide-zap",{"title":93,"path":94,"stem":95,"icon":96},"Terminal","\u002Fguide\u002Fdevtools\u002Fterminal","1.guide\u002F7.devtools\u002F3.terminal","i-lucide-square-terminal","i-lucide-book-open",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":45},"Recipes","i-lucide-chef-hat","\u002Frecipes","2.recipes",[104,116,138,159,171],{"title":105,"path":106,"stem":107,"children":108,"icon":45},"Migrations","\u002Frecipes\u002Fmigrations","2.recipes\u002F1.migrations\u002F1.index",[109,111],{"title":28,"path":106,"stem":107,"icon":110},"i-lucide-database-backup",{"title":112,"path":113,"stem":114,"icon":115},"Edited migrations","\u002Frecipes\u002Fmigrations\u002Fedited-migrations","2.recipes\u002F1.migrations\u002F2.edited-migrations","i-lucide-file-diff",{"title":117,"path":118,"stem":119,"children":120,"icon":45},"Testing","\u002Frecipes\u002Ftesting","2.recipes\u002F2.testing\u002F1.index",[121,123,128,133],{"title":28,"path":118,"stem":119,"icon":122},"i-lucide-test-tube",{"title":124,"path":125,"stem":126,"icon":127},"Isolation","\u002Frecipes\u002Ftesting\u002Fisolation","2.recipes\u002F2.testing\u002F2.isolation","i-lucide-git-fork",{"title":129,"path":130,"stem":131,"icon":132},"vitest","\u002Frecipes\u002Ftesting\u002Fvitest","2.recipes\u002F2.testing\u002F3.vitest","i-simple-icons-vitest",{"title":134,"path":135,"stem":136,"icon":137},"@nuxt\u002Ftest-utils","\u002Frecipes\u002Ftesting\u002Fnuxt-test-utils","2.recipes\u002F2.testing\u002F4.nuxt-test-utils","i-simple-icons-nuxt",{"title":139,"path":140,"stem":141,"children":142,"icon":45},"Deploy","\u002Frecipes\u002Fdeploy","2.recipes\u002F3.deploy\u002F1.index",[143,144,149,154],{"title":139,"path":140,"stem":141},{"title":145,"path":146,"stem":147,"icon":148},"Any Postgres","\u002Frecipes\u002Fdeploy\u002Fpostgres","2.recipes\u002F3.deploy\u002F2.postgres","i-lucide-database",{"title":150,"path":151,"stem":152,"icon":153},"Netlify","\u002Frecipes\u002Fdeploy\u002Fnetlify","2.recipes\u002F3.deploy\u002F3.netlify","i-simple-icons-netlify",{"title":155,"path":156,"stem":157,"icon":158},"Neon","\u002Frecipes\u002Fdeploy\u002Fneon","2.recipes\u002F3.deploy\u002F4.neon","i-simple-icons-neon",{"title":160,"path":161,"stem":162,"children":163,"icon":45},"Outside Nuxt","\u002Frecipes\u002Foutside-nuxt","2.recipes\u002F4.outside-nuxt\u002F1.index",[164,167],{"title":165,"path":161,"stem":162,"icon":166},"Config and provider","i-lucide-package",{"title":168,"path":169,"stem":170,"icon":67},"Socket server","\u002Frecipes\u002Foutside-nuxt\u002Fsocket","2.recipes\u002F4.outside-nuxt\u002F2.socket",{"title":172,"path":173,"stem":174,"icon":67},"Nitro's useDatabase","\u002Frecipes\u002Fnitro-database","2.recipes\u002F5.nitro-database",{"title":176,"icon":177,"path":178,"stem":179,"children":180,"page":45},"Reference","i-lucide-code-xml","\u002Freference","3.reference",[181,185,189,193,198,203],{"title":182,"path":183,"stem":184,"icon":34},"Config files","\u002Freference\u002Fconfig-files","3.reference\u002F1.config-files",{"title":186,"path":187,"stem":188,"icon":39},"Module options","\u002Freference\u002Fmodule-options","3.reference\u002F2.module-options",{"title":190,"path":191,"stem":192,"icon":67},"Socket options","\u002Freference\u002Fsocket-options","3.reference\u002F3.socket-options",{"title":194,"path":195,"stem":196,"icon":197},"Exports","\u002Freference\u002Fexports","3.reference\u002F4.exports","i-lucide-boxes",{"title":199,"path":200,"stem":201,"icon":202},"Hooks","\u002Freference\u002Fhooks","3.reference\u002F5.hooks","i-lucide-anchor",{"title":204,"path":205,"stem":206,"icon":207},"Environment","\u002Freference\u002Fenvironment","3.reference\u002F6.environment","i-lucide-variable",{"id":209,"title":129,"body":210,"description":1681,"extension":1682,"links":1683,"meta":1684,"navigation":1685,"path":130,"seo":1686,"stem":131,"__hash__":1687},"docs\u002F2.recipes\u002F2.testing\u002F3.vitest.md",{"type":211,"value":212,"toc":1675},"minimark",[213,230,679,692,697,704,708,722,1359,1375,1378,1382,1415,1498,1504,1508,1528,1665,1671],[214,215,216,217,221,222,225,226,229],"p",{},"vitest runs test files in worker processes, so a database created in one file is not visible to the others. ",[218,219,220],"code",{},"nuxt-pglite\u002Ftesting\u002Fvitest"," turns ",[218,223,224],{},"createTestDatabase"," into a ",[218,227,228],{},"globalSetup"," file instead: one database for the whole run, created in the main process before the workers start, served over the socket and closed once the run ends.",[231,232,234,239,336,362,366,452,456,478,670],"steps",{"level":233},"3",[235,236,238],"h3",{"id":237},"write-the-setup-file","Write the setup file",[240,241,247],"pre",{"className":242,"code":243,"filename":244,"language":245,"meta":246,"style":246},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { definePGliteGlobalSetup } from 'nuxt-pglite\u002Ftesting\u002Fvitest'\n\nexport default definePGliteGlobalSetup({\n  config: 'server\u002Fpglite.config',\n})\n","test\u002Fpglite.setup.ts","ts","",[218,248,249,281,288,306,327],{"__ignoreMap":246},[250,251,254,258,262,266,269,272,275,278],"span",{"class":252,"line":253},"line",1,[250,255,257],{"class":256},"s7zQu","import",[250,259,261],{"class":260},"sMK4o"," {",[250,263,265],{"class":264},"sTEyZ"," definePGliteGlobalSetup",[250,267,268],{"class":260}," }",[250,270,271],{"class":256}," from",[250,273,274],{"class":260}," '",[250,276,220],{"class":277},"sfazB",[250,279,280],{"class":260},"'\n",[250,282,284],{"class":252,"line":283},2,[250,285,287],{"emptyLinePlaceholder":286},true,"\n",[250,289,291,294,297,300,303],{"class":252,"line":290},3,[250,292,293],{"class":256},"export",[250,295,296],{"class":256}," default",[250,298,265],{"class":299},"s2Zo4",[250,301,302],{"class":264},"(",[250,304,305],{"class":260},"{\n",[250,307,309,313,316,318,321,324],{"class":252,"line":308},4,[250,310,312],{"class":311},"swJcz","  config",[250,314,315],{"class":260},":",[250,317,274],{"class":260},[250,319,320],{"class":277},"server\u002Fpglite.config",[250,322,323],{"class":260},"'",[250,325,326],{"class":260},",\n",[250,328,330,333],{"class":252,"line":329},5,[250,331,332],{"class":260},"}",[250,334,335],{"class":264},")\n",[214,337,338,341,342,349,350,353,354,357,358,361],{},[218,339,340],{},"definePGliteGlobalSetup"," takes the ",[343,344,346,347],"a",{"href":345},"\u002Frecipes\u002Ftesting#options","options of ",[218,348,224],{},", except that the socket cannot be turned off: the workers reach the database through it only. ",[218,351,352],{},"socket"," is ",[218,355,356],{},"true"," (a free loopback port) by default, or the ",[343,359,360],{"href":69},"socket options",".",[235,363,365],{"id":364},"list-it-in-the-vitest-config","List it in the vitest config",[240,367,370],{"className":242,"code":368,"filename":369,"language":245,"meta":246,"style":246},"import { defineConfig } from 'vitest\u002Fconfig'\n\nexport default defineConfig({\n  test: {\n    globalSetup: ['test\u002Fpglite.setup.ts'],\n  },\n})\n","vitest.config.ts",[218,371,372,392,396,408,418,439,445],{"__ignoreMap":246},[250,373,374,376,378,381,383,385,387,390],{"class":252,"line":253},[250,375,257],{"class":256},[250,377,261],{"class":260},[250,379,380],{"class":264}," defineConfig",[250,382,268],{"class":260},[250,384,271],{"class":256},[250,386,274],{"class":260},[250,388,389],{"class":277},"vitest\u002Fconfig",[250,391,280],{"class":260},[250,393,394],{"class":252,"line":283},[250,395,287],{"emptyLinePlaceholder":286},[250,397,398,400,402,404,406],{"class":252,"line":290},[250,399,293],{"class":256},[250,401,296],{"class":256},[250,403,380],{"class":299},[250,405,302],{"class":264},[250,407,305],{"class":260},[250,409,410,413,415],{"class":252,"line":308},[250,411,412],{"class":311},"  test",[250,414,315],{"class":260},[250,416,417],{"class":260}," {\n",[250,419,420,423,425,428,430,432,434,437],{"class":252,"line":329},[250,421,422],{"class":311},"    globalSetup",[250,424,315],{"class":260},[250,426,427],{"class":264}," [",[250,429,323],{"class":260},[250,431,244],{"class":277},[250,433,323],{"class":260},[250,435,436],{"class":264},"]",[250,438,326],{"class":260},[250,440,442],{"class":252,"line":441},6,[250,443,444],{"class":260},"  },\n",[250,446,448,450],{"class":252,"line":447},7,[250,449,332],{"class":260},[250,451,335],{"class":264},[235,453,455],{"id":454},"reach-it-from-the-tests","Reach it from the tests",[214,457,458,459,462,463,466,467,470,471,474,475,315],{},"The variables are set on ",[218,460,461],{},"process.env"," before the workers are spawned, so the workers inherit them: code reading ",[218,464,465],{},"DATABASE_URL"," reaches the test database unchanged. The database is also provided as ",[218,468,469],{},"pglite",", with its ",[218,472,473],{},"url"," and ",[218,476,477],{},"env",[240,479,482],{"className":242,"code":480,"filename":481,"language":245,"meta":246,"style":246},"import pg from 'pg'\nimport { inject, it } from 'vitest'\n\nconst { url } = inject('pglite')\n\nit('connects', async () => {\n  const client = new pg.Client({ connectionString: url })\n  await client.connect()\n  \u002F\u002F ...\n  await client.end()\n})\n","test\u002Ftodos.test.ts",[218,483,484,501,526,530,558,562,589,626,642,649,663],{"__ignoreMap":246},[250,485,486,488,491,494,496,499],{"class":252,"line":253},[250,487,257],{"class":256},[250,489,490],{"class":264}," pg ",[250,492,493],{"class":256},"from",[250,495,274],{"class":260},[250,497,498],{"class":277},"pg",[250,500,280],{"class":260},[250,502,503,505,507,510,513,516,518,520,522,524],{"class":252,"line":283},[250,504,257],{"class":256},[250,506,261],{"class":260},[250,508,509],{"class":264}," inject",[250,511,512],{"class":260},",",[250,514,515],{"class":264}," it",[250,517,268],{"class":260},[250,519,271],{"class":256},[250,521,274],{"class":260},[250,523,129],{"class":277},[250,525,280],{"class":260},[250,527,528],{"class":252,"line":290},[250,529,287],{"emptyLinePlaceholder":286},[250,531,532,536,538,541,543,546,548,550,552,554,556],{"class":252,"line":308},[250,533,535],{"class":534},"spNyl","const",[250,537,261],{"class":260},[250,539,540],{"class":264}," url ",[250,542,332],{"class":260},[250,544,545],{"class":260}," =",[250,547,509],{"class":299},[250,549,302],{"class":264},[250,551,323],{"class":260},[250,553,469],{"class":277},[250,555,323],{"class":260},[250,557,335],{"class":264},[250,559,560],{"class":252,"line":329},[250,561,287],{"emptyLinePlaceholder":286},[250,563,564,567,569,571,574,576,578,581,584,587],{"class":252,"line":441},[250,565,566],{"class":299},"it",[250,568,302],{"class":264},[250,570,323],{"class":260},[250,572,573],{"class":277},"connects",[250,575,323],{"class":260},[250,577,512],{"class":260},[250,579,580],{"class":534}," async",[250,582,583],{"class":260}," ()",[250,585,586],{"class":534}," =>",[250,588,417],{"class":260},[250,590,591,594,597,599,602,605,607,609,611,614,617,619,622,624],{"class":252,"line":447},[250,592,593],{"class":534},"  const",[250,595,596],{"class":264}," client",[250,598,545],{"class":260},[250,600,601],{"class":260}," new",[250,603,604],{"class":264}," pg",[250,606,361],{"class":260},[250,608,47],{"class":299},[250,610,302],{"class":311},[250,612,613],{"class":260},"{",[250,615,616],{"class":311}," connectionString",[250,618,315],{"class":260},[250,620,621],{"class":264}," url",[250,623,268],{"class":260},[250,625,335],{"class":311},[250,627,629,632,634,636,639],{"class":252,"line":628},8,[250,630,631],{"class":256},"  await",[250,633,596],{"class":264},[250,635,361],{"class":260},[250,637,638],{"class":299},"connect",[250,640,641],{"class":311},"()\n",[250,643,645],{"class":252,"line":644},9,[250,646,648],{"class":647},"sHwdD","  \u002F\u002F ...\n",[250,650,652,654,656,658,661],{"class":252,"line":651},10,[250,653,631],{"class":256},[250,655,596],{"class":264},[250,657,361],{"class":260},[250,659,660],{"class":299},"end",[250,662,641],{"class":311},[250,664,666,668],{"class":252,"line":665},11,[250,667,332],{"class":260},[250,669,335],{"class":264},[214,671,672,675,676,678],{},[218,673,674],{},"inject('pglite')"," is typed by ",[218,677,220],{},", as long as the setup file is part of your TypeScript project.",[214,680,681,682,684,685,688,689,691],{},"As with ",[218,683,224],{},", each variable is only set while still unset, and ",[218,686,687],{},"exportEnv: false"," sets none: the workers then reach the database through ",[218,690,674],{}," alone.",[693,694,696],"h2",{"id":695},"one-database-for-the-run","One database for the run",[214,698,699,700,703],{},"Every worker talks to the same database. Tests that write to it should either run one file at a time (",[218,701,702],{},"fileParallelism: false"," in the vitest config) or clean up after themselves.",[693,705,707],{"id":706},"a-database-per-file-forked-per-test","A database per file, forked per test",[214,709,710,713,714,717,718,721],{},[218,711,712],{},"fork()"," is a method of the ",[218,715,716],{},"TestDatabase"," object, which for the global database lives in the main process: the workers only get its URL, so they cannot fork it. When tests need isolation, create the database in the test file instead, and ",[343,719,720],{"href":125},"fork it"," per test:",[240,723,725],{"className":242,"code":724,"filename":481,"language":245,"meta":246,"style":246},"import pg from 'pg'\nimport { afterAll, afterEach, beforeAll, beforeEach, expect, it } from 'vitest'\nimport { createTestDatabase } from 'nuxt-pglite\u002Ftesting'\nimport type { TestDatabase } from 'nuxt-pglite\u002Ftesting'\n\nlet db: TestDatabase\nlet fork: TestDatabase\n\nbeforeAll(async () => {\n  db = await createTestDatabase({ config: 'server\u002Fpglite.config' }) \u002F\u002F `init` runs once, here\n})\nbeforeEach(async () => {\n  fork = await db.fork({ socket: true }) \u002F\u002F a copy of `db`, with a URL of its own\n})\nafterEach(() => fork.close())\nafterAll(() => db.close())\n\nit('writes through PGlite', async () => {\n  await fork.pg.query('INSERT INTO todos (title) VALUES ($1)', ['first'])\n  const { rows } = await fork.pg.query('SELECT title FROM todos')\n  expect(rows).toEqual([{ title: 'first' }])\n})\n\nit('starts from the migrated schema again, over the wire', async () => {\n  const client = new pg.Client({ connectionString: fork.url })\n  await client.connect()\n  try {\n    const { rows } = await client.query('SELECT count(*)::int AS total FROM todos')\n    expect(rows).toEqual([{ total: 0 }])\n  } finally {\n    await client.end()\n  }\n})\n",[218,726,727,741,784,804,826,830,844,855,859,875,910,916,932,969,976,999,1019,1024,1048,1087,1124,1163,1170,1175,1199,1234,1247,1255,1288,1321,1332,1346,1352],{"__ignoreMap":246},[250,728,729,731,733,735,737,739],{"class":252,"line":253},[250,730,257],{"class":256},[250,732,490],{"class":264},[250,734,493],{"class":256},[250,736,274],{"class":260},[250,738,498],{"class":277},[250,740,280],{"class":260},[250,742,743,745,747,750,752,755,757,760,762,765,767,770,772,774,776,778,780,782],{"class":252,"line":283},[250,744,257],{"class":256},[250,746,261],{"class":260},[250,748,749],{"class":264}," afterAll",[250,751,512],{"class":260},[250,753,754],{"class":264}," afterEach",[250,756,512],{"class":260},[250,758,759],{"class":264}," beforeAll",[250,761,512],{"class":260},[250,763,764],{"class":264}," beforeEach",[250,766,512],{"class":260},[250,768,769],{"class":264}," expect",[250,771,512],{"class":260},[250,773,515],{"class":264},[250,775,268],{"class":260},[250,777,271],{"class":256},[250,779,274],{"class":260},[250,781,129],{"class":277},[250,783,280],{"class":260},[250,785,786,788,790,793,795,797,799,802],{"class":252,"line":290},[250,787,257],{"class":256},[250,789,261],{"class":260},[250,791,792],{"class":264}," createTestDatabase",[250,794,268],{"class":260},[250,796,271],{"class":256},[250,798,274],{"class":260},[250,800,801],{"class":277},"nuxt-pglite\u002Ftesting",[250,803,280],{"class":260},[250,805,806,808,811,813,816,818,820,822,824],{"class":252,"line":308},[250,807,257],{"class":256},[250,809,810],{"class":256}," type",[250,812,261],{"class":260},[250,814,815],{"class":264}," TestDatabase",[250,817,268],{"class":260},[250,819,271],{"class":256},[250,821,274],{"class":260},[250,823,801],{"class":277},[250,825,280],{"class":260},[250,827,828],{"class":252,"line":329},[250,829,287],{"emptyLinePlaceholder":286},[250,831,832,835,838,840],{"class":252,"line":441},[250,833,834],{"class":534},"let",[250,836,837],{"class":264}," db",[250,839,315],{"class":260},[250,841,843],{"class":842},"sBMFI"," TestDatabase\n",[250,845,846,848,851,853],{"class":252,"line":447},[250,847,834],{"class":534},[250,849,850],{"class":264}," fork",[250,852,315],{"class":260},[250,854,843],{"class":842},[250,856,857],{"class":252,"line":628},[250,858,287],{"emptyLinePlaceholder":286},[250,860,861,864,866,869,871,873],{"class":252,"line":644},[250,862,863],{"class":299},"beforeAll",[250,865,302],{"class":264},[250,867,868],{"class":534},"async",[250,870,583],{"class":260},[250,872,586],{"class":534},[250,874,417],{"class":260},[250,876,877,880,882,885,887,889,891,894,896,898,900,902,904,907],{"class":252,"line":651},[250,878,879],{"class":264},"  db",[250,881,545],{"class":260},[250,883,884],{"class":256}," await",[250,886,792],{"class":299},[250,888,302],{"class":311},[250,890,613],{"class":260},[250,892,893],{"class":311}," config",[250,895,315],{"class":260},[250,897,274],{"class":260},[250,899,320],{"class":277},[250,901,323],{"class":260},[250,903,268],{"class":260},[250,905,906],{"class":311},") ",[250,908,909],{"class":647},"\u002F\u002F `init` runs once, here\n",[250,911,912,914],{"class":252,"line":665},[250,913,332],{"class":260},[250,915,335],{"class":264},[250,917,919,922,924,926,928,930],{"class":252,"line":918},12,[250,920,921],{"class":299},"beforeEach",[250,923,302],{"class":264},[250,925,868],{"class":534},[250,927,583],{"class":260},[250,929,586],{"class":534},[250,931,417],{"class":260},[250,933,935,938,940,942,944,946,949,951,953,956,958,962,964,966],{"class":252,"line":934},13,[250,936,937],{"class":264},"  fork",[250,939,545],{"class":260},[250,941,884],{"class":256},[250,943,837],{"class":264},[250,945,361],{"class":260},[250,947,948],{"class":299},"fork",[250,950,302],{"class":311},[250,952,613],{"class":260},[250,954,955],{"class":311}," socket",[250,957,315],{"class":260},[250,959,961],{"class":960},"sfNiH"," true",[250,963,268],{"class":260},[250,965,906],{"class":311},[250,967,968],{"class":647},"\u002F\u002F a copy of `db`, with a URL of its own\n",[250,970,972,974],{"class":252,"line":971},14,[250,973,332],{"class":260},[250,975,335],{"class":264},[250,977,979,982,984,987,989,991,993,996],{"class":252,"line":978},15,[250,980,981],{"class":299},"afterEach",[250,983,302],{"class":264},[250,985,986],{"class":260},"()",[250,988,586],{"class":534},[250,990,850],{"class":264},[250,992,361],{"class":260},[250,994,995],{"class":299},"close",[250,997,998],{"class":264},"())\n",[250,1000,1002,1005,1007,1009,1011,1013,1015,1017],{"class":252,"line":1001},16,[250,1003,1004],{"class":299},"afterAll",[250,1006,302],{"class":264},[250,1008,986],{"class":260},[250,1010,586],{"class":534},[250,1012,837],{"class":264},[250,1014,361],{"class":260},[250,1016,995],{"class":299},[250,1018,998],{"class":264},[250,1020,1022],{"class":252,"line":1021},17,[250,1023,287],{"emptyLinePlaceholder":286},[250,1025,1027,1029,1031,1033,1036,1038,1040,1042,1044,1046],{"class":252,"line":1026},18,[250,1028,566],{"class":299},[250,1030,302],{"class":264},[250,1032,323],{"class":260},[250,1034,1035],{"class":277},"writes through PGlite",[250,1037,323],{"class":260},[250,1039,512],{"class":260},[250,1041,580],{"class":534},[250,1043,583],{"class":260},[250,1045,586],{"class":534},[250,1047,417],{"class":260},[250,1049,1051,1053,1055,1057,1059,1061,1064,1066,1068,1071,1073,1075,1077,1079,1082,1084],{"class":252,"line":1050},19,[250,1052,631],{"class":256},[250,1054,850],{"class":264},[250,1056,361],{"class":260},[250,1058,498],{"class":264},[250,1060,361],{"class":260},[250,1062,1063],{"class":299},"query",[250,1065,302],{"class":311},[250,1067,323],{"class":260},[250,1069,1070],{"class":277},"INSERT INTO todos (title) VALUES ($1)",[250,1072,323],{"class":260},[250,1074,512],{"class":260},[250,1076,427],{"class":311},[250,1078,323],{"class":260},[250,1080,1081],{"class":277},"first",[250,1083,323],{"class":260},[250,1085,1086],{"class":311},"])\n",[250,1088,1090,1092,1094,1097,1099,1101,1103,1105,1107,1109,1111,1113,1115,1117,1120,1122],{"class":252,"line":1089},20,[250,1091,593],{"class":534},[250,1093,261],{"class":260},[250,1095,1096],{"class":264}," rows",[250,1098,268],{"class":260},[250,1100,545],{"class":260},[250,1102,884],{"class":256},[250,1104,850],{"class":264},[250,1106,361],{"class":260},[250,1108,498],{"class":264},[250,1110,361],{"class":260},[250,1112,1063],{"class":299},[250,1114,302],{"class":311},[250,1116,323],{"class":260},[250,1118,1119],{"class":277},"SELECT title FROM todos",[250,1121,323],{"class":260},[250,1123,335],{"class":311},[250,1125,1127,1130,1132,1135,1138,1140,1143,1146,1148,1151,1153,1155,1157,1159,1161],{"class":252,"line":1126},21,[250,1128,1129],{"class":299},"  expect",[250,1131,302],{"class":311},[250,1133,1134],{"class":264},"rows",[250,1136,1137],{"class":311},")",[250,1139,361],{"class":260},[250,1141,1142],{"class":299},"toEqual",[250,1144,1145],{"class":311},"([",[250,1147,613],{"class":260},[250,1149,1150],{"class":311}," title",[250,1152,315],{"class":260},[250,1154,274],{"class":260},[250,1156,1081],{"class":277},[250,1158,323],{"class":260},[250,1160,268],{"class":260},[250,1162,1086],{"class":311},[250,1164,1166,1168],{"class":252,"line":1165},22,[250,1167,332],{"class":260},[250,1169,335],{"class":264},[250,1171,1173],{"class":252,"line":1172},23,[250,1174,287],{"emptyLinePlaceholder":286},[250,1176,1178,1180,1182,1184,1187,1189,1191,1193,1195,1197],{"class":252,"line":1177},24,[250,1179,566],{"class":299},[250,1181,302],{"class":264},[250,1183,323],{"class":260},[250,1185,1186],{"class":277},"starts from the migrated schema again, over the wire",[250,1188,323],{"class":260},[250,1190,512],{"class":260},[250,1192,580],{"class":534},[250,1194,583],{"class":260},[250,1196,586],{"class":534},[250,1198,417],{"class":260},[250,1200,1202,1204,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232],{"class":252,"line":1201},25,[250,1203,593],{"class":534},[250,1205,596],{"class":264},[250,1207,545],{"class":260},[250,1209,601],{"class":260},[250,1211,604],{"class":264},[250,1213,361],{"class":260},[250,1215,47],{"class":299},[250,1217,302],{"class":311},[250,1219,613],{"class":260},[250,1221,616],{"class":311},[250,1223,315],{"class":260},[250,1225,850],{"class":264},[250,1227,361],{"class":260},[250,1229,473],{"class":264},[250,1231,268],{"class":260},[250,1233,335],{"class":311},[250,1235,1237,1239,1241,1243,1245],{"class":252,"line":1236},26,[250,1238,631],{"class":256},[250,1240,596],{"class":264},[250,1242,361],{"class":260},[250,1244,638],{"class":299},[250,1246,641],{"class":311},[250,1248,1250,1253],{"class":252,"line":1249},27,[250,1251,1252],{"class":256},"  try",[250,1254,417],{"class":260},[250,1256,1258,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1284,1286],{"class":252,"line":1257},28,[250,1259,1260],{"class":534},"    const",[250,1262,261],{"class":260},[250,1264,1096],{"class":264},[250,1266,268],{"class":260},[250,1268,545],{"class":260},[250,1270,884],{"class":256},[250,1272,596],{"class":264},[250,1274,361],{"class":260},[250,1276,1063],{"class":299},[250,1278,302],{"class":311},[250,1280,323],{"class":260},[250,1282,1283],{"class":277},"SELECT count(*)::int AS total FROM todos",[250,1285,323],{"class":260},[250,1287,335],{"class":311},[250,1289,1291,1294,1296,1298,1300,1302,1304,1306,1308,1311,1313,1317,1319],{"class":252,"line":1290},29,[250,1292,1293],{"class":299},"    expect",[250,1295,302],{"class":311},[250,1297,1134],{"class":264},[250,1299,1137],{"class":311},[250,1301,361],{"class":260},[250,1303,1142],{"class":299},[250,1305,1145],{"class":311},[250,1307,613],{"class":260},[250,1309,1310],{"class":311}," total",[250,1312,315],{"class":260},[250,1314,1316],{"class":1315},"sbssI"," 0",[250,1318,268],{"class":260},[250,1320,1086],{"class":311},[250,1322,1324,1327,1330],{"class":252,"line":1323},30,[250,1325,1326],{"class":260},"  }",[250,1328,1329],{"class":256}," finally",[250,1331,417],{"class":260},[250,1333,1335,1338,1340,1342,1344],{"class":252,"line":1334},31,[250,1336,1337],{"class":256},"    await",[250,1339,596],{"class":264},[250,1341,361],{"class":260},[250,1343,660],{"class":299},[250,1345,641],{"class":311},[250,1347,1349],{"class":252,"line":1348},32,[250,1350,1351],{"class":260},"  }\n",[250,1353,1355,1357],{"class":252,"line":1354},33,[250,1356,332],{"class":260},[250,1358,335],{"class":264},[214,1360,1361,1362,1365,1366,1368,1369,1371,1372,1374],{},"Each file builds its database once, ",[218,1363,1364],{},"init"," and migrations included, and each test gets a fresh copy, so the files can run in parallel and no test sees another's writes. A fork never sets ",[218,1367,461],{},": hand its ",[218,1370,473],{}," (or its ",[218,1373,477],{},") to the code under test.",[214,1376,1377],{},"Prefer the shared global database when the tests only read, or when building the database per file costs more than the run can afford; prefer a database per file, forked per test, when tests write and must not depend on each other's order.",[693,1379,1381],{"id":1380},"provider-variables","Provider variables",[214,1383,1384,1385,1389,1390,1393,1394,474,1397,1400,1401,1404,1405,1408,1409,1411,1412,315],{},"Code written for a host's own variables reaches the test database with the same ",[343,1386,1388],{"href":1387},"\u002Fguide\u002Fsocket#provider-presets","preset"," as the development socket. With ",[218,1391,1392],{},"provider: 'netlify'",", the workers get ",[218,1395,1396],{},"NETLIFY_DB_URL",[218,1398,1399],{},"NETLIFY_DB_DRIVER=server",", so ",[218,1402,1403],{},"drizzle()"," from ",[218,1406,1407],{},"drizzle-orm\u002Fnetlify-db",", called with no connection, uses ",[218,1410,498],{}," against the socket as it does in ",[218,1413,1414],{},"nuxt dev",[240,1416,1418],{"className":242,"code":1417,"filename":244,"language":245,"meta":246,"style":246},"import { definePGliteGlobalSetup } from 'nuxt-pglite\u002Ftesting\u002Fvitest'\n\nexport default definePGliteGlobalSetup({\n  config: 'server\u002Fpglite.config',\n  socket: { provider: 'netlify' },\n})\n",[218,1419,1420,1438,1442,1454,1468,1492],{"__ignoreMap":246},[250,1421,1422,1424,1426,1428,1430,1432,1434,1436],{"class":252,"line":253},[250,1423,257],{"class":256},[250,1425,261],{"class":260},[250,1427,265],{"class":264},[250,1429,268],{"class":260},[250,1431,271],{"class":256},[250,1433,274],{"class":260},[250,1435,220],{"class":277},[250,1437,280],{"class":260},[250,1439,1440],{"class":252,"line":283},[250,1441,287],{"emptyLinePlaceholder":286},[250,1443,1444,1446,1448,1450,1452],{"class":252,"line":290},[250,1445,293],{"class":256},[250,1447,296],{"class":256},[250,1449,265],{"class":299},[250,1451,302],{"class":264},[250,1453,305],{"class":260},[250,1455,1456,1458,1460,1462,1464,1466],{"class":252,"line":308},[250,1457,312],{"class":311},[250,1459,315],{"class":260},[250,1461,274],{"class":260},[250,1463,320],{"class":277},[250,1465,323],{"class":260},[250,1467,326],{"class":260},[250,1469,1470,1473,1475,1477,1480,1482,1484,1487,1489],{"class":252,"line":329},[250,1471,1472],{"class":311},"  socket",[250,1474,315],{"class":260},[250,1476,261],{"class":260},[250,1478,1479],{"class":311}," provider",[250,1481,315],{"class":260},[250,1483,274],{"class":260},[250,1485,1486],{"class":277},"netlify",[250,1488,323],{"class":260},[250,1490,1491],{"class":260}," },\n",[250,1493,1494,1496],{"class":252,"line":441},[250,1495,332],{"class":260},[250,1497,335],{"class":264},[214,1499,1500,1501,1503],{},"See ",[343,1502,150],{"href":151}," for the app side.",[693,1505,1507],{"id":1506},"aliases","Aliases",[214,1509,1510,1511,1514,1515,1518,1519,1522,1523,315],{},"The setup file runs outside Nuxt, where the app's aliases are not defined. A config file importing through ",[218,1512,1513],{},"#pglite\u002Fmigrations"," (or ",[218,1516,1517],{},"~~",", or another module's alias) needs them passed as ",[218,1520,1521],{},"alias",", as with ",[343,1524,1526],{"href":1525},"\u002Frecipes\u002Ftesting#config-files",[218,1527,224],{},[240,1529,1531],{"className":242,"code":1530,"filename":244,"language":245,"meta":246,"style":246},"import { fileURLToPath } from 'node:url'\n\nimport { definePGliteGlobalSetup } from 'nuxt-pglite\u002Ftesting\u002Fvitest'\n\nexport default definePGliteGlobalSetup({\n  config: 'server\u002Fpglite.config',\n  alias: {\n    '#pglite\u002Fmigrations': fileURLToPath(import.meta.resolve('nuxt-pglite\u002Fmigrations')),\n  },\n})\n",[218,1532,1533,1553,1557,1575,1579,1591,1605,1614,1655,1659],{"__ignoreMap":246},[250,1534,1535,1537,1539,1542,1544,1546,1548,1551],{"class":252,"line":253},[250,1536,257],{"class":256},[250,1538,261],{"class":260},[250,1540,1541],{"class":264}," fileURLToPath",[250,1543,268],{"class":260},[250,1545,271],{"class":256},[250,1547,274],{"class":260},[250,1549,1550],{"class":277},"node:url",[250,1552,280],{"class":260},[250,1554,1555],{"class":252,"line":283},[250,1556,287],{"emptyLinePlaceholder":286},[250,1558,1559,1561,1563,1565,1567,1569,1571,1573],{"class":252,"line":290},[250,1560,257],{"class":256},[250,1562,261],{"class":260},[250,1564,265],{"class":264},[250,1566,268],{"class":260},[250,1568,271],{"class":256},[250,1570,274],{"class":260},[250,1572,220],{"class":277},[250,1574,280],{"class":260},[250,1576,1577],{"class":252,"line":308},[250,1578,287],{"emptyLinePlaceholder":286},[250,1580,1581,1583,1585,1587,1589],{"class":252,"line":329},[250,1582,293],{"class":256},[250,1584,296],{"class":256},[250,1586,265],{"class":299},[250,1588,302],{"class":264},[250,1590,305],{"class":260},[250,1592,1593,1595,1597,1599,1601,1603],{"class":252,"line":441},[250,1594,312],{"class":311},[250,1596,315],{"class":260},[250,1598,274],{"class":260},[250,1600,320],{"class":277},[250,1602,323],{"class":260},[250,1604,326],{"class":260},[250,1606,1607,1610,1612],{"class":252,"line":447},[250,1608,1609],{"class":311},"  alias",[250,1611,315],{"class":260},[250,1613,417],{"class":260},[250,1615,1616,1619,1621,1623,1625,1627,1629,1631,1633,1636,1638,1641,1643,1645,1648,1650,1653],{"class":252,"line":628},[250,1617,1618],{"class":260},"    '",[250,1620,1513],{"class":311},[250,1622,323],{"class":260},[250,1624,315],{"class":260},[250,1626,1541],{"class":299},[250,1628,302],{"class":264},[250,1630,257],{"class":256},[250,1632,361],{"class":260},[250,1634,1635],{"class":264},"meta",[250,1637,361],{"class":260},[250,1639,1640],{"class":299},"resolve",[250,1642,302],{"class":264},[250,1644,323],{"class":260},[250,1646,1647],{"class":277},"nuxt-pglite\u002Fmigrations",[250,1649,323],{"class":260},[250,1651,1652],{"class":264},"))",[250,1654,326],{"class":260},[250,1656,1657],{"class":252,"line":644},[250,1658,444],{"class":260},[250,1660,1661,1663],{"class":252,"line":651},[250,1662,332],{"class":260},[250,1664,335],{"class":264},[214,1666,1667,1668,1670],{},"Or import from ",[218,1669,1647],{}," in the config file, which resolves in both places.",[1672,1673,1674],"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":246,"searchDepth":253,"depth":283,"links":1676},[1677,1678,1679,1680],{"id":695,"depth":283,"text":696},{"id":706,"depth":283,"text":707},{"id":1380,"depth":283,"text":1381},{"id":1506,"depth":283,"text":1507},"One database for the whole run, created in a globalSetup file before the workers start, and reached by them through the socket.","md",null,{},{"icon":132},{"title":129,"description":1681},"GQXcc2CFiYoiCWm8D8A1QZomYPWvxSAehcnjw10G1sM",[1689,1691],{"title":124,"path":125,"stem":126,"description":1690,"icon":127,"children":-1},"Seed once, then fork the database per test, so each starts from the same data and none sees another's writes.",{"title":134,"path":135,"stem":136,"description":1692,"icon":137,"children":-1},"Boot the built app against a test database in an end-to-end suite, with the variables handed to setup().",1791474261492]