[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-navigation":3,"docs-page-database":166},[4,38,57,65,114,138,157],{"id":5,"group":6,"pages":7},"get-started","Get started",[8,13,18,23,28,33],{"path":9,"title":10,"description":11,"navTitle":10,"group":6,"order":12},"\u002Fdocs\u002Fgetting-started","Getting started","Create your app from the kit, run it locally with no credentials, make yourself superadmin and find where your own code goes.",1,{"path":14,"title":15,"description":16,"navTitle":15,"group":6,"order":17},"\u002Fdocs\u002Flayout","Project structure","Where code lives by where it runs, and which server\u002F directories turn a new file into a route, a job or a provider.",2,{"path":19,"title":20,"description":21,"navTitle":20,"group":6,"order":22},"\u002Fdocs\u002Fconfiguration","Configuration","starter.config.ts switches each part of the kit and its providers, environment variables hold the secrets: every key and what it changes.",3,{"path":24,"title":25,"description":26,"navTitle":25,"group":6,"order":27},"\u002Fdocs\u002Ftemplate","Updating from the kit","Keep the kit as a git remote and take each update as one commit you review, with pnpm template:update, then resolve what conflicts.",4,{"path":29,"title":30,"description":31,"navTitle":30,"group":6,"order":32},"\u002Fdocs\u002Fdeployment","Deployment","Ship the app as one Cloudflare Worker: create the resources, set the secrets, deploy main from GitHub Actions or your machine.",5,{"path":34,"title":35,"description":36,"navTitle":35,"group":6,"order":37},"\u002Fdocs\u002Fmcp","MCP server","Connect Claude Code, Cursor or VS Code to https:\u002F\u002Fnuxter.app\u002Fmcp, so your agent searches and reads these docs and their design notes.",6,{"id":39,"group":40,"pages":41},"accounts","Accounts",[42,47,52],{"path":43,"title":44,"description":45,"navTitle":44,"group":40,"order":46},"\u002Fdocs\u002Fauth","Auth","Pick the sign-in methods, add an OAuth provider, protect a route, and handle sessions, second factors and account deletion.",7,{"path":48,"title":49,"description":50,"navTitle":49,"group":40,"order":51},"\u002Fdocs\u002Ftenancy","Organizations","Scope routes and pages to an organization, and work with its members, roles, seats, invitations and a second level such as branches.",8,{"path":53,"title":54,"description":55,"navTitle":54,"group":40,"order":56},"\u002Fdocs\u002Fpermissions","Roles and permissions","Routes check permissions that an account’s role or its organization’s plan grants: checking one, adding a role, and the staff tools.",9,{"id":58,"group":59,"pages":60},"payments","Payments",[61],{"path":62,"title":59,"description":63,"navTitle":59,"group":59,"order":64},"\u002Fdocs\u002Fpayments","Sell plans through Stripe, Polar, Lemon Squeezy or Creem: define plans, connect a provider, gate features, trials, coupons and refunds.",10,{"id":66,"group":67,"pages":68},"building-blocks","Building blocks",[69,74,79,84,89,94,99,104,109],{"path":70,"title":71,"description":72,"navTitle":71,"group":67,"order":73},"\u002Fdocs\u002Fdatabase","Database","Postgres through Drizzle, on Hyperdrive in production and PGlite locally: add a table, query, transactions, migrations and seed data.",11,{"path":75,"title":76,"description":77,"navTitle":76,"group":67,"order":78},"\u002Fdocs\u002Fbackground-jobs","Background jobs","Run work after the response on Cloudflare Queues with retries: add and enqueue a job, run jobs locally, and schedule cron tasks.",12,{"path":80,"title":81,"description":82,"navTitle":81,"group":67,"order":83},"\u002Fdocs\u002Fevents","Events","React to what the kit does by adding a file to server\u002Flisteners\u002F, fire events of your own, and look up every event’s payload.",13,{"path":85,"title":86,"description":87,"navTitle":86,"group":67,"order":88},"\u002Fdocs\u002Femail","Email","Set up sending, send your own mail with deliverEmail, change the templates and wording, handle unsubscribes and add a provider.",14,{"path":90,"title":91,"description":92,"navTitle":91,"group":67,"order":93},"\u002Fdocs\u002Fcontact","Contact","A \u002Fcontact page that mails you a message or shows your address after a Turnstile check: choose the channels, set the address, know the limits.",15,{"path":95,"title":96,"description":97,"navTitle":96,"group":67,"order":98},"\u002Fdocs\u002Fnotifications","Notifications","The dashboard bell: add a notification type, send one with notify(), and how categories, opt-outs and retention apply.",16,{"path":100,"title":101,"description":102,"navTitle":101,"group":67,"order":103},"\u002Fdocs\u002Fstorage","Storage","Uploads in R2 with one policy per purpose: add a purpose, accept an upload, replace or delete a file, and serve it to its owner.",17,{"path":105,"title":106,"description":107,"navTitle":106,"group":67,"order":108},"\u002Fdocs\u002Ffeature-flags","Feature flags","Declare typed flags in starter.config.ts, read them with flag() or useFlag(), roll them out by rule or percentage, and add a provider.",18,{"path":110,"title":111,"description":112,"navTitle":111,"group":67,"order":113},"\u002Fdocs\u002Fai","AI","Call models from server code by role: text, images, speech, transcription, embeddings and video, with provider fallbacks.",19,{"id":115,"group":116,"pages":117},"web","Web",[118,123,128,133],{"path":119,"title":120,"description":121,"navTitle":120,"group":116,"order":122},"\u002Fdocs\u002Fsecurity-headers","Security headers","The Content-Security-Policy and hardening headers on every response: allow another origin, keep tokens out of Referer, accept cross-site posts.",20,{"path":124,"title":125,"description":126,"navTitle":125,"group":116,"order":127},"\u002Fdocs\u002Frate-limiting","Rate limiting","Cap how often a caller hits a route with requireRateLimit, count only failures, space out sends, and protect the zone.",21,{"path":129,"title":130,"description":131,"navTitle":130,"group":116,"order":132},"\u002Fdocs\u002Fanalytics","Analytics","Product analytics and ad conversions sent from the server with no browser script: add an event, connect a provider, and handle consent.",22,{"path":134,"title":135,"description":136,"navTitle":135,"group":116,"order":137},"\u002Fdocs\u002Fobservability","Observability","Find a failed request by its id, send faults to Sentry or Better Stack, report an error you caught, and change the error page.",23,{"id":139,"group":140,"pages":141},"content-and-look","Content and look",[142,147,152],{"path":143,"title":144,"description":145,"navTitle":144,"group":140,"order":146},"\u002Fdocs\u002Fblog","Blog","Markdown posts with an RSS feed per language, and workflows that draft posts with an AI model and open each one as a pull request.",24,{"path":148,"title":149,"description":150,"navTitle":149,"group":140,"order":151},"\u002Fdocs\u002Flanguages","Languages","Add or remove a language, write copy in the locale files, and write code, refusals and links that follow the reader’s language.",25,{"path":153,"title":154,"description":155,"navTitle":154,"group":140,"order":156},"\u002Fdocs\u002Ftheme","Theme","Change the brand colour and font, and build dashboard sections, list pages, loading placeholders and charts that match the kit.",26,{"id":158,"group":159,"pages":160},"quality","Quality",[161],{"path":162,"title":163,"description":164,"navTitle":163,"group":159,"order":165},"\u002Fdocs\u002Ftesting","Testing","Unit tests in Node, component tests in a real Nuxt app and Playwright end to end: test a route or a component, and what CI runs.",27,{"page":167,"surround":1859,"linksToKit":461},{"path":70,"title":71,"description":72,"navTitle":71,"group":67,"seo":168,"body":170},{"title":169,"description":72},"Postgres in Nuxt: Drizzle, Hyperdrive and PGlite",{"type":171,"value":172,"toc":1847},"minimark",[173,177,181,186,259,263,300,321,333,349,374,377,408,420,426,430,436,706,724,739,807,811,816,977,1046,1089,1093,1096,1127,1130,1335,1344,1351,1355,1432,1438,1452,1463,1467,1525,1550,1568,1572,1575,1619,1632,1635,1767,1771,1843],[174,175,71],"h1",{"id":176},"database",[178,179,180],"p",{},"The app's data lives in Postgres and is queried through Drizzle. The Worker\nreaches it through Cloudflare Hyperdrive, and on your machine it is PGlite,\nPostgres compiled to WebAssembly, so you need no database server. You work here\nwhen you add tables, write queries or ship a migration.",[182,183,185],"h2",{"id":184},"how-it-works","How it works",[187,188,189,213,227,252],"ol",{},[190,191,192,196,197,200,201,204,205,208,209,212],"li",{},[193,194,195],"code",{},"useDrizzle(event)"," returns a Drizzle client over the ",[193,198,199],{},"pg"," driver.\n",[193,202,203],{},"useDrizzle",", ",[193,206,207],{},"tables"," and the common query helpers are auto-imported in\n",[193,210,211],{},"server\u002F",".",[190,214,215,216,219,220,223,224,212],{},"On the Worker it opens a pool of up to five connections per request to the\n",[193,217,218],{},"HYPERDRIVE"," binding and closes it after the response. Under ",[193,221,222],{},"pnpm dev","\nthere is one pool for the whole process, to ",[193,225,226],{},"DATABASE_URL",[190,228,229,230,240,241,248,249,251],{},"The template's tables are in\n",[231,232,237],"a",{"href":233,"rel":234,"title":236},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Fdatabase\u002Fschema.ts",[235],"nofollow","Licensees only",[193,238,239],{},"server\u002Fdatabase\u002Fschema.ts",", yours in\n",[231,242,245],{"href":243,"rel":244,"title":236},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Fdatabase\u002Fcustom\u002Fschema.ts",[235],[193,246,247],{},"server\u002Fdatabase\u002Fcustom\u002Fschema.ts",",\nand ",[193,250,207],{}," holds both.",[190,253,254,255,258],{},"Each file has its own migration chain. ",[193,256,257],{},"pnpm db:migrate"," applies both, the\ntemplate's first.",[182,260,262],{"id":261},"locally","Locally",[178,264,265,267,268,271,272,275,276,278,279,282,283,285,286,289,290,293,294,296,297,299],{},[193,266,222],{}," opens a PGlite database in ",[193,269,270],{},".data\u002Fpglite",", applies pending\nmigrations, and serves it on ",[193,273,274],{},"127.0.0.1:5432"," with ",[193,277,226],{}," pointing at\nit. If something else holds 5432, such as another project's dev server, PGlite\ntakes the next free port up to 5441 and the dev server logs which one. When\n5432 to 5441 are all taken, the dev server stops. While it runs, it keeps\nPGlite's URL in ",[193,280,281],{},".data\u002Fpglite-server.json",", where ",[193,284,257],{},",\n",[193,287,288],{},"pnpm db:seed"," and ",[193,291,292],{},"pnpm db:studio"," read it. With the dev server stopped, the\nscripts open ",[193,295,270],{}," directly, except ",[193,298,292],{},", which needs the\ndev server running.",[178,301,302,303,305,306,308,309,312,313,316,317,320],{},"Each project's data stays in its own ",[193,304,270],{},", so several kit projects\ncan run ",[193,307,222],{}," at once and the port never changes which data you see. For\n",[193,310,311],{},"psql"," or another client that needs a fixed address, set ",[193,314,315],{},"NUXT_DEV_PGLITE_PORT","\nin ",[193,318,319],{},".env",". The dev server then tries only that port and stops if it is taken,\nso pick one outside 5432 to 5441, where an unpinned project can land first.",[178,322,323,324,326,327,329,330,332],{},"To use a real Postgres, such as a container or a branch of production, set\n",[193,325,226],{}," in ",[193,328,319],{},". The dev server then starts no PGlite and migrates\nnothing, so run ",[193,331,257],{}," yourself. It warns at startup when that host\nisn't your machine.",[178,334,335,338,339,342,343,345,346,348],{},[193,336,337],{},"pnpm preview"," runs the built Worker under ",[193,340,341],{},"wrangler dev",". It reaches the\ndatabase through the Hyperdrive binding and ignores ",[193,344,226],{},". It needs a\nreal Postgres with a password in its URL, set in ",[193,347,319],{},":",[350,351,356],"pre",{"className":352,"code":353,"language":354,"meta":355,"style":355},"language-sh shiki shiki-themes github-light github-light github-dark","CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE=postgres:\u002F\u002Fpostgres:postgres@127.0.0.1:5450\u002Fpostgres\n","sh","",[193,357,358],{"__ignoreMap":355},[359,360,362,366,370],"span",{"class":361,"line":12},"line",[359,363,365],{"class":364},"sxrX7","CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE",[359,367,369],{"class":368},"s8jYJ","=",[359,371,373],{"class":372},"sIIMD","postgres:\u002F\u002Fpostgres:postgres@127.0.0.1:5450\u002Fpostgres\n",[178,375,376],{},"Migrate that database, then start the preview:",[350,378,382],{"className":379,"code":380,"language":381,"meta":355,"style":355},"language-bash shiki shiki-themes github-light github-light github-dark","DATABASE_URL=postgres:\u002F\u002Fpostgres:postgres@127.0.0.1:5450\u002Fpostgres pnpm db:migrate\npnpm preview\n","bash",[193,383,384,400],{"__ignoreMap":355},[359,385,386,388,390,393,397],{"class":361,"line":12},[359,387,226],{"class":364},[359,389,369],{"class":368},[359,391,392],{"class":372},"postgres:\u002F\u002Fpostgres:postgres@127.0.0.1:5450\u002Fpostgres",[359,394,396],{"class":395},"snPdu"," pnpm",[359,398,399],{"class":372}," db:migrate\n",[359,401,402,405],{"class":361,"line":17},[359,403,404],{"class":395},"pnpm",[359,406,407],{"class":372}," preview\n",[178,409,410,411,285,414,416,417,419],{},"Without that variable it uses the binding's ",[193,412,413],{},"localConnectionString",[193,415,274],{},", which is usually a dev server's PGlite, this project's or\nanother's. Before building, ",[193,418,337],{}," refuses PGlite, a URL with no\npassword, and an address where nothing answers.",[178,421,422,423,425],{},"Tests skip the socket. Each test file opens its own PGlite from a migrated copy\nand truncates every table before each test (",[231,424,163],{"href":162},").",[182,427,429],{"id":428},"add-a-table","Add a table",[178,431,432,433,435],{},"Put it in ",[193,434,247],{},", which ships empty. Import a\ntemplate table to reference it:",[350,437,441],{"className":438,"code":439,"language":440,"meta":355,"style":355},"language-ts shiki shiki-themes github-light github-light github-dark","import { index, integer, pgTable, text, timestamp } from 'drizzle-orm\u002Fpg-core'\n\nimport { organizations } from '..\u002Fschema'\n\nexport const menus = pgTable(\n  'menus',\n  {\n    id: integer('id').primaryKey().generatedByDefaultAsIdentity(),\n    orgId: integer('org_id')\n      .notNull()\n      .references(() => organizations.id, { onDelete: 'cascade' }),\n    title: text('title').notNull(),\n    createdAt: timestamp('created_at', { withTimezone: true })\n      .notNull()\n      .$defaultFn(() => new Date()),\n  },\n  (table) => [\n    index('menus_org_created_idx').on(table.orgId, table.createdAt, table.id),\n  ],\n)\n","ts",[193,442,443,457,463,475,479,500,507,512,540,555,566,588,607,629,637,657,662,679,697,702],{"__ignoreMap":355},[359,444,445,448,451,454],{"class":361,"line":12},[359,446,447],{"class":368},"import",[359,449,450],{"class":364}," { index, integer, pgTable, text, timestamp } ",[359,452,453],{"class":368},"from",[359,455,456],{"class":372}," 'drizzle-orm\u002Fpg-core'\n",[359,458,459],{"class":361,"line":17},[359,460,462],{"emptyLinePlaceholder":461},true,"\n",[359,464,465,467,470,472],{"class":361,"line":22},[359,466,447],{"class":368},[359,468,469],{"class":364}," { organizations } ",[359,471,453],{"class":368},[359,473,474],{"class":372}," '..\u002Fschema'\n",[359,476,477],{"class":361,"line":27},[359,478,462],{"emptyLinePlaceholder":461},[359,480,481,484,487,491,494,497],{"class":361,"line":32},[359,482,483],{"class":368},"export",[359,485,486],{"class":368}," const",[359,488,490],{"class":489},"sBjJW"," menus",[359,492,493],{"class":368}," =",[359,495,496],{"class":395}," pgTable",[359,498,499],{"class":364},"(\n",[359,501,502,505],{"class":361,"line":37},[359,503,504],{"class":372},"  'menus'",[359,506,285],{"class":364},[359,508,509],{"class":361,"line":46},[359,510,511],{"class":364},"  {\n",[359,513,514,517,520,523,526,528,531,534,537],{"class":361,"line":51},[359,515,516],{"class":364},"    id: ",[359,518,519],{"class":395},"integer",[359,521,522],{"class":364},"(",[359,524,525],{"class":372},"'id'",[359,527,425],{"class":364},[359,529,530],{"class":395},"primaryKey",[359,532,533],{"class":364},"().",[359,535,536],{"class":395},"generatedByDefaultAsIdentity",[359,538,539],{"class":364},"(),\n",[359,541,542,545,547,549,552],{"class":361,"line":56},[359,543,544],{"class":364},"    orgId: ",[359,546,519],{"class":395},[359,548,522],{"class":364},[359,550,551],{"class":372},"'org_id'",[359,553,554],{"class":364},")\n",[359,556,557,560,563],{"class":361,"line":64},[359,558,559],{"class":364},"      .",[359,561,562],{"class":395},"notNull",[359,564,565],{"class":364},"()\n",[359,567,568,570,573,576,579,582,585],{"class":361,"line":73},[359,569,559],{"class":364},[359,571,572],{"class":395},"references",[359,574,575],{"class":364},"(() ",[359,577,578],{"class":368},"=>",[359,580,581],{"class":364}," organizations.id, { onDelete: ",[359,583,584],{"class":372},"'cascade'",[359,586,587],{"class":364}," }),\n",[359,589,590,593,596,598,601,603,605],{"class":361,"line":78},[359,591,592],{"class":364},"    title: ",[359,594,595],{"class":395},"text",[359,597,522],{"class":364},[359,599,600],{"class":372},"'title'",[359,602,425],{"class":364},[359,604,562],{"class":395},[359,606,539],{"class":364},[359,608,609,612,615,617,620,623,626],{"class":361,"line":83},[359,610,611],{"class":364},"    createdAt: ",[359,613,614],{"class":395},"timestamp",[359,616,522],{"class":364},[359,618,619],{"class":372},"'created_at'",[359,621,622],{"class":364},", { withTimezone: ",[359,624,625],{"class":489},"true",[359,627,628],{"class":364}," })\n",[359,630,631,633,635],{"class":361,"line":88},[359,632,559],{"class":364},[359,634,562],{"class":395},[359,636,565],{"class":364},[359,638,639,641,644,646,648,651,654],{"class":361,"line":93},[359,640,559],{"class":364},[359,642,643],{"class":395},"$defaultFn",[359,645,575],{"class":364},[359,647,578],{"class":368},[359,649,650],{"class":368}," new",[359,652,653],{"class":395}," Date",[359,655,656],{"class":364},"()),\n",[359,658,659],{"class":361,"line":98},[359,660,661],{"class":364},"  },\n",[359,663,664,667,671,674,676],{"class":361,"line":103},[359,665,666],{"class":364},"  (",[359,668,670],{"class":669},"sP4rz","table",[359,672,673],{"class":364},") ",[359,675,578],{"class":368},[359,677,678],{"class":364}," [\n",[359,680,681,684,686,689,691,694],{"class":361,"line":108},[359,682,683],{"class":395},"    index",[359,685,522],{"class":364},[359,687,688],{"class":372},"'menus_org_created_idx'",[359,690,425],{"class":364},[359,692,693],{"class":395},"on",[359,695,696],{"class":364},"(table.orgId, table.createdAt, table.id),\n",[359,698,699],{"class":361,"line":113},[359,700,701],{"class":364},"  ],\n",[359,703,704],{"class":361,"line":122},[359,705,554],{"class":364},[350,707,709],{"className":379,"code":708,"language":381,"meta":355,"style":355},"pnpm db:generate\npnpm db:migrate\n",[193,710,711,718],{"__ignoreMap":355},[359,712,713,715],{"class":361,"line":12},[359,714,404],{"class":395},[359,716,717],{"class":372}," db:generate\n",[359,719,720,722],{"class":361,"line":17},[359,721,404],{"class":395},[359,723,399],{"class":372},[178,725,726,727,730,731,734,735,738],{},"The migration lands in ",[193,728,729],{},"server\u002Fdatabase\u002Fmigrations\u002Fcustom\u002F",", and ",[193,732,733],{},"tables.menus","\nworks wherever ",[193,736,737],{},"tables.users"," does.",[740,741,742,761,768,781],"ul",{},[190,743,744,745,748,749,752,753,756,757,760],{},"To store more about a template row, add a table of your own keyed by its id,\nsuch as ",[193,746,747],{},"user_profiles"," whose primary key ",[193,750,751],{},"user_id"," references ",[193,754,755],{},"users.id",". A\ncolumn added to ",[193,758,759],{},"schema.ts"," belongs to the template's chain, and the next kit\nupdate forks it.",[190,762,763,764,767],{},"Import template tables, never re-export them from ",[193,765,766],{},"custom\u002Fschema.ts",", or\ndrizzle-kit creates them a second time.",[190,769,770,771,773,774,777,778,212],{},"Only ",[193,772,766],{}," is read. If you split your tables across files in\n",[193,775,776],{},"custom\u002F",", re-export each from it: ",[193,779,780],{},"export * from '.\u002Fmenus'",[190,782,783,784,787,788,795,796,799,800,803,804,806],{},"PGlite loads only the extensions in ",[193,785,786],{},"PGLITE_EXTENSIONS"," in\n",[231,789,792],{"href":790,"rel":791,"title":236},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fscripts\u002Fdb\u002Flib\u002Flocal-postgres.mjs",[235],[193,793,794],{},"scripts\u002Fdb\u002Flib\u002Flocal-postgres.mjs",",\nwhich is ",[193,797,798],{},"pg_trgm",". A ",[193,801,802],{},"create extension"," of your own, such as pgvector, fails\nin ",[193,805,222],{}," and in tests until you add it there.",[182,808,810],{"id":809},"query","Query",[178,812,813,348],{},[193,814,815],{},"server\u002Fapi\u002Fmenus\u002F[org].get.ts",[350,817,819],{"className":438,"code":818,"language":440,"meta":355,"style":355},"import { requireOrgScope } from '#server\u002Ftenancy\u002Fscope'\n\nexport default defineEventHandler(async (event) => {\n  const scope = await requireOrgScope(event, getRouterParam(event, 'org') ?? '')\n\n  return useDrizzle(event)\n    .select({ id: tables.menus.id, title: tables.menus.title })\n    .from(tables.menus)\n    .where(eq(tables.menus.orgId, scope.orgId))\n    .orderBy(desc(tables.menus.createdAt), desc(tables.menus.id))\n})\n",[193,820,821,833,837,865,902,906,917,928,937,952,972],{"__ignoreMap":355},[359,822,823,825,828,830],{"class":361,"line":12},[359,824,447],{"class":368},[359,826,827],{"class":364}," { requireOrgScope } ",[359,829,453],{"class":368},[359,831,832],{"class":372}," '#server\u002Ftenancy\u002Fscope'\n",[359,834,835],{"class":361,"line":17},[359,836,462],{"emptyLinePlaceholder":461},[359,838,839,841,844,847,849,852,855,858,860,862],{"class":361,"line":22},[359,840,483],{"class":368},[359,842,843],{"class":368}," default",[359,845,846],{"class":395}," defineEventHandler",[359,848,522],{"class":364},[359,850,851],{"class":368},"async",[359,853,854],{"class":364}," (",[359,856,857],{"class":669},"event",[359,859,673],{"class":364},[359,861,578],{"class":368},[359,863,864],{"class":364}," {\n",[359,866,867,870,873,875,878,881,884,887,889,892,894,897,900],{"class":361,"line":27},[359,868,869],{"class":368},"  const",[359,871,872],{"class":489}," scope",[359,874,493],{"class":368},[359,876,877],{"class":368}," await",[359,879,880],{"class":395}," requireOrgScope",[359,882,883],{"class":364},"(event, ",[359,885,886],{"class":395},"getRouterParam",[359,888,883],{"class":364},[359,890,891],{"class":372},"'org'",[359,893,673],{"class":364},[359,895,896],{"class":368},"??",[359,898,899],{"class":372}," ''",[359,901,554],{"class":364},[359,903,904],{"class":361,"line":32},[359,905,462],{"emptyLinePlaceholder":461},[359,907,908,911,914],{"class":361,"line":37},[359,909,910],{"class":368},"  return",[359,912,913],{"class":395}," useDrizzle",[359,915,916],{"class":364},"(event)\n",[359,918,919,922,925],{"class":361,"line":46},[359,920,921],{"class":364},"    .",[359,923,924],{"class":395},"select",[359,926,927],{"class":364},"({ id: tables.menus.id, title: tables.menus.title })\n",[359,929,930,932,934],{"class":361,"line":51},[359,931,921],{"class":364},[359,933,453],{"class":395},[359,935,936],{"class":364},"(tables.menus)\n",[359,938,939,941,944,946,949],{"class":361,"line":56},[359,940,921],{"class":364},[359,942,943],{"class":395},"where",[359,945,522],{"class":364},[359,947,948],{"class":395},"eq",[359,950,951],{"class":364},"(tables.menus.orgId, scope.orgId))\n",[359,953,954,956,959,961,964,967,969],{"class":361,"line":64},[359,955,921],{"class":364},[359,957,958],{"class":395},"orderBy",[359,960,522],{"class":364},[359,962,963],{"class":395},"desc",[359,965,966],{"class":364},"(tables.menus.createdAt), ",[359,968,963],{"class":395},[359,970,971],{"class":364},"(tables.menus.id))\n",[359,973,974],{"class":361,"line":73},[359,975,976],{"class":364},"})\n",[178,978,979,980,204,983,204,986,204,988,204,991,204,994,204,997,285,1000,204,1003,204,1006,204,1009,204,1012,204,1014,204,1017,285,1020,204,1023,289,1026,1029,1030,1033,1034,1037,1038,1041,1042,1045],{},"The auto-imported helpers are ",[193,981,982],{},"and",[193,984,985],{},"or",[193,987,948],{},[193,989,990],{},"ne",[193,992,993],{},"gte",[193,995,996],{},"lt",[193,998,999],{},"lte",[193,1001,1002],{},"inArray",[193,1004,1005],{},"notInArray",[193,1007,1008],{},"isNull",[193,1010,1011],{},"isNotNull",[193,1013,963],{},[193,1015,1016],{},"sql",[193,1018,1019],{},"count",[193,1021,1022],{},"countDistinct",[193,1024,1025],{},"max",[193,1027,1028],{},"sum",". Import anything else, such as ",[193,1031,1032],{},"asc"," or\n",[193,1035,1036],{},"ilike",", from ",[193,1039,1040],{},"drizzle-orm",". ",[193,1043,1044],{},"isUniqueConstraintError(error)"," is auto-imported\ntoo and spots a unique violation anywhere in the error's cause chain.",[178,1047,1048,1049,1051,1052,1055,1056,1059,1060,1063,1064,1067,1068,1070,1071,1074,1075,1078,1079,204,1082,289,1085,1088],{},"Postgres refuses an integer above 2,147,483,647 bound to an ",[193,1050,519],{}," column\nand any string holding U+0000, and the route answers 500. Validate ids with\n",[193,1053,1054],{},"rowIdSchema()"," or ",[193,1057,1058],{},"rowIdParamSchema()"," and stored text with\n",[193,1061,1062],{},"storableTextSchema()",", all from ",[193,1065,1066],{},"#shared\u002Fschemas\u002Fstorable",". For ",[193,1069,1036],{},"\nsearches, ",[193,1072,1073],{},"containing(term)"," from ",[193,1076,1077],{},"#server\u002Fdatabase\u002Ftext-search"," builds the\npattern with ",[193,1080,1081],{},"%",[193,1083,1084],{},"_",[193,1086,1087],{},"\\"," escaped.",[182,1090,1092],{"id":1091},"transactions","Transactions",[178,1094,1095],{},"Pick the shape from what the write depends on.",[740,1097,1098,1105,1120],{},[190,1099,1100,1101,1104],{},"Writes that only need to land together: Drizzle's own\n",[193,1102,1103],{},"db.transaction(async (tx) => …)",", at read committed, Postgres's default.",[190,1106,1107,1108,1111,1112,1115,1116,1119],{},"A write that depends on rows it reads, such as \"remove this owner if another\nremains\": ",[193,1109,1110],{},"serializable(db, async (tx) => …)"," from\n",[193,1113,1114],{},"#server\u002Fdatabase\u002Ftransaction",". Two of these racing can't both pass the\ncheck. Postgres aborts one, and ",[193,1117,1118],{},"serializable"," reruns the callback, up to five\nattempts, on a serialization failure or a deadlock.",[190,1121,1122,1123,1126],{},"Reads that must agree, such as a page and its total:\n",[193,1124,1125],{},"snapshot(db, async (tx) => …)",", one read-only transaction at repeatable read.",[178,1128,1129],{},"Deleting a menu only while the organization keeps another:",[350,1131,1133],{"className":438,"code":1132,"language":440,"meta":355,"style":355},"import { serializable } from '#server\u002Fdatabase\u002Ftransaction'\n\nawait serializable(useDrizzle(event), async (tx) => {\n  const [row] = await tx\n    .select({ total: count() })\n    .from(tables.menus)\n    .where(eq(tables.menus.orgId, orgId))\n\n  if ((row?.total ?? 0) \u003C= 1) {\n    throw createError({ statusCode: 409, statusMessage: 'Keep one menu.' })\n  }\n\n  await tx\n    .delete(tables.menus)\n    .where(and(eq(tables.menus.id, menuId), eq(tables.menus.orgId, orgId)))\n})\n",[193,1134,1135,1147,1151,1179,1199,1213,1221,1234,1238,1262,1284,1289,1293,1300,1309,1331],{"__ignoreMap":355},[359,1136,1137,1139,1142,1144],{"class":361,"line":12},[359,1138,447],{"class":368},[359,1140,1141],{"class":364}," { serializable } ",[359,1143,453],{"class":368},[359,1145,1146],{"class":372}," '#server\u002Fdatabase\u002Ftransaction'\n",[359,1148,1149],{"class":361,"line":17},[359,1150,462],{"emptyLinePlaceholder":461},[359,1152,1153,1156,1159,1161,1163,1166,1168,1170,1173,1175,1177],{"class":361,"line":22},[359,1154,1155],{"class":368},"await",[359,1157,1158],{"class":395}," serializable",[359,1160,522],{"class":364},[359,1162,203],{"class":395},[359,1164,1165],{"class":364},"(event), ",[359,1167,851],{"class":368},[359,1169,854],{"class":364},[359,1171,1172],{"class":669},"tx",[359,1174,673],{"class":364},[359,1176,578],{"class":368},[359,1178,864],{"class":364},[359,1180,1181,1183,1186,1189,1192,1194,1196],{"class":361,"line":27},[359,1182,869],{"class":368},[359,1184,1185],{"class":364}," [",[359,1187,1188],{"class":489},"row",[359,1190,1191],{"class":364},"] ",[359,1193,369],{"class":368},[359,1195,877],{"class":368},[359,1197,1198],{"class":364}," tx\n",[359,1200,1201,1203,1205,1208,1210],{"class":361,"line":32},[359,1202,921],{"class":364},[359,1204,924],{"class":395},[359,1206,1207],{"class":364},"({ total: ",[359,1209,1019],{"class":395},[359,1211,1212],{"class":364},"() })\n",[359,1214,1215,1217,1219],{"class":361,"line":37},[359,1216,921],{"class":364},[359,1218,453],{"class":395},[359,1220,936],{"class":364},[359,1222,1223,1225,1227,1229,1231],{"class":361,"line":46},[359,1224,921],{"class":364},[359,1226,943],{"class":395},[359,1228,522],{"class":364},[359,1230,948],{"class":395},[359,1232,1233],{"class":364},"(tables.menus.orgId, orgId))\n",[359,1235,1236],{"class":361,"line":51},[359,1237,462],{"emptyLinePlaceholder":461},[359,1239,1240,1243,1246,1248,1251,1253,1256,1259],{"class":361,"line":56},[359,1241,1242],{"class":368},"  if",[359,1244,1245],{"class":364}," ((row?.total ",[359,1247,896],{"class":368},[359,1249,1250],{"class":489}," 0",[359,1252,673],{"class":364},[359,1254,1255],{"class":368},"\u003C=",[359,1257,1258],{"class":489}," 1",[359,1260,1261],{"class":364},") {\n",[359,1263,1264,1267,1270,1273,1276,1279,1282],{"class":361,"line":64},[359,1265,1266],{"class":368},"    throw",[359,1268,1269],{"class":395}," createError",[359,1271,1272],{"class":364},"({ statusCode: ",[359,1274,1275],{"class":489},"409",[359,1277,1278],{"class":364},", statusMessage: ",[359,1280,1281],{"class":372},"'Keep one menu.'",[359,1283,628],{"class":364},[359,1285,1286],{"class":361,"line":73},[359,1287,1288],{"class":364},"  }\n",[359,1290,1291],{"class":361,"line":78},[359,1292,462],{"emptyLinePlaceholder":461},[359,1294,1295,1298],{"class":361,"line":83},[359,1296,1297],{"class":368},"  await",[359,1299,1198],{"class":364},[359,1301,1302,1304,1307],{"class":361,"line":88},[359,1303,921],{"class":364},[359,1305,1306],{"class":395},"delete",[359,1308,936],{"class":364},[359,1310,1311,1313,1315,1317,1319,1321,1323,1326,1328],{"class":361,"line":93},[359,1312,921],{"class":364},[359,1314,943],{"class":395},[359,1316,522],{"class":364},[359,1318,982],{"class":395},[359,1320,522],{"class":364},[359,1322,948],{"class":395},[359,1324,1325],{"class":364},"(tables.menus.id, menuId), ",[359,1327,948],{"class":395},[359,1329,1330],{"class":364},"(tables.menus.orgId, orgId)))\n",[359,1332,1333],{"class":361,"line":98},[359,1334,976],{"class":364},[178,1336,1337,1338,1340,1341,1343],{},"A ",[193,1339,1118],{}," callback can run more than once, so it touches nothing but\n",[193,1342,1172],{},". Record activity, emit events and send mail after it returns.",[178,1345,1346,1347,1350],{},"A compare-and-set on the row you write needs no transaction:\n",[193,1348,1349],{},"update … set consumed_at = now() where token_hash = $1 and consumed_at is null returning …","\ngives the row to exactly one of two racing requests.",[182,1352,1354],{"id":1353},"migrations","Migrations",[670,1356,1357,1370],{},[1358,1359,1360],"thead",{},[1361,1362,1363,1367],"tr",{},[1364,1365,1366],"th",{},"Command",[1364,1368,1369],{},"What it does",[1371,1372,1373,1389,1406,1422],"tbody",{},[1361,1374,1375,1381],{},[1376,1377,1378],"td",{},[193,1379,1380],{},"pnpm db:generate",[1376,1382,1383,1384,1386,1387],{},"Writes a migration for changes in ",[193,1385,766],{}," to ",[193,1388,729],{},[1361,1390,1391,1395],{},[1376,1392,1393],{},[193,1394,257],{},[1376,1396,1397,1398,1400,1401,1403,1404],{},"Applies both chains to the local database: ",[193,1399,226],{},", the PGlite ",[193,1402,222],{}," serves, or ",[193,1405,270],{},[1361,1407,1408,1413],{},[1376,1409,1410],{},[193,1411,1412],{},"pnpm db:migrate:remote",[1376,1414,1415,1416,1074,1418,1421],{},"Applies both chains to ",[193,1417,226],{},[193,1419,1420],{},".env.production"," or the shell",[1361,1423,1424,1429],{},[1376,1425,1426],{},[193,1427,1428],{},"pnpm db:generate:template",[1376,1430,1431],{},"The template's chain. Only the kit's own repository runs it",[178,1433,1434,1435,1437],{},"The deploy applies migrations before it uploads the Worker\n(",[231,1436,30],{"href":29},"). A migration that drops or narrows something\nthe live code still uses must be split across two releases, add first and drop\nlater.",[178,1439,1440,1441,1444,1445,289,1448,1451],{},"The migrator records each chain in its own table in the ",[193,1442,1443],{},"drizzle"," schema,\n",[193,1446,1447],{},"__drizzle_migrations",[193,1449,1450],{},"__drizzle_migrations_custom",", and applies a chain's\npending migrations in one transaction. Kit updates bring the template's\nmigrations in files you never edit, so they don't conflict with yours.",[178,1453,1454,1455,1462],{},"Once anyone has applied a migration, leave it alone and write a new one.\n",[231,1456,1459],{"href":1457,"rel":1458,"title":236},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Ftest\u002Funit\u002Fmigration-freshness.test.ts",[235],[193,1460,1461],{},"test\u002Funit\u002Fmigration-freshness.test.ts","\nfails when a schema changed without its generate command, when an app table or\nexport takes a template table's name, and when a chain forks.",[182,1464,1466],{"id":1465},"seed-data","Seed data",[350,1468,1470],{"className":379,"code":1469,"language":381,"meta":355,"style":355},"pnpm db:seed                          # 50 accounts, 5 of them admins\npnpm db:seed --count 200 --admins 12\npnpm db:seed --reset                  # delete every @example.com account first\npnpm db:seed --dry-run                # print the SQL, touch nothing\n",[193,1471,1472,1483,1501,1513],{"__ignoreMap":355},[359,1473,1474,1476,1479],{"class":361,"line":12},[359,1475,404],{"class":395},[359,1477,1478],{"class":372}," db:seed",[359,1480,1482],{"class":1481},"sCsY4","                          # 50 accounts, 5 of them admins\n",[359,1484,1485,1487,1489,1492,1495,1498],{"class":361,"line":17},[359,1486,404],{"class":395},[359,1488,1478],{"class":372},[359,1490,1491],{"class":489}," --count",[359,1493,1494],{"class":489}," 200",[359,1496,1497],{"class":489}," --admins",[359,1499,1500],{"class":489}," 12\n",[359,1502,1503,1505,1507,1510],{"class":361,"line":22},[359,1504,404],{"class":395},[359,1506,1478],{"class":372},[359,1508,1509],{"class":489}," --reset",[359,1511,1512],{"class":1481},"                  # delete every @example.com account first\n",[359,1514,1515,1517,1519,1522],{"class":361,"line":27},[359,1516,404],{"class":395},[359,1518,1478],{"class":372},[359,1520,1521],{"class":489}," --dry-run",[359,1523,1524],{"class":1481},"                # print the SQL, touch nothing\n",[178,1526,1527,1530,1531,1534,1535,1538,1539,854,1542,1545,1546,1549],{},[193,1528,1529],{},"admin@example.com"," (superadmin), ",[193,1532,1533],{},"author@example.com"," (staff) and\n",[193,1536,1537],{},"user@example.com"," come first. Every account shares the password\n",[193,1540,1541],{},"seed-password-123",[193,1543,1544],{},"--password"," changes it) and owns an organization, as a\nsignup would. Accounts are upserted by address, so a rerun updates them in\nplace without signing anyone out. ",[193,1547,1548],{},"pnpm db:seed:purchases"," adds purchases for\nthe recent-purchase feed.",[178,1551,1552,1553,1555,1556,1559,1560,1563,1564,1567],{},"Both seeds write only to a database on your machine. They refuse a\n",[193,1554,226],{}," whose host is anything but ",[193,1557,1558],{},"localhost",", a ",[193,1561,1562],{},"127.x"," address, ",[193,1565,1566],{},"::1","\nor a Unix socket.",[182,1569,1571],{"id":1570},"production-database","Production database",[178,1573,1574],{},"Any Postgres provider Hyperdrive can reach works. The first deploy is where a\nmissing piece shows up:",[740,1576,1577,1584,1587,1598,1601,1609,1616],{},[190,1578,1579,1580,1583],{},"Create the Hyperdrive with ",[193,1581,1582],{},"--caching-disabled",". A cached read can miss a\nwrite made a moment before it, so a revoked session would still sign in. The\ndeploy stops while caching is on.",[190,1585,1586],{},"Give Hyperdrive the database's direct connection string, not the provider's\npooler.",[190,1588,1589,1590,1593,1594,1597],{},"The first migration runs ",[193,1591,1592],{},"CREATE EXTENSION IF NOT EXISTS pg_trgm",", so the\nprovider must offer it and the role needs ",[193,1595,1596],{},"CREATE"," on the database (Postgres\n13 or later).",[190,1599,1600],{},"The deploy migrates from a GitHub-hosted runner, which connects over public\nIPv4 only. Supabase's direct connection is IPv6-only without its IPv4 add-on.",[190,1602,1603,1604,275,1606,212],{},"The migration checks the server certificate. For one no public authority\nsigned, name its CA in ",[193,1605,226],{},[193,1607,1608],{},"sslrootcert",[190,1610,1611,1612,1615],{},"Leave room in ",[193,1613,1614],{},"max_connections"," for Hyperdrive's pool, a migration and\nStudio. On Workers Free, Hyperdrive also stops at 100,000 queries a day.",[190,1617,1618],{},"The kit takes no backups. Turn on point-in-time recovery at the provider.",[178,1620,1621,1624,1625,1074,1627,1629,1630,212],{},[193,1622,1623],{},"pnpm db:studio:remote"," opens Drizzle Studio on production, reading\n",[193,1626,226],{},[193,1628,1420],{}," or the shell and never from ",[193,1631,319],{},[182,1633,20],{"id":1634},"configuration",[670,1636,1637,1652],{},[1358,1638,1639],{},[1361,1640,1641,1644,1647,1650],{},[1364,1642,1643],{},"Key or variable",[1364,1645,1646],{},"Where",[1364,1648,1649],{},"Default",[1364,1651,1369],{},[1371,1653,1654,1673,1689,1706,1727,1748],{},[1361,1655,1656,1660,1664,1667],{},[1376,1657,1658],{},[193,1659,226],{},[1376,1661,1662],{},[193,1663,319],{},[1376,1665,1666],{},"unset, PGlite",[1376,1668,1669,1670,1672],{},"The local database for ",[193,1671,222],{},", migrations, seeds and Studio",[1361,1674,1675,1679,1683,1686],{},[1376,1676,1677],{},[193,1678,315],{},[1376,1680,1681],{},[193,1682,319],{},[1376,1684,1685],{},"unset, 5432 to 5441",[1376,1687,1688],{},"The port PGlite serves on, and the dev server stops if it is taken",[1361,1690,1691,1695,1700,1703],{},[1376,1692,1693],{},[193,1694,226],{},[1376,1696,1697,1699],{},[193,1698,1420],{},", GitHub secret",[1376,1701,1702],{},"none",[1376,1704,1705],{},"The production database's direct URL, for migrations and remote Studio",[1361,1707,1708,1712,1717,1721],{},[1376,1709,1710],{},[193,1711,365],{},[1376,1713,1714,1716],{},[193,1715,319],{}," or shell",[1376,1718,1719],{},[193,1720,413],{},[1376,1722,1723,1724,1726],{},"The Postgres ",[193,1725,337],{}," uses",[1361,1728,1729,1737,1742,1745],{},[1376,1730,1731,1734,1735],{},[193,1732,1733],{},"hyperdrive"," binding ",[193,1736,218],{},[1376,1738,1739],{},[193,1740,1741],{},"wrangler.jsonc",[1376,1743,1744],{},"all-zeros placeholder id",[1376,1746,1747],{},"The database the Worker queries",[1361,1749,1750,1754,1758,1762],{},[1376,1751,1752],{},[193,1753,413],{},[1376,1755,1756],{},[193,1757,1741],{},[1376,1759,1760],{},[193,1761,274],{},[1376,1763,1764,1765],{},"The fallback for ",[193,1766,337],{},[182,1768,1770],{"id":1769},"good-to-know","Good to know",[740,1772,1773,1782,1787,1798,1825,1836],{},[190,1774,1775,1776,1778,1779,1781],{},"Inside a transaction callback, query through ",[193,1777,1172],{},", never ",[193,1780,195],{},".\nOn the Worker that query runs on another connection, outside the transaction,\nand in tests it waits on the open transaction forever.",[190,1783,1784,1785,425],{},"The request's pool closes after the response, so nothing can query through\nits event afterwards. Move work that outlives the response to a job\n(",[231,1786,76],{"href":75},[190,1788,1789,1790,1793,1794,1797],{},"In a correlated subquery, write ",[193,1791,1792],{},"${tables.organizations}.id"," and alias the\ninner table. Without a join, Drizzle writes select-list columns unqualified,\nand ",[193,1795,1796],{},"\"id\""," inside the subquery binds to the inner table.",[190,1799,1800,1801,1033,1804,1807,1808,1815,1816,204,1818,289,1821,1824],{},"Give every column that names a user a foreign key with ",[193,1802,1803],{},"cascade",[193,1805,1806],{},"set null",", or account deletion leaves it behind.\n",[231,1809,1812],{"href":1810,"rel":1811,"title":236},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Ftest\u002Funit\u002Fschema-cascades.test.ts",[235],[193,1813,1814],{},"test\u002Funit\u002Fschema-cascades.test.ts","\nchecks columns named ",[193,1817,751],{},[193,1819,1820],{},"subject_user_id",[193,1822,1823],{},"actor_user_id"," in both\nschemas. A column with any other name goes unchecked.",[190,1826,1827,1828,1831,1832,1835],{},"Hyperdrive shares connections between requests, so anything that keeps state\non one connection, such as ",[193,1829,1830],{},"LISTEN","\u002F",[193,1833,1834],{},"NOTIFY"," or session-level advisory locks,\ndoesn't work through it.",[190,1837,1838,1839,1842],{},"A statement Hyperdrive couldn't send to the database, for example while a\nNeon compute wakes from scale-to-zero, goes again, up to three attempts, and\nso does a transaction's ",[193,1840,1841],{},"begin",". Nothing Postgres itself refused is resent.",[1844,1845,1846],"style",{},"html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":355,"searchDepth":17,"depth":17,"links":1848},[1849,1850,1851,1852,1853,1854,1855,1856,1857,1858],{"id":184,"depth":17,"text":185},{"id":261,"depth":17,"text":262},{"id":428,"depth":17,"text":429},{"id":809,"depth":17,"text":810},{"id":1091,"depth":17,"text":1092},{"id":1353,"depth":17,"text":1354},{"id":1465,"depth":17,"text":1466},{"id":1570,"depth":17,"text":1571},{"id":1634,"depth":17,"text":20},{"id":1769,"depth":17,"text":1770},[1860,1861],{"path":62,"title":59,"description":63,"navTitle":59,"group":59,"order":64},{"path":75,"title":76,"description":77,"navTitle":76,"group":67,"order":78}]